From af1518fbdd52dd16b1beb7b9e516be0b06085099 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 17 Jul 2024 16:48:45 +0900 Subject: [PATCH 001/307] =?UTF-8?q?chore:=20prettier=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 3 +- .prettierrc | 12 + package-lock.json | 4797 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 7 +- 4 files changed, 4816 insertions(+), 3 deletions(-) create mode 100644 .prettierrc create mode 100644 package-lock.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d6c95379..4ef258e0 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -5,6 +5,7 @@ module.exports = { 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', + 'plugin:prettier/recommended', ], ignorePatterns: ['dist', '.eslintrc.cjs'], parser: '@typescript-eslint/parser', @@ -15,4 +16,4 @@ module.exports = { { allowConstantExport: true }, ], }, -} +}; diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..48615d1b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "semi": true, + "singleQuote": true, + "arrowParens": "always", + "bracketSameLine": false, + "endOfLine": "lf", + "jsxSingleQuote": true, + "printWidth": 80, + "bracketSpacing": true, + "tabWidth": 2, + "quoteProps": "as-needed" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3d789d5f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4797 @@ +{ + "name": "react-payments-custom", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-payments-custom", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^15.0.7", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "@vitest/coverage-v8": "^2.0.3", + "@vitest/ui": "^2.0.3", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "jsdom": "^24.1.0", + "prettier": "^3.3.3", + "typescript": "^5.2.2", + "vite": "^5.3.4", + "vitest": "^2.0.2" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz", + "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.6.13", + "@swc/core-darwin-x64": "1.6.13", + "@swc/core-linux-arm-gnueabihf": "1.6.13", + "@swc/core-linux-arm64-gnu": "1.6.13", + "@swc/core-linux-arm64-musl": "1.6.13", + "@swc/core-linux-x64-gnu": "1.6.13", + "@swc/core-linux-x64-musl": "1.6.13", + "@swc/core-win32-arm64-msvc": "1.6.13", + "@swc/core-win32-ia32-msvc": "1.6.13", + "@swc/core-win32-x64-msvc": "1.6.13" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz", + "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz", + "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz", + "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz", + "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz", + "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz", + "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz", + "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz", + "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz", + "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz", + "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.2.tgz", + "integrity": "sha512-0bxIdP9mmPiOJ6wHLj8bdJRq+51oddObeCGdEf6PNEhYd93ZYAN+lPRnEOVFtheVwDM7+p+tza3LAQgp0PTudg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz", + "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@testing-library/react": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", + "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/type-utils": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", + "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", + "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", + "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", + "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", + "dev": true, + "dependencies": { + "@swc/core": "^1.5.7" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.3.tgz", + "integrity": "sha512-53d+6jXFdYbasXBmsL6qaGIfcY5eBQq0sP57AjdasOcSiGNj4qxkkpDKIitUNfjxcfAfUfQ8BD0OR2fSey64+g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.5", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.10", + "magicast": "^0.3.4", + "std-env": "^3.7.0", + "strip-literal": "^2.1.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.3" + } + }, + "node_modules/@vitest/expect": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.3.tgz", + "integrity": "sha512-X6AepoOYePM0lDNUPsGXTxgXZAl3EXd0GYe/MZyVE4HzkUqyUVC6S3PrY5mClDJ6/7/7vALLMV3+xD/Ko60Hqg==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.0.3", + "@vitest/utils": "2.0.3", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.3.tgz", + "integrity": "sha512-URM4GLsB2xD37nnTyvf6kfObFafxmycCL8un3OC9gaCs5cti2u+5rJdIflZ2fUJUen4NbvF6jCufwViAFLvz1g==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.3.tgz", + "integrity": "sha512-EmSP4mcjYhAcuBWwqgpjR3FYVeiA4ROzRunqKltWjBfLNs1tnMLtF+qtgd5ClTwkDP6/DGlKJTNa6WxNK0bNYQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.3", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.3.tgz", + "integrity": "sha512-6OyA6v65Oe3tTzoSuRPcU6kh9m+mPL1vQ2jDlPdn9IQoUxl8rXhBnfICNOC+vwxWY684Vt5UPgtcA2aPFBb6wg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.3", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.3.tgz", + "integrity": "sha512-sfqyAw/ypOXlaj4S+w8689qKM1OyPOqnonqOc9T91DsoHbfN5mU7FdifWWv3MtQFf0lEUstEwR9L/q/M390C+A==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.3.tgz", + "integrity": "sha512-UAkzHk5veR3NRF7BNUxWlLly7Cw7H+wzP3+eiMIVeKo3Md33Ey20rYsNQn/9McIqOeO02tMzqHhpThmjk1yRzw==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.3", + "fast-glob": "^3.3.2", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.3" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.3", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz", + "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", + "dev": true, + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.10", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.17.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/magicast": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dev": true, + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/vite": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.3.tgz", + "integrity": "sha512-14jzwMx7XTcMB+9BhGQyoEAmSl0eOr3nrnn+Z12WNERtOvLN+d2scbRUvyni05rT3997Bg+rZb47NyP4IQPKXg==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.3.tgz", + "integrity": "sha512-o3HRvU93q6qZK4rI2JrhKyZMMuxg/JRt30E6qeQs6ueaiz5hr1cPj+Sk2kATgQzMMqsa2DiNI0TIK++1ULx8Jw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.3", + "@vitest/pretty-format": "^2.0.3", + "@vitest/runner": "2.0.3", + "@vitest/snapshot": "2.0.3", + "@vitest/spy": "2.0.3", + "@vitest/utils": "2.0.3", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.3", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.3", + "@vitest/ui": "2.0.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 04b71273..fa4cc4cf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "main": "index.js", "keywords": [], - "author": "", + "author": "suyeon1218", "license": "ISC", "name": "react-payments-custom", "description": "프로그래머스 수강생과 함께하는 결제모듈 클린코드 미션", @@ -31,11 +31,14 @@ "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^2.0.3", - "@vitest/ui": "^1.6.0", + "@vitest/ui": "^2.0.3", "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", "jsdom": "^24.1.0", + "prettier": "^3.3.3", "typescript": "^5.2.2", "vite": "^5.3.4", "vitest": "^2.0.2" From 66b2b1181415e4bde2795308d738859cf1ccb38c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 17 Jul 2024 16:48:53 +0900 Subject: [PATCH 002/307] =?UTF-8?q?chore:=20npmp=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 3170 ------------------------------------------------ 1 file changed, 3170 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 34a2160e..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,3170 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - devDependencies: - '@testing-library/jest-dom': - specifier: ^6.4.5 - version: 6.4.6(vitest@2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0)) - '@testing-library/react': - specifier: ^15.0.7 - version: 15.0.7(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.3.2) - '@types/react': - specifier: ^18.3.3 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@typescript-eslint/eslint-plugin': - specifier: ^7.15.0 - version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/parser': - specifier: ^7.15.0 - version: 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.7.0(vite@5.3.4) - '@vitest/coverage-v8': - specifier: ^2.0.3 - version: 2.0.3(vitest@2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0)) - '@vitest/ui': - specifier: ^1.6.0 - version: 1.6.0(vitest@2.0.3) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.0) - eslint-plugin-react-refresh: - specifier: ^0.4.7 - version: 0.4.8(eslint@8.57.0) - jsdom: - specifier: ^24.1.0 - version: 24.1.0 - typescript: - specifier: ^5.2.2 - version: 5.5.3 - vite: - specifier: ^5.3.4 - version: 5.3.4 - vitest: - specifier: ^2.0.2 - version: 2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0) - -packages: - - '@adobe/css-tools@4.4.0': - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.8': - resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.24.8': - resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.24.9': - resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - 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.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - - '@rollup/rollup-android-arm-eabi@4.18.1': - resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.18.1': - resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.18.1': - resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.18.1': - resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.18.1': - resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.18.1': - resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.18.1': - resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.18.1': - resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.18.1': - resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.18.1': - resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.18.1': - resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.18.1': - resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.18.1': - resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.18.1': - resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} - cpu: [x64] - os: [win32] - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@swc/core-darwin-arm64@1.6.13': - resolution: {integrity: sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.6.13': - resolution: {integrity: sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.6.13': - resolution: {integrity: sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.6.13': - resolution: {integrity: sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.6.13': - resolution: {integrity: sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.6.13': - resolution: {integrity: sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.6.13': - resolution: {integrity: sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.6.13': - resolution: {integrity: sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.6.13': - resolution: {integrity: sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.6.13': - resolution: {integrity: sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.6.13': - resolution: {integrity: sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '*' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.9': - resolution: {integrity: sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==} - - '@testing-library/dom@10.3.2': - resolution: {integrity: sha512-0bxIdP9mmPiOJ6wHLj8bdJRq+51oddObeCGdEf6PNEhYd93ZYAN+lPRnEOVFtheVwDM7+p+tza3LAQgp0PTudg==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.4.6': - resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - - '@testing-library/react@15.0.7': - resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - - '@typescript-eslint/eslint-plugin@7.16.1': - resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.16.1': - resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.16.1': - resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.16.1': - resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.16.1': - resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.16.1': - resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.16.1': - resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.16.1': - resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@vitejs/plugin-react-swc@3.7.0': - resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} - peerDependencies: - vite: ^4 || ^5 - - '@vitest/coverage-v8@2.0.3': - resolution: {integrity: sha512-53d+6jXFdYbasXBmsL6qaGIfcY5eBQq0sP57AjdasOcSiGNj4qxkkpDKIitUNfjxcfAfUfQ8BD0OR2fSey64+g==} - peerDependencies: - vitest: 2.0.3 - - '@vitest/expect@2.0.3': - resolution: {integrity: sha512-X6AepoOYePM0lDNUPsGXTxgXZAl3EXd0GYe/MZyVE4HzkUqyUVC6S3PrY5mClDJ6/7/7vALLMV3+xD/Ko60Hqg==} - - '@vitest/pretty-format@2.0.3': - resolution: {integrity: sha512-URM4GLsB2xD37nnTyvf6kfObFafxmycCL8un3OC9gaCs5cti2u+5rJdIflZ2fUJUen4NbvF6jCufwViAFLvz1g==} - - '@vitest/runner@2.0.3': - resolution: {integrity: sha512-EmSP4mcjYhAcuBWwqgpjR3FYVeiA4ROzRunqKltWjBfLNs1tnMLtF+qtgd5ClTwkDP6/DGlKJTNa6WxNK0bNYQ==} - - '@vitest/snapshot@2.0.3': - resolution: {integrity: sha512-6OyA6v65Oe3tTzoSuRPcU6kh9m+mPL1vQ2jDlPdn9IQoUxl8rXhBnfICNOC+vwxWY684Vt5UPgtcA2aPFBb6wg==} - - '@vitest/spy@2.0.3': - resolution: {integrity: sha512-sfqyAw/ypOXlaj4S+w8689qKM1OyPOqnonqOc9T91DsoHbfN5mU7FdifWWv3MtQFf0lEUstEwR9L/q/M390C+A==} - - '@vitest/ui@1.6.0': - resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} - peerDependencies: - vitest: 1.6.0 - - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - - '@vitest/utils@2.0.3': - resolution: {integrity: sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-refresh@0.4.8: - resolution: {integrity: sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==} - peerDependencies: - eslint: '>=7' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - 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@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - 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'} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsdom@24.1.0: - resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: 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==} - - 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'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} - - 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'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - 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'} - - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rollup@4.18.1: - resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - 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'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} - engines: {node: '>=14.0.0'} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - vite-node@2.0.3: - resolution: {integrity: sha512-14jzwMx7XTcMB+9BhGQyoEAmSl0eOr3nrnn+Z12WNERtOvLN+d2scbRUvyni05rT3997Bg+rZb47NyP4IQPKXg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.3.4: - resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - vitest@2.0.3: - resolution: {integrity: sha512-o3HRvU93q6qZK4rI2JrhKyZMMuxg/JRt30E6qeQs6ueaiz5hr1cPj+Sk2kATgQzMMqsa2DiNI0TIK++1ULx8Jw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.3 - '@vitest/ui': 2.0.3 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@adobe/css-tools@4.4.0': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - '@babel/parser@7.24.8': - dependencies: - '@babel/types': 7.24.9 - - '@babel/runtime@7.24.8': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/types@7.24.9': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@bcoe/v8-coverage@0.2.3': {} - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.11.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@polka/url@1.0.0-next.25': {} - - '@rollup/rollup-android-arm-eabi@4.18.1': - optional: true - - '@rollup/rollup-android-arm64@4.18.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.18.1': - optional: true - - '@rollup/rollup-darwin-x64@4.18.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.18.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.18.1': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.18.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.18.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.18.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.18.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.18.1': - optional: true - - '@sinclair/typebox@0.27.8': {} - - '@swc/core-darwin-arm64@1.6.13': - optional: true - - '@swc/core-darwin-x64@1.6.13': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.6.13': - optional: true - - '@swc/core-linux-arm64-gnu@1.6.13': - optional: true - - '@swc/core-linux-arm64-musl@1.6.13': - optional: true - - '@swc/core-linux-x64-gnu@1.6.13': - optional: true - - '@swc/core-linux-x64-musl@1.6.13': - optional: true - - '@swc/core-win32-arm64-msvc@1.6.13': - optional: true - - '@swc/core-win32-ia32-msvc@1.6.13': - optional: true - - '@swc/core-win32-x64-msvc@1.6.13': - optional: true - - '@swc/core@1.6.13': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.9 - optionalDependencies: - '@swc/core-darwin-arm64': 1.6.13 - '@swc/core-darwin-x64': 1.6.13 - '@swc/core-linux-arm-gnueabihf': 1.6.13 - '@swc/core-linux-arm64-gnu': 1.6.13 - '@swc/core-linux-arm64-musl': 1.6.13 - '@swc/core-linux-x64-gnu': 1.6.13 - '@swc/core-linux-x64-musl': 1.6.13 - '@swc/core-win32-arm64-msvc': 1.6.13 - '@swc/core-win32-ia32-msvc': 1.6.13 - '@swc/core-win32-x64-msvc': 1.6.13 - - '@swc/counter@0.1.3': {} - - '@swc/types@0.1.9': - dependencies: - '@swc/counter': 0.1.3 - - '@testing-library/dom@10.3.2': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.24.8 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@6.4.6(vitest@2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0))': - dependencies: - '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.24.8 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - optionalDependencies: - vitest: 2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0) - - '@testing-library/react@15.0.7(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.8 - '@testing-library/dom': 10.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.3 - - '@testing-library/user-event@14.5.2(@testing-library/dom@10.3.2)': - dependencies: - '@testing-library/dom': 10.3.2 - - '@types/aria-query@5.0.4': {} - - '@types/estree@1.0.5': {} - - '@types/prop-types@15.7.12': {} - - '@types/react-dom@18.3.0': - dependencies: - '@types/react': 18.3.3 - - '@types/react@18.3.3': - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - - '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.5 - eslint: 8.57.0 - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@7.16.1': - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - - '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@7.16.1': {} - - '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3)': - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.16.1': - dependencies: - '@typescript-eslint/types': 7.16.1 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - '@vitejs/plugin-react-swc@3.7.0(vite@5.3.4)': - dependencies: - '@swc/core': 1.6.13 - vite: 5.3.4 - transitivePeerDependencies: - - '@swc/helpers' - - '@vitest/coverage-v8@2.0.3(vitest@2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.5 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.10 - magicast: 0.3.4 - std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 7.0.1 - tinyrainbow: 1.2.0 - vitest: 2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@2.0.3': - dependencies: - '@vitest/spy': 2.0.3 - '@vitest/utils': 2.0.3 - chai: 5.1.1 - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.0.3': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/runner@2.0.3': - dependencies: - '@vitest/utils': 2.0.3 - pathe: 1.1.2 - - '@vitest/snapshot@2.0.3': - dependencies: - '@vitest/pretty-format': 2.0.3 - magic-string: 0.30.10 - pathe: 1.1.2 - - '@vitest/spy@2.0.3': - dependencies: - tinyspy: 3.0.0 - - '@vitest/ui@1.6.0(vitest@2.0.3)': - dependencies: - '@vitest/utils': 1.6.0 - fast-glob: 3.3.2 - fflate: 0.8.2 - flatted: 3.3.1 - pathe: 1.1.2 - picocolors: 1.0.1 - sirv: 2.0.4 - vitest: 2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0) - - '@vitest/utils@1.6.0': - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - - '@vitest/utils@2.0.3': - dependencies: - '@vitest/pretty-format': 2.0.3 - estree-walker: 3.0.3 - loupe: 3.1.1 - tinyrainbow: 1.2.0 - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - agent-base@7.1.1: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - ajv@6.12.6: - 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 - - ansi-regex@5.0.1: {} - - ansi-regex@6.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - argparse@2.0.1: {} - - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-union@2.1.0: {} - - assertion-error@2.0.1: {} - - asynckit@0.4.0: {} - - balanced-match@1.0.2: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - cac@6.7.14: {} - - callsites@3.1.0: {} - - chai@5.1.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.1 - pathval: 2.0.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - check-error@2.1.1: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - concat-map@0.0.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css.escape@1.5.1: {} - - cssstyle@4.0.1: - dependencies: - rrweb-cssom: 0.6.0 - - csstype@3.1.3: {} - - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - - debug@4.3.5: - dependencies: - ms: 2.1.2 - - decimal.js@10.4.3: {} - - deep-eql@5.0.2: {} - - deep-is@0.1.4: {} - - delayed-stream@1.0.0: {} - - dequal@2.0.3: {} - - diff-sequences@29.6.3: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-accessibility-api@0.5.16: {} - - dom-accessibility-api@0.6.3: {} - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - entities@4.5.0: {} - - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-react-refresh@0.4.8(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.5 - - esutils@2.0.3: {} - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - fflate@0.8.2: {} - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.1: {} - - foreground-child@3.2.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-func-name@2.0.2: {} - - get-stream@8.0.1: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.5: - dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.0 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - - graphemer@1.4.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - - html-escaper@2.0.2: {} - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - human-signals@5.0.0: {} - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.1: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-potential-custom-element-name@1.0.1: {} - - is-stream@3.0.0: {} - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.5 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - js-tokens@4.0.0: {} - - js-tokens@9.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsdom@24.1.0: - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - 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 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - lodash@4.17.21: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.4.3: {} - - lz-string@1.5.0: {} - - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magicast@0.3.4: - dependencies: - '@babel/parser': 7.24.8 - '@babel/types': 7.24.9 - source-map-js: 1.2.0 - - make-dir@4.0.0: - dependencies: - semver: 7.6.3 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.7: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@4.0.0: {} - - min-indent@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minipass@7.1.2: {} - - mrmime@2.0.0: {} - - ms@2.1.2: {} - - nanoid@3.3.7: {} - - natural-compare@1.4.0: {} - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - nwsapi@2.2.12: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - 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 - - package-json-from-dist@1.0.0: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-type@4.0.0: {} - - pathe@1.1.2: {} - - pathval@2.0.0: {} - - picocolors@1.0.1: {} - - picomatch@2.3.1: {} - - postcss@8.4.39: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - - prelude-ls@1.2.1: {} - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - psl@1.9.0: {} - - punycode@2.3.1: {} - - querystringify@2.2.0: {} - - queue-microtask@1.2.3: {} - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-is@17.0.2: {} - - react-is@18.3.1: {} - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - regenerator-runtime@0.14.1: {} - - requires-port@1.0.0: {} - - resolve-from@4.0.0: {} - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rollup@4.18.1: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.1 - '@rollup/rollup-android-arm64': 4.18.1 - '@rollup/rollup-darwin-arm64': 4.18.1 - '@rollup/rollup-darwin-x64': 4.18.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 - '@rollup/rollup-linux-arm-musleabihf': 4.18.1 - '@rollup/rollup-linux-arm64-gnu': 4.18.1 - '@rollup/rollup-linux-arm64-musl': 4.18.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 - '@rollup/rollup-linux-riscv64-gnu': 4.18.1 - '@rollup/rollup-linux-s390x-gnu': 4.18.1 - '@rollup/rollup-linux-x64-gnu': 4.18.1 - '@rollup/rollup-linux-x64-musl': 4.18.1 - '@rollup/rollup-win32-arm64-msvc': 4.18.1 - '@rollup/rollup-win32-ia32-msvc': 4.18.1 - '@rollup/rollup-win32-x64-msvc': 4.18.1 - fsevents: 2.3.3 - - rrweb-cssom@0.6.0: {} - - rrweb-cssom@0.7.1: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - semver@7.6.3: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - siginfo@2.0.0: {} - - signal-exit@4.1.0: {} - - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 - totalist: 3.0.1 - - slash@3.0.0: {} - - source-map-js@1.2.0: {} - - stackback@0.0.2: {} - - std-env@3.7.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - - strip-final-newline@3.0.0: {} - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} - - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - symbol-tree@3.2.4: {} - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - - text-table@0.2.0: {} - - tinybench@2.8.0: {} - - tinypool@1.0.0: {} - - tinyrainbow@1.2.0: {} - - tinyspy@3.0.0: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - totalist@3.0.1: {} - - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - - ts-api-utils@1.3.0(typescript@5.5.3): - dependencies: - typescript: 5.5.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typescript@5.5.3: {} - - universalify@0.2.0: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - vite-node@2.0.3: - dependencies: - cac: 6.7.14 - debug: 4.3.5 - pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.3.4 - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite@5.3.4: - dependencies: - esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.18.1 - optionalDependencies: - fsevents: 2.3.3 - - vitest@2.0.3(@vitest/ui@1.6.0)(jsdom@24.1.0): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.3 - '@vitest/pretty-format': 2.0.3 - '@vitest/runner': 2.0.3 - '@vitest/snapshot': 2.0.3 - '@vitest/spy': 2.0.3 - '@vitest/utils': 2.0.3 - chai: 5.1.1 - debug: 4.3.5 - execa: 8.0.1 - magic-string: 0.30.10 - pathe: 1.1.2 - std-env: 3.7.0 - tinybench: 2.8.0 - tinypool: 1.0.0 - tinyrainbow: 1.2.0 - vite: 5.3.4 - vite-node: 2.0.3 - why-is-node-running: 2.3.0 - optionalDependencies: - '@vitest/ui': 1.6.0(vitest@2.0.3) - jsdom: 24.1.0 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - webidl-conversions@7.0.0: {} - - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - ws@8.18.0: {} - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - - yocto-queue@0.1.0: {} From 89362355b3af5f6272c73237e004178655b512bd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 17 Jul 2024 16:50:17 +0900 Subject: [PATCH 003/307] =?UTF-8?q?chore:=20prettier=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 410 ++++++++++++++++++------------------- src/__tests__/App.test.tsx | 12 +- src/__tests__/sum.test.ts | 10 +- src/main.tsx | 16 +- src/styles/index.css | 10 +- tsconfig.app.json | 6 +- tsconfig.node.json | 4 +- vite.config.ts | 8 +- 8 files changed, 234 insertions(+), 242 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index dc22ffb2..de047b7c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,166 +3,162 @@ function App() { <>

React Clean Code Payments CSS example

1️⃣ 카드 추가

-
-
-

- 카드 추가 -

-
-
-
-
-
+
+
+

카드 추가

+
+
+
+
+
-
-
- NAME - MM / YY +
+
+ NAME + MM / YY
-
- 카드 번호 -
- - - - +
+ 카드 번호 +
+ + + +
-
- 만료일 -
- - +
+ 만료일 +
+ +
-
- 카드 소유자 이름(선택) +
+ 카드 소유자 이름(선택)
-
- 보안코드(CVC/CVV) - +
+ 보안코드(CVC/CVV) +
-
- 카드 비밀번호 - - - - +
+ 카드 비밀번호 + + + +
-
- 다음 +
+ 다음

2️⃣ 카드 추가 - 카드사 선택

-
-
-

- 카드 추가 -

-
-
-
- 클린카드 +
+
+

카드 추가

+
+
+
+ 클린카드
-
-
+
+
-
-
- 1111 - 2222 - oooo - oooo +
+
+ 1111 - 2222 - oooo - oooo
-
- NAME - MM / YY +
+ NAME + MM / YY
-
- 카드 번호 -
- - - - +
+ 카드 번호 +
+ + + +
-
- 만료일 -
- - +
+ 만료일 +
+ +
-
- 카드 소유자 이름(선택) +
+ 카드 소유자 이름(선택)
-
- 보안코드(CVC/CVV) - +
+ 보안코드(CVC/CVV) +
-
- 카드 비밀번호 - - - - +
+ 카드 비밀번호 + + + +
-
- 다음 +
+ 다음
-
-
-
-
-
- 클린 카드 +
+
+
+
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
-
-
-
- 클린 카드 +
+
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
-
-
- 클린 카드 +
+
+ 클린 카드
@@ -170,148 +166,148 @@ function App() {

3️⃣ 카드 추가 - 입력 완료

-
-
-

- 카드 추가 -

-
-
-
- 클린카드 +
+
+

카드 추가

+
+
+
+ 클린카드
-
-
+
+
-
-
- 1111 - 2222 - oooo - oooo +
+
+ 1111 - 2222 - oooo - oooo
-
- 프롱이 - 12 / 23 +
+ 프롱이 + 12 / 23
-
- 카드 번호 -
- - - - +
+ 카드 번호 +
+ + + +
-
- 만료일 -
+
+ 만료일 +
-
- 카드 소유자 이름(선택) - +
+ 카드 소유자 이름(선택) +
-
- 보안코드(CVC/CVV) - +
+ 보안코드(CVC/CVV) +
-
- 카드 비밀번호 - - - - +
+ 카드 비밀번호 + + + +
-
- 다음 +
+ 다음

4️⃣ 카드 추가 완료

-
-
-
-

카드등록이 완료되었습니다.

+
+
+
+

카드등록이 완료되었습니다.

-
-
-
- 클린카드 +
+
+
+ 클린카드
-
-
+
+
-
-
- 1111 - 2222 - oooo - oooo +
+
+ + 1111 - 2222 - oooo - oooo +
-
- 프롱이 - 12 / 23 +
+ 프롱이 + 12 / 23
-
+
-
- 다음 +
+ 다음

5️⃣ 카드 목록

-
-
-
-

보유 카드

+
+
+
+

보유 카드

-
-
-
- 클린카드 +
+
+
+ 클린카드
-
-
+
+
-
-
- 1111 - 2222 - oooo - oooo +
+
+ 1111 - 2222 - oooo - oooo
-
- 프롱이 - 12 / 23 +
+ 프롱이 + 12 / 23
- 법인카드 -
-
+
+ 법인카드 +
+
+
- ) + ); } -export default App +export default App; diff --git a/src/__tests__/App.test.tsx b/src/__tests__/App.test.tsx index b2e242e4..2f26b6fc 100644 --- a/src/__tests__/App.test.tsx +++ b/src/__tests__/App.test.tsx @@ -1,15 +1,15 @@ -import { describe, expect, test } from "vitest"; -import App from "../App.tsx"; -import { render } from "@testing-library/react"; +import { describe, expect, test } from 'vitest'; +import App from '../App.tsx'; +import { render } from '@testing-library/react'; describe('간단한 컴포넌트 테스트', () => { test('App 컴포넌트가 가 렌더링 된다.', () => { - const { getByText } = render() + const { getByText } = render(); expect(getByText('1️⃣ 카드 추가')).toBeInTheDocument(); expect(getByText('2️⃣ 카드 추가 - 카드사 선택')).toBeInTheDocument(); expect(getByText('3️⃣ 카드 추가 - 입력 완료')).toBeInTheDocument(); expect(getByText('4️⃣ 카드 추가 완료')).toBeInTheDocument(); expect(getByText('5️⃣ 카드 목록')).toBeInTheDocument(); - }) -}) + }); +}); diff --git a/src/__tests__/sum.test.ts b/src/__tests__/sum.test.ts index 264beba2..408a4d25 100644 --- a/src/__tests__/sum.test.ts +++ b/src/__tests__/sum.test.ts @@ -1,11 +1,11 @@ -import { describe, test, expect } from "vitest"; +import { describe, test, expect } from 'vitest'; function sum(...args: number[]) { - return args.reduce((a, b) => a+ b); + return args.reduce((a, b) => a + b); } describe('예제 테스트입니다.', () => { test('sum > ', () => { - expect(sum(1,2,3,4,5)).toBe(15); - }) -}) + expect(sum(1, 2, 3, 4, 5)).toBe(15); + }); +}); diff --git a/src/main.tsx b/src/main.tsx index 049d9693..40e6cefb 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,10 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './styles/index.css' +import { createRoot } from 'react-dom/client'; +import { StrictMode } from 'react'; +import App from './App.tsx'; +import './styles/index.css'; -ReactDOM.createRoot(document.getElementById('root')!).render( - +createRoot(document.getElementById('root')!).render( + - , -) + , +); diff --git a/src/styles/index.css b/src/styles/index.css index 783a2e38..135f030f 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -1,8 +1,8 @@ -@import "./card.css"; -@import "./input.css"; -@import "./button.css"; -@import "./modal.css"; -@import "./utils.css"; +@import './card.css'; +@import './input.css'; +@import './button.css'; +@import './modal.css'; +@import './utils.css'; body { display: flex; diff --git a/tsconfig.app.json b/tsconfig.app.json index ab1d7dc4..e53d6167 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -9,7 +9,7 @@ "skipLibCheck": true, /* Bundler mode */ - "moduleResolution": "bundler", + "moduleResolution": "node", "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, @@ -23,7 +23,5 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": [ - "src" - ] + "include": ["src"] } diff --git a/tsconfig.node.json b/tsconfig.node.json index 387a89e7..3afdd6e3 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -9,7 +9,5 @@ "strict": true, "noEmit": true }, - "include": [ - "vite.config.ts" - ] + "include": ["vite.config.ts"] } diff --git a/vite.config.ts b/vite.config.ts index 1cdac555..9387a238 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,9 +12,9 @@ export default mergeConfig( environment: 'jsdom', setupFiles: './src/setupTests.ts', coverage: { - reportsDirectory: "./.coverage", - reporter: ['lcov', 'json', 'json-summary'] + reportsDirectory: './.coverage', + reporter: ['lcov', 'json', 'json-summary'], }, }, - }) -) + }), +); From 13f1bdb8ffb1d535a3cb970ccd83f230b4a8c5d6 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 17 Jul 2024 16:54:44 +0900 Subject: [PATCH 004/307] =?UTF-8?q?chore:=20react-hook-form=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 --- package-lock.json | 18 +++++++++++++++++- package.json | 3 ++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d789d5f..ea2f578f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "ISC", "dependencies": { "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "react-hook-form": "^7.50.1" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.5", @@ -3767,6 +3768,21 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.52.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.1.tgz", + "integrity": "sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index fa4cc4cf..d906404b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ }, "dependencies": { "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "react-hook-form": "^7.50.1" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.5", From 422e6442eb0bf82dc6ef1036d544f53894829eed Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 18 Jul 2024 17:34:18 +0900 Subject: [PATCH 005/307] =?UTF-8?q?chore:=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 --- package-lock.json | 69 ++++++++++++++++++++++++++++++++++++++++++++++- package.json | 4 ++- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea2f578f..5002da3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.50.1" + "react-hook-form": "^7.50.1", + "react-router-dom": "^6.25.1" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.5", @@ -19,6 +20,7 @@ "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react-swc": "^3.5.0", @@ -883,6 +885,14 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, + "node_modules/@remix-run/router": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", + "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", @@ -1436,6 +1446,12 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -1461,6 +1477,27 @@ "@types/react": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", @@ -3789,6 +3826,36 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/react-router": { + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", + "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", + "dependencies": { + "@remix-run/router": "1.18.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", + "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", + "dependencies": { + "@remix-run/router": "1.18.0", + "react-router": "6.25.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", diff --git a/package.json b/package.json index d906404b..90a5920c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.50.1" + "react-hook-form": "^7.50.1", + "react-router-dom": "^6.25.1" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.5", @@ -28,6 +29,7 @@ "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react-swc": "^3.5.0", From 3f1412bd3fd49aec9731c6f340200e185a5a1b6c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 18 Jul 2024 17:43:20 +0900 Subject: [PATCH 006/307] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=8C=85=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 323 ++------------------------------------- src/pages/CardAlias.tsx | 63 ++++++++ src/pages/CardList.tsx | 36 +++++ src/pages/CardRegist.tsx | 74 +++++++++ src/pages/Home.tsx | 5 + src/pages/Payments.tsx | 5 + 6 files changed, 199 insertions(+), 307 deletions(-) create mode 100644 src/pages/CardAlias.tsx create mode 100644 src/pages/CardList.tsx create mode 100644 src/pages/CardRegist.tsx create mode 100644 src/pages/Home.tsx create mode 100644 src/pages/Payments.tsx diff --git a/src/App.tsx b/src/App.tsx index de047b7c..46d3fcd6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,312 +1,21 @@ +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import Home from './pages/Home'; +import Payments from './pages/Payments'; +import CardList from './pages/CardList'; +import CardRegist from './pages/CardRegist'; +import CardAlias from './pages/CardAlias'; + function App() { return ( - <> -

React Clean Code Payments CSS example

-

1️⃣ 카드 추가

-
-
-

카드 추가

-
-
-
-
-
-
-
-
- NAME - MM / YY -
-
-
-
-
- 카드 번호 -
- - - - -
-
-
- 만료일 -
- - -
-
-
- 카드 소유자 이름(선택) - -
-
- 보안코드(CVC/CVV) - -
-
- 카드 비밀번호 - - - - -
-
- 다음 -
-
-
- -

2️⃣ 카드 추가 - 카드사 선택

-
-
-

카드 추가

-
-
-
- 클린카드 -
-
-
-
-
-
- 1111 - 2222 - oooo - oooo -
-
- NAME - MM / YY -
-
-
-
-
- 카드 번호 -
- - - - -
-
-
- 만료일 -
- - -
-
-
- 카드 소유자 이름(선택) - -
-
- 보안코드(CVC/CVV) - -
-
- 카드 비밀번호 - - - - -
-
- 다음 -
-
-
-
-
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
- 클린 카드 -
-
-
-
-
- -

3️⃣ 카드 추가 - 입력 완료

-
-
-

카드 추가

-
-
-
- 클린카드 -
-
-
-
-
-
- 1111 - 2222 - oooo - oooo -
-
- 프롱이 - 12 / 23 -
-
-
-
-
- 카드 번호 -
- - - - -
-
-
- 만료일 -
- - -
-
-
- 카드 소유자 이름(선택) - -
-
- 보안코드(CVC/CVV) - -
-
- 카드 비밀번호 - - - - -
-
- 다음 -
-
-
- -

4️⃣ 카드 추가 완료

-
-
-
-

카드등록이 완료되었습니다.

-
-
-
-
- 클린카드 -
-
-
-
-
-
- - 1111 - 2222 - oooo - oooo - -
-
- 프롱이 - 12 / 23 -
-
-
-
-
- -
-
- 다음 -
-
-
- -

5️⃣ 카드 목록

-
-
-
-

보유 카드

-
-
-
-
- 클린카드 -
-
-
-
-
-
- 1111 - 2222 - oooo - oooo -
-
- 프롱이 - 12 / 23 -
-
-
-
- 법인카드 -
-
+
-
-
-
- + + + } /> + } /> + } /> + } /> + } /> + + ); } diff --git a/src/pages/CardAlias.tsx b/src/pages/CardAlias.tsx new file mode 100644 index 00000000..9940b011 --- /dev/null +++ b/src/pages/CardAlias.tsx @@ -0,0 +1,63 @@ +const CardAlias = () => { + return ( +
+
+

카드 추가

+
+
+
+
+
+
+
+
+ NAME + MM / YY +
+
+
+
+
+ 카드 번호 +
+ + + + +
+
+
+ 만료일 +
+ + +
+
+
+ 카드 소유자 이름(선택) + +
+
+ 보안코드(CVC/CVV) + +
+
+ 카드 비밀번호 + + + + +
+
+ 다음 +
+
+
+ ); +}; + +export default CardAlias; diff --git a/src/pages/CardList.tsx b/src/pages/CardList.tsx new file mode 100644 index 00000000..cdfae0ab --- /dev/null +++ b/src/pages/CardList.tsx @@ -0,0 +1,36 @@ +const CardList = () => { + return ( +
+
+
+

보유 카드

+
+
+
+
+ 클린카드 +
+
+
+
+
+
+ 1111 - 2222 - oooo - oooo +
+
+ 프롱이 + 12 / 23 +
+
+
+
+ 법인카드 +
+
+
+
+
+
+ ); +}; + +export default CardList; diff --git a/src/pages/CardRegist.tsx b/src/pages/CardRegist.tsx new file mode 100644 index 00000000..08803fa1 --- /dev/null +++ b/src/pages/CardRegist.tsx @@ -0,0 +1,74 @@ +const CardRegist = () => { + return ( +
+
+

카드 추가

+
+
+
+ 클린카드 +
+
+
+
+
+
+ 1111 - 2222 - oooo - oooo +
+
+ 프롱이 + 12 / 23 +
+
+
+
+
+ 카드 번호 +
+ + + + +
+
+
+ 만료일 +
+ + +
+
+
+ 카드 소유자 이름(선택) + +
+
+ 보안코드(CVC/CVV) + +
+
+ 카드 비밀번호 + + + + +
+
+ 다음 +
+
+
+ ); +}; + +export default CardRegist; diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 00000000..5b19e64a --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,5 @@ +const Home = () => { + return <>; +}; + +export default Home; diff --git a/src/pages/Payments.tsx b/src/pages/Payments.tsx new file mode 100644 index 00000000..bf898677 --- /dev/null +++ b/src/pages/Payments.tsx @@ -0,0 +1,5 @@ +const Payments = () => { + return <>; +}; + +export default Payments; From abcb0b3d9f90e2948c828218d21e4f7a1c621b8e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:12:51 +0900 Subject: [PATCH 007/307] =?UTF-8?q?feat:=20Home=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Button.tsx | 18 ++++++++++++++++++ src/pages/Home.tsx | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/components/Button.tsx diff --git a/src/components/Button.tsx b/src/components/Button.tsx new file mode 100644 index 00000000..dae4effd --- /dev/null +++ b/src/components/Button.tsx @@ -0,0 +1,18 @@ +interface ButtonProps { + onClick?: (...props: any[]) => void; + label?: string; +} + +const Button = ({ onClick, label }: ButtonProps) => { + const handleClickButton = () => { + onClick && onClick(); + }; + + return ( + + ); +}; + +export default Button; diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 5b19e64a..baea6bda 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,5 +1,19 @@ +import Button from '../components/Button'; +import { useNavigate } from 'react-router-dom'; + const Home = () => { - return <>; + const navigate = useNavigate(); + + return ( +
+
+ ); }; export default Home; From a70bb72f21c3926bb3baf918ed66b6855bb8a6f3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:13:09 +0900 Subject: [PATCH 008/307] =?UTF-8?q?chore:=20Home=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 46d3fcd6..a0de4582 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,7 +9,7 @@ function App() { return ( - } /> + } /> } /> } /> } /> From cd0fd2f14287b422f7d2450a974c2619efdb38cb Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:21:11 +0900 Subject: [PATCH 009/307] =?UTF-8?q?refactoring:=20Router=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 20 +++++--------------- src/router/router.tsx | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 src/router/router.tsx diff --git a/src/App.tsx b/src/App.tsx index a0de4582..e9dfb5a9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,21 +1,11 @@ -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; -import Home from './pages/Home'; -import Payments from './pages/Payments'; -import CardList from './pages/CardList'; -import CardRegist from './pages/CardRegist'; -import CardAlias from './pages/CardAlias'; +import router from './router/router'; +import { RouterProvider } from 'react-router-dom'; function App() { return ( - - - } /> - } /> - } /> - } /> - } /> - - + <> + + ); } diff --git a/src/router/router.tsx b/src/router/router.tsx new file mode 100644 index 00000000..463b5f59 --- /dev/null +++ b/src/router/router.tsx @@ -0,0 +1,21 @@ +import { createBrowserRouter } from 'react-router-dom'; +import Home from '../pages/Home'; +import Payments from '../pages/Payments'; +import CardList from '../pages/CardList'; +import CardRegist from '../pages/CardRegist'; +import CardAlias from '../pages/CardAlias'; + +const router = createBrowserRouter([ + { + element: , + path: '/', + children: [ + { element: , path: '/payments' }, + { element: , path: '/card-list' }, + { element: , path: '/card-regist' }, + { element: , path: '/card-alias' }, + ], + }, +]); + +export default router; From e9f722ee5b619f67ea430158e96f0be5bc3284fe Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:42:19 +0900 Subject: [PATCH 010/307] =?UTF-8?q?chore:=20Emotion=20=ED=94=84=EB=A0=88?= =?UTF-8?q?=EC=9E=84=EC=9B=8C=ED=81=AC=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 498 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 + 2 files changed, 501 insertions(+) diff --git a/package-lock.json b/package-lock.json index 5002da3d..36960184 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,9 @@ "react-router-dom": "^6.25.1" }, "devDependencies": { + "@emotion/eslint-plugin": "^11.11.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", @@ -70,6 +73,83 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/generator": { + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -198,6 +278,50 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.24.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", @@ -218,6 +342,164 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/eslint-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/eslint-plugin/-/eslint-plugin-11.11.0.tgz", + "integrity": "sha512-jCOYqU/0Sqm+g+6D7QuIlG99q8YAF0T7BP98zQF/MPZKfbcm46z5mizXn0YlhZ9AYZfNtZ1DeODXdncYxZzR4Q==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": "6 || 7 || 8" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "dev": true + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "dev": true + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dev": true, + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", + "dev": true + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "dev": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", + "dev": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "dev": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -1452,6 +1734,12 @@ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -1942,6 +2230,21 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2064,6 +2367,28 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2231,6 +2556,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -2631,6 +2965,12 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2717,6 +3057,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -2843,6 +3192,33 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -2968,6 +3344,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3162,12 +3559,30 @@ } } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3202,6 +3617,12 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3554,6 +3975,24 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -3593,6 +4032,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -3881,6 +4326,23 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4080,6 +4542,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -4245,6 +4716,12 @@ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "dev": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4257,6 +4734,18 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -4864,6 +5353,15 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 90a5920c..c6115cf0 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "react-router-dom": "^6.25.1" }, "devDependencies": { + "@emotion/eslint-plugin": "^11.11.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", From b676874b9d15dc36d81314d63f422d105affb16f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:42:38 +0900 Subject: [PATCH 011/307] =?UTF-8?q?feat:=20ThemeProvider=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 6 +++++- src/styles/color.ts | 3 +++ src/styles/emotion.d.ts | 6 ++++++ src/styles/theme.ts | 8 ++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/styles/color.ts create mode 100644 src/styles/emotion.d.ts create mode 100644 src/styles/theme.ts diff --git a/src/App.tsx b/src/App.tsx index e9dfb5a9..7082fc63 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,14 @@ +import { ThemeProvider } from '@emotion/react'; import router from './router/router'; import { RouterProvider } from 'react-router-dom'; +import theme from './styles/theme'; function App() { return ( <> - + + + ); } diff --git a/src/styles/color.ts b/src/styles/color.ts new file mode 100644 index 00000000..7c9e1b5e --- /dev/null +++ b/src/styles/color.ts @@ -0,0 +1,3 @@ +const color = {}; + +export default color; diff --git a/src/styles/emotion.d.ts b/src/styles/emotion.d.ts new file mode 100644 index 00000000..098a6d42 --- /dev/null +++ b/src/styles/emotion.d.ts @@ -0,0 +1,6 @@ +import '@emotion/react'; +import { Theme as CustomTheme } from './theme'; + +declare module '@emotion/react' { + export interface Theme extends CustomTheme {} +} diff --git a/src/styles/theme.ts b/src/styles/theme.ts new file mode 100644 index 00000000..715b4f12 --- /dev/null +++ b/src/styles/theme.ts @@ -0,0 +1,8 @@ +import { Theme } from '@emotion/react'; +import color from './color'; + +const theme: Theme = { + color, +}; + +export default theme; From 42fca13bdcfd659dbab1a84f63cc5031c2bfc558 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:43:23 +0900 Subject: [PATCH 012/307] =?UTF-8?q?chore:=20=EA=B8=B0=EC=A1=B4=20CSS=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/button.css | 8 --- src/styles/card.css | 136 ------------------------------------------ src/styles/index.css | 42 ------------- src/styles/input.css | 48 --------------- src/styles/modal.css | 53 ---------------- src/styles/utils.css | 56 ----------------- 6 files changed, 343 deletions(-) delete mode 100644 src/styles/button.css delete mode 100644 src/styles/card.css delete mode 100644 src/styles/index.css delete mode 100644 src/styles/input.css delete mode 100644 src/styles/modal.css delete mode 100644 src/styles/utils.css diff --git a/src/styles/button.css b/src/styles/button.css deleted file mode 100644 index 972ce4c3..00000000 --- a/src/styles/button.css +++ /dev/null @@ -1,8 +0,0 @@ -.button-box { - width: 100%; - text-align: right; -} - -.button-text { - margin-right: 10px; -} diff --git a/src/styles/card.css b/src/styles/card.css deleted file mode 100644 index c0e9c0e5..00000000 --- a/src/styles/card.css +++ /dev/null @@ -1,136 +0,0 @@ -.card-box { - display: flex; - align-items: center; - justify-content: center; - - margin: 10px 0; -} - -.empty-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - width: 208px; - height: 130px; - - font-size: 30px; - color: #575757; - - background: #e5e5e5; - box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25); - border-radius: 5px; - - user-select: none; -} - -.small-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - width: 208px; - height: 130px; - - background: #94dacd; - box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25); - border-radius: 5px; -} - -.small-card__chip { - width: 40px; - height: 26px; - left: 95px; - top: 122px; - - background: #cbba64; - border-radius: 4px; -} - -.big-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - width: 290px; - height: 180px; - - background: #94dacd; - box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25); - border-radius: 5px; -} - -.big-card__chip { - width: 55.04px; - height: 35.77px; - - background: #cbba64; - border-radius: 4px; - - font-size: 24px; -} - -.card-top { - width: 100%; - height: 100%; - - display: flex; - align-items: center; -} - -.card-middle { - width: 100%; - height: 100%; - margin-left: 30px; - - display: flex; - align-items: center; -} - -.card-bottom { - width: 100%; - height: 100%; - - display: flex; - flex-direction: column; - align-items: center; -} - -.card-bottom__number { - width: 100%; - height: 100%; - - display: flex; - align-items: center; - justify-content: center; -} - -.card-bottom__info { - width: 100%; - height: 100%; - - display: flex; - align-items: center; - justify-content: space-between; -} - -.card-text { - margin: 0 16px; - - font-size: 14px; - line-height: 16px; - vertical-align: middle; - font-weight: 400; -} - -.card-text__big { - margin: 0 16px; - - font-size: 18px; - line-height: 20px; - vertical-align: middle; - font-weight: 400; -} diff --git a/src/styles/index.css b/src/styles/index.css deleted file mode 100644 index 135f030f..00000000 --- a/src/styles/index.css +++ /dev/null @@ -1,42 +0,0 @@ -@import './card.css'; -@import './input.css'; -@import './button.css'; -@import './modal.css'; -@import './utils.css'; - -body { - display: flex; - flex-direction: column; - gap: 0.5rem; - align-items: center; - justify-content: center; - background-color: #e5e5e5; -} - -input { - font-size: 16px; -} - -.root { - background-color: #fff; - width: 375px; - min-width: 375px; - height: 700px; - position: relative; - border-radius: 15px; -} - -.app { - height: 100%; - padding: 16px 24px; -} - -.page-title { - font-weight: 500; - font-size: 20px; - line-height: 22px; - display: flex; - align-items: center; - - color: #383838; -} diff --git a/src/styles/input.css b/src/styles/input.css deleted file mode 100644 index 74c32037..00000000 --- a/src/styles/input.css +++ /dev/null @@ -1,48 +0,0 @@ -.input-container { - margin: 16px 0; -} - -.input-box { - display: flex; - align-items: center; - margin-top: 0.375rem; - color: #d3d3d3; - border-radius: 0.25rem; - background-color: #ecebf1; -} - -.input-title { - display: flex; - align-items: center; - - font-size: 12px; - line-height: 14px; - - margin-bottom: 4px; - - color: #525252; -} - -.input-basic { - background-color: #ecebf1; - height: 45px; - width: 100%; - text-align: center; - outline: 2px solid transparent; - outline-offset: 2px; - border-color: #9ca3af; - border: none; - border-radius: 0.25rem; -} - -.input-underline { - text-align: center; - border: none; - background: none; - outline: none; - - margin: 16px 0; - padding: 4px 0; - - border-bottom: 1px solid #383838; -} diff --git a/src/styles/modal.css b/src/styles/modal.css deleted file mode 100644 index d86fa3b0..00000000 --- a/src/styles/modal.css +++ /dev/null @@ -1,53 +0,0 @@ -.modal { - width: 375px; - height: 220px; - - border-radius: 5px 5px 15px 15px; - - display: flex; - justify-content: center; - align-items: center; - flex-wrap: wrap; - - background: #fff; - z-index: 10; -} - -.modal-dimmed { - width: 100%; - height: 100%; - - display: flex; - flex-direction: column; - justify-content: flex-end; - - position: absolute; - top: 0; - left: 0; - - background: rgba(0, 0, 0, 0.5); - - border-radius: 15px; - - z-index: 5; -} - -.modal-item-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.modal-item-dot { - margin: 0.5rem 1rem; - border-radius: 50%; - width: 2.8rem; - height: 2.8rem; - background-color: #94dacd; -} - -.modal-item-name { - font-size: 12px; - letter-spacing: -0.085rem; -} diff --git a/src/styles/utils.css b/src/styles/utils.css deleted file mode 100644 index e86f525f..00000000 --- a/src/styles/utils.css +++ /dev/null @@ -1,56 +0,0 @@ -.flex-center { - display: flex; - justify-content: center; - align-items: center; -} - -.flex-column-center { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.mt-10 { - margin-top: 2.5rem; -} - -.mt-20 { - margin-top: 5rem; -} - -.mt-30 { - margin-top: 7.5rem; -} - -.mt-40 { - margin-top: 9rem; -} - -.mt-50 { - margin-top: 11.5rem; -} - -.mb-10 { - margin-bottom: 2.5rem; -} - -.w-100 { - width: 100%; -} - -.w-75 { - width: 75%; -} - -.w-50 { - width: 50%; -} - -.w-25 { - width: 25%; -} - -.w-15 { - width: 15%; -} From 1db90abb4e7a7a9a66627949915ed5dc0a6e4e98 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:43:47 +0900 Subject: [PATCH 013/307] =?UTF-8?q?refactoring:=20Home=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/{Home.tsx => Home/index.tsx} | 8 +++++--- src/pages/index.ts | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) rename src/pages/{Home.tsx => Home/index.tsx} (63%) create mode 100644 src/pages/index.ts diff --git a/src/pages/Home.tsx b/src/pages/Home/index.tsx similarity index 63% rename from src/pages/Home.tsx rename to src/pages/Home/index.tsx index baea6bda..3ab622e8 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home/index.tsx @@ -1,5 +1,6 @@ -import Button from '../components/Button'; +import { Button } from '../../components'; import { useNavigate } from 'react-router-dom'; +import './home.css'; const Home = () => { const navigate = useNavigate(); @@ -7,11 +8,12 @@ const Home = () => { return (
); }; diff --git a/src/pages/index.ts b/src/pages/index.ts new file mode 100644 index 00000000..c2d92a57 --- /dev/null +++ b/src/pages/index.ts @@ -0,0 +1 @@ +export { default as Home } from './Home'; From cb1a0d46bd684842f54719259996f4483861ba9b Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:44:07 +0900 Subject: [PATCH 014/307] =?UTF-8?q?refactoring:=20Button=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Button.tsx | 18 ------------------ src/components/Button/index.tsx | 33 +++++++++++++++++++++++++++++++++ src/components/index.ts | 1 + 3 files changed, 34 insertions(+), 18 deletions(-) delete mode 100644 src/components/Button.tsx create mode 100644 src/components/Button/index.tsx create mode 100644 src/components/index.ts diff --git a/src/components/Button.tsx b/src/components/Button.tsx deleted file mode 100644 index dae4effd..00000000 --- a/src/components/Button.tsx +++ /dev/null @@ -1,18 +0,0 @@ -interface ButtonProps { - onClick?: (...props: any[]) => void; - label?: string; -} - -const Button = ({ onClick, label }: ButtonProps) => { - const handleClickButton = () => { - onClick && onClick(); - }; - - return ( - - ); -}; - -export default Button; diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx new file mode 100644 index 00000000..327f25cd --- /dev/null +++ b/src/components/Button/index.tsx @@ -0,0 +1,33 @@ +import { PropsWithChildren } from 'react'; + +interface ButtonProps extends PropsWithChildren { + onClick?: (...props: any[]) => void; + type?: 'keypad' | 'transparent'; + nativeType?: 'button' | 'reset' | 'submit'; + invalid?: boolean; +} + +const Button = ({ + onClick, + type = 'keypad', + nativeType = 'button', + invalid = false, + children, +}: ButtonProps) => { + const handleClickButton = () => { + onClick && onClick(); + }; + + return ( + + ); +}; + +export default Button; diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 00000000..eae9c8e3 --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1 @@ +export { default as Button } from './Button'; From 3f1b2d82f5fbdca3911c52ff591e6ca946456c80 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:44:15 +0900 Subject: [PATCH 015/307] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EB=A1=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.tsx b/src/main.tsx index 40e6cefb..a14fd2e7 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,7 +1,6 @@ import { createRoot } from 'react-dom/client'; import { StrictMode } from 'react'; import App from './App.tsx'; -import './styles/index.css'; createRoot(document.getElementById('root')!).render( From 3c8f0d535b7710bf724d83586a19c94bd34b88ce Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 15:44:32 +0900 Subject: [PATCH 016/307] =?UTF-8?q?chore:=20Router=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?Home=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/router.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/router/router.tsx b/src/router/router.tsx index 463b5f59..907deaf3 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,5 +1,5 @@ import { createBrowserRouter } from 'react-router-dom'; -import Home from '../pages/Home'; +import { Home } from '../pages'; import Payments from '../pages/Payments'; import CardList from '../pages/CardList'; import CardRegist from '../pages/CardRegist'; From b7a4527002dba7e3919522825b75a576dbcd59f8 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 16:20:22 +0900 Subject: [PATCH 017/307] =?UTF-8?q?feat:=20Theme=20=EC=97=90=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/color.ts | 6 +++++- src/styles/emotion.d.ts | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/styles/color.ts b/src/styles/color.ts index 7c9e1b5e..3cc99cb7 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -1,3 +1,7 @@ -const color = {}; +const color = { + white: '#ffffff', + grayBackground: '#e5e5e5', + mainGreen: '#04C09E', +}; export default color; diff --git a/src/styles/emotion.d.ts b/src/styles/emotion.d.ts index 098a6d42..a9f4e88a 100644 --- a/src/styles/emotion.d.ts +++ b/src/styles/emotion.d.ts @@ -1,6 +1,12 @@ import '@emotion/react'; -import { Theme as CustomTheme } from './theme'; +import color from './color'; + +export type Color = typeof color; declare module '@emotion/react' { - export interface Theme extends CustomTheme {} + export interface Theme extends color { + color: { + [key in keyof Color]: string; + }; + } } From 111e6cb42b38eafacf7d427c77fb6c25683edc48 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 16:20:43 +0900 Subject: [PATCH 018/307] =?UTF-8?q?feat:=20Button=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Button/index.style.ts | 26 ++++++++++++++++++++++++++ src/components/Button/index.tsx | 18 ++++++------------ 2 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 src/components/Button/index.style.ts diff --git a/src/components/Button/index.style.ts b/src/components/Button/index.style.ts new file mode 100644 index 00000000..173180e4 --- /dev/null +++ b/src/components/Button/index.style.ts @@ -0,0 +1,26 @@ +import styled from '@emotion/styled'; + +interface ButtonProps { + type: 'button' | 'reset' | 'submit'; +} + +export const Button = styled.button` + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + background-color: ${({ type, theme }) => + type === 'button' + ? `${theme.color.white}` + : type === 'reset' + ? `${theme.color.grayBackground}` + : `${theme.color.mainGreen}`}; + border: 0px; + color: ${({ type, theme }) => + type === 'button' ? `${theme.color.mainGreen}` : `${theme.color.white}`}; + cursor: pointer; + + &:hover { + filter: brightness(0.9); + } +`; diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index 327f25cd..ecd67e99 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -1,16 +1,15 @@ import { PropsWithChildren } from 'react'; +import * as S from './index.style'; interface ButtonProps extends PropsWithChildren { - onClick?: (...props: any[]) => void; - type?: 'keypad' | 'transparent'; - nativeType?: 'button' | 'reset' | 'submit'; + onClick?: () => void; + type?: 'button' | 'reset' | 'submit'; invalid?: boolean; } const Button = ({ onClick, - type = 'keypad', - nativeType = 'button', + type = 'button', invalid = false, children, }: ButtonProps) => { @@ -19,14 +18,9 @@ const Button = ({ }; return ( - + ); }; From 7c493adbf763e4d7ce2ab46de7a3471a62607c58 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 16:21:02 +0900 Subject: [PATCH 019/307] =?UTF-8?q?feat:=20Home=20=EC=97=90=20Button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Home/index.style.ts | 16 ++++++++++++++++ src/pages/Home/index.tsx | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 src/pages/Home/index.style.ts diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts new file mode 100644 index 00000000..54e556c1 --- /dev/null +++ b/src/pages/Home/index.style.ts @@ -0,0 +1,16 @@ +import styled from '@emotion/styled'; + +export const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; + +export const ButtonLabel = styled.div` + width: 100px; + height: 50px; + display: flex; + justify-content: center; + align-items: center; + font-size: 16px; +`; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index 3ab622e8..e0fe7c9d 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,20 +1,20 @@ import { Button } from '../../components'; import { useNavigate } from 'react-router-dom'; -import './home.css'; +import * as S from './index.style'; const Home = () => { const navigate = useNavigate(); return ( -
+ -
+ ); }; From 06e075f4b87181705132afb9f4f39d742de6e4d0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 17:44:56 +0900 Subject: [PATCH 020/307] =?UTF-8?q?refactoring:=20Payments=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EB=B6=84=EB=A5=98=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/{Payments.tsx => Payments/index.tsx} | 0 src/router/router.tsx | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) rename src/pages/{Payments.tsx => Payments/index.tsx} (100%) diff --git a/src/pages/Payments.tsx b/src/pages/Payments/index.tsx similarity index 100% rename from src/pages/Payments.tsx rename to src/pages/Payments/index.tsx diff --git a/src/router/router.tsx b/src/router/router.tsx index 907deaf3..85eaf307 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,6 +1,5 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home } from '../pages'; -import Payments from '../pages/Payments'; +import { Home, Payments } from '../pages'; import CardList from '../pages/CardList'; import CardRegist from '../pages/CardRegist'; import CardAlias from '../pages/CardAlias'; From d35213c0b1b0470b6e8b84168ad1d6a6ac13344e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 17:45:11 +0900 Subject: [PATCH 021/307] =?UTF-8?q?feat:=20Modal=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 1 + src/components/Modal/index.style.ts | 30 +++++++++++++++++++++++++++++ src/components/Modal/index.tsx | 28 +++++++++++++++++++++++++++ src/hooks/useModal.tsx | 17 ++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 src/components/Modal/index.style.ts create mode 100644 src/components/Modal/index.tsx create mode 100644 src/hooks/useModal.tsx diff --git a/src/App.tsx b/src/App.tsx index 7082fc63..794de53f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,6 +6,7 @@ import theme from './styles/theme'; function App() { return ( <> +
diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts new file mode 100644 index 00000000..c75afa56 --- /dev/null +++ b/src/components/Modal/index.style.ts @@ -0,0 +1,30 @@ +import styled from '@emotion/styled'; + +export const DeemBackground = styled.div` + position: absolute; + + width: 100vw; + height: 100vh; + + background-color: ${({ theme }) => theme.color.deemBackground}; + z-index: 999; + + display: flex; + justify-content: center; + align-items: center; +`; + +export const Modal = styled.div` + min-width: 375px; + min-height: 220px; + + border-radius: 10px; + + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + + background-color: ${({ theme }) => theme.color.white}; + z-index: 10; +`; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx new file mode 100644 index 00000000..e37f4f5e --- /dev/null +++ b/src/components/Modal/index.tsx @@ -0,0 +1,28 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; +import { createPortal } from 'react-dom'; + +interface ModalProps extends PropsWithChildren { + isOpen: boolean; + onClose?: () => void; +} + +const Modal = ({ isOpen, onClose, children }: ModalProps) => { + const $rootModal = document.getElementById('root-modal'); + const handleClickBackground = () => { + onClose && onClose(); + }; + + return ( + $rootModal && + isOpen && + createPortal( + + {children} + , + $rootModal, + ) + ); +}; + +export default Modal; diff --git a/src/hooks/useModal.tsx b/src/hooks/useModal.tsx new file mode 100644 index 00000000..a7f22c55 --- /dev/null +++ b/src/hooks/useModal.tsx @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +const useModal = () => { + const [isOpen, setIsOpen] = useState(true); + + const close = () => { + setIsOpen(false); + }; + + const open = () => { + setIsOpen(true); + }; + + return { isOpen, setIsOpen, close, open }; +}; + +export default useModal; From f53e7e746d8776d7a28ed545095d0a32cc496e1f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 17:45:29 +0900 Subject: [PATCH 022/307] =?UTF-8?q?style:=20=EA=B8=B0=EB=B3=B8=20=EC=97=AC?= =?UTF-8?q?=EB=B0=B1=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=97=86=EC=95=A0?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 1 + src/styles/main.css | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/styles/main.css diff --git a/src/main.tsx b/src/main.tsx index a14fd2e7..671e1a00 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,7 @@ import { createRoot } from 'react-dom/client'; import { StrictMode } from 'react'; import App from './App.tsx'; +import './styles/main.css'; createRoot(document.getElementById('root')!).render( diff --git a/src/styles/main.css b/src/styles/main.css new file mode 100644 index 00000000..e26ce9c1 --- /dev/null +++ b/src/styles/main.css @@ -0,0 +1,8 @@ +* { + margin: 0px; + padding: 0px; +} + +#root-modal { + position: relative; +} From ad73d45e988b660b988682e9274e56d8254c6135 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 17:45:45 +0900 Subject: [PATCH 023/307] =?UTF-8?q?feat:=20modal=20=EB=B0=B0=EA=B2=BD=20?= =?UTF-8?q?=EC=83=89=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/color.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/color.ts b/src/styles/color.ts index 3cc99cb7..f685963e 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -1,6 +1,7 @@ const color = { white: '#ffffff', grayBackground: '#e5e5e5', + deemBackground: '#00000030', mainGreen: '#04C09E', }; From d216ca7cbb68e301113bbf6679a934704ac8ca5a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 17:46:19 +0900 Subject: [PATCH 024/307] =?UTF-8?q?feat:=20main=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20Modal=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/index.ts | 1 + src/hooks/index.ts | 1 + src/pages/Home/index.tsx | 10 ++++++++-- src/pages/index.ts | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/hooks/index.ts diff --git a/src/components/index.ts b/src/components/index.ts index eae9c8e3..e1b7351b 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1 +1,2 @@ export { default as Button } from './Button'; +export { default as Modal } from './Modal'; diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 00000000..1ffc2642 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1 @@ +export { default as useModal } from './useModal'; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index e0fe7c9d..dca4b41e 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,19 +1,25 @@ -import { Button } from '../../components'; -import { useNavigate } from 'react-router-dom'; +import { Button, Modal } from '../../components'; +import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; +import { useModal } from '../../hooks'; const Home = () => { const navigate = useNavigate(); + const { isOpen, open } = useModal(); return ( + + + ); }; diff --git a/src/pages/index.ts b/src/pages/index.ts index c2d92a57..2269bf5a 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1 +1,2 @@ export { default as Home } from './Home'; +export { default as Payments } from './Payments'; From 1a8f18d4cfe1e2bfff6e1c8a2cd2b57637d0314e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 18:37:15 +0900 Subject: [PATCH 025/307] =?UTF-8?q?feat:=20Modal=EC=97=90=20Header?= =?UTF-8?q?=EC=99=80=20Body=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/ModalBody.tsx | 10 ++++++++++ src/components/Modal/ModalHeader.tsx | 10 ++++++++++ src/components/Modal/index.style.ts | 14 ++++++++++++++ src/components/Modal/index.tsx | 2 ++ src/components/index.ts | 1 + 5 files changed, 37 insertions(+) create mode 100644 src/components/Modal/ModalBody.tsx create mode 100644 src/components/Modal/ModalHeader.tsx diff --git a/src/components/Modal/ModalBody.tsx b/src/components/Modal/ModalBody.tsx new file mode 100644 index 00000000..423dffa6 --- /dev/null +++ b/src/components/Modal/ModalBody.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface ModalBodyProps extends PropsWithChildren {} + +const ModalBody = ({ children }: ModalBodyProps) => { + return {children}; +}; + +export default ModalBody; diff --git a/src/components/Modal/ModalHeader.tsx b/src/components/Modal/ModalHeader.tsx new file mode 100644 index 00000000..89ea5410 --- /dev/null +++ b/src/components/Modal/ModalHeader.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface ModalHeaderProps extends PropsWithChildren {} + +const ModalHeader = ({ children }: ModalHeaderProps) => { + return {children}; +}; + +export default ModalHeader; diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index c75afa56..0b151ba9 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -28,3 +28,17 @@ export const Modal = styled.div` background-color: ${({ theme }) => theme.color.white}; z-index: 10; `; + +export const ModalHeader = styled.header` + width: 100%; + height: 70px; + display: flex; + flex-direction: column; +`; + +export const ModalBody = styled.div` + width: 100%; + display: flex; + flex-direction: column; + flex-wrap: wrap; +`; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx index e37f4f5e..fe268da9 100644 --- a/src/components/Modal/index.tsx +++ b/src/components/Modal/index.tsx @@ -26,3 +26,5 @@ const Modal = ({ isOpen, onClose, children }: ModalProps) => { }; export default Modal; +export { default as ModalHeader } from './ModalHeader'; +export { default as ModalBody } from './ModalBody'; diff --git a/src/components/index.ts b/src/components/index.ts index e1b7351b..23e64e21 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,2 +1,3 @@ export { default as Button } from './Button'; export { default as Modal } from './Modal'; +export * from './Modal'; From 8517e1df72da72e0aa7b753700f0424646b04775 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:05:51 +0900 Subject: [PATCH 026/307] =?UTF-8?q?feat:=20Information=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 --- .../Information/InformationBody.tsx | 10 ++++++ .../Information/InformationHeader.tsx | 10 ++++++ src/components/Information/index.style.ts | 31 +++++++++++++++++++ src/components/Information/index.tsx | 12 +++++++ src/components/index.ts | 2 ++ 5 files changed, 65 insertions(+) create mode 100644 src/components/Information/InformationBody.tsx create mode 100644 src/components/Information/InformationHeader.tsx create mode 100644 src/components/Information/index.style.ts create mode 100644 src/components/Information/index.tsx diff --git a/src/components/Information/InformationBody.tsx b/src/components/Information/InformationBody.tsx new file mode 100644 index 00000000..710b97c0 --- /dev/null +++ b/src/components/Information/InformationBody.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface InformationBody extends PropsWithChildren {} + +const InformationBody = ({ children }: InformationBody) => { + return {children}; +}; + +export default InformationBody; diff --git a/src/components/Information/InformationHeader.tsx b/src/components/Information/InformationHeader.tsx new file mode 100644 index 00000000..9c8681b4 --- /dev/null +++ b/src/components/Information/InformationHeader.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface InformationHeaderProps extends PropsWithChildren {} + +const InformationHeader = ({ children }: InformationHeaderProps) => { + return {children}; +}; + +export default InformationHeader; diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts new file mode 100644 index 00000000..af316c94 --- /dev/null +++ b/src/components/Information/index.style.ts @@ -0,0 +1,31 @@ +import styled from '@emotion/styled'; + +export const Information = styled.div` + width: 100%; + padding: 10px 20px; + + display: flex; + flex-direction: column; + flex-wrap: wrap; +`; + +export const InformationHeader = styled.div` + width: 100%; + padding: 10px 5px; + + font-size: 20px; + font-weight: bold; + + display: flex; + flex-direction: column; + border-bottom: 2px solid ${({ theme }) => theme.color.grayBackground}; +`; + +export const InformationBody = styled.div` + width: 100%; + padding: 10px 5px; + + display: flex; + flex-direction: column; + flex-wrap: wrap; +`; diff --git a/src/components/Information/index.tsx b/src/components/Information/index.tsx new file mode 100644 index 00000000..2e4a52e8 --- /dev/null +++ b/src/components/Information/index.tsx @@ -0,0 +1,12 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface InformationProps extends PropsWithChildren {} + +const Information = ({ children }: InformationProps) => { + return {children}; +}; + +export default Information; +export { default as InformationHeader } from './InformationHeader'; +export { default as InformationBody } from './InformationBody'; diff --git a/src/components/index.ts b/src/components/index.ts index 23e64e21..7c4e5d00 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,3 +1,5 @@ export { default as Button } from './Button'; export { default as Modal } from './Modal'; export * from './Modal'; +export { default as Information } from './Information'; +export * from './Information'; From f548bfab581a2fdd524f9103fd1aa585754cb0a4 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:06:15 +0900 Subject: [PATCH 027/307] =?UTF-8?q?feat:=20Payments=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=20Information=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Payments/index.style.ts | 0 src/pages/Payments/index.tsx | 41 ++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/pages/Payments/index.style.ts diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index bf898677..a1efd337 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -1,5 +1,44 @@ +import { FormProvider, useForm } from 'react-hook-form'; +import { + ModalHeader, + ModalBody, + Information, + InformationHeader, + InformationBody, +} from '../../components'; + const Payments = () => { - return <>; + const methods = useForm(); + + return ( + <> + + + + + 보유카드 + {/* */} + + + 결제 금액 + +
총 결제 금액
+
323,600원
+
+
+ + 약관 이용 및 동의 + +
거래정보 제공 동의:NEXTSTEP
+
상세보기
+
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
+ +
+
+
+
+ + ); }; export default Payments; From fa05c30410d502c7d7ee1f137205fa147dfa3139 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:06:25 +0900 Subject: [PATCH 028/307] =?UTF-8?q?chore:=20pretendard=20=ED=8F=B0?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 8 +++++++- src/styles/main.css | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index c9809a9d..eeb1087c 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,14 @@ - + + React Clean Code Payments diff --git a/src/styles/main.css b/src/styles/main.css index e26ce9c1..1b26b997 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1,6 +1,11 @@ * { margin: 0px; padding: 0px; + font-family: -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', + 'Pretendard Variable', Pretendard, Roboto, 'Noto Sans KR', 'Segoe UI', + 'Malgun Gothic', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + sans-serif; + box-sizing: border-box; } #root-modal { From 960f47271d08744842ad5be7264faf2615ba6488 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:17:46 +0900 Subject: [PATCH 029/307] =?UTF-8?q?feat:=20ModalFooter=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/ModalFooter.tsx | 10 ++++++++++ src/components/Modal/index.style.ts | 7 +++++++ src/components/Modal/index.tsx | 1 + 3 files changed, 18 insertions(+) create mode 100644 src/components/Modal/ModalFooter.tsx diff --git a/src/components/Modal/ModalFooter.tsx b/src/components/Modal/ModalFooter.tsx new file mode 100644 index 00000000..1887bd38 --- /dev/null +++ b/src/components/Modal/ModalFooter.tsx @@ -0,0 +1,10 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface ModalFooterProps extends PropsWithChildren {} + +const ModalFooter = ({ children }: ModalFooterProps) => { + return {children}; +}; + +export default ModalFooter; diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index 0b151ba9..6c74a721 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -42,3 +42,10 @@ export const ModalBody = styled.div` flex-direction: column; flex-wrap: wrap; `; + +export const ModalFooter = styled.footer` + width: 100%; + height: 70px; + display: flex; + flex-direction: column; +`; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx index fe268da9..21741ff6 100644 --- a/src/components/Modal/index.tsx +++ b/src/components/Modal/index.tsx @@ -28,3 +28,4 @@ const Modal = ({ isOpen, onClose, children }: ModalProps) => { export default Modal; export { default as ModalHeader } from './ModalHeader'; export { default as ModalBody } from './ModalBody'; +export { default as ModalFooter } from './ModalFooter'; From 96f4013045a89d32d7e0ab2b4cde36c74ef06aaa Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:18:22 +0900 Subject: [PATCH 030/307] =?UTF-8?q?refactoring:=20Payments=20=EC=9D=98=20?= =?UTF-8?q?=EA=B0=81=20=EC=82=AC=ED=95=AD=EB=93=A4=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 --- .../components/PayAmountInformation.tsx | 19 ++++++++ .../components/PayCardInformation.tsx | 16 +++++++ .../components/PayTermInformation.tsx | 21 +++++++++ src/pages/Payments/components/index.ts | 3 ++ src/pages/Payments/index.tsx | 44 +++++++------------ 5 files changed, 75 insertions(+), 28 deletions(-) create mode 100644 src/pages/Payments/components/PayAmountInformation.tsx create mode 100644 src/pages/Payments/components/PayCardInformation.tsx create mode 100644 src/pages/Payments/components/PayTermInformation.tsx create mode 100644 src/pages/Payments/components/index.ts diff --git a/src/pages/Payments/components/PayAmountInformation.tsx b/src/pages/Payments/components/PayAmountInformation.tsx new file mode 100644 index 00000000..17be3d19 --- /dev/null +++ b/src/pages/Payments/components/PayAmountInformation.tsx @@ -0,0 +1,19 @@ +import { + Information, + InformationBody, + InformationHeader, +} from '../../../components'; + +const PayAmountInformation = () => { + return ( + + 결제 금액 + +
총 결제 금액
+
323,600원
+
+
+ ); +}; + +export default PayAmountInformation; diff --git a/src/pages/Payments/components/PayCardInformation.tsx b/src/pages/Payments/components/PayCardInformation.tsx new file mode 100644 index 00000000..1be2e10f --- /dev/null +++ b/src/pages/Payments/components/PayCardInformation.tsx @@ -0,0 +1,16 @@ +import { + Information, + InformationBody, + InformationHeader, +} from '../../../components'; + +const PayCardInfomation = () => { + return ( + + 보유카드 + {/* */} + + ); +}; + +export default PayCardInfomation; diff --git a/src/pages/Payments/components/PayTermInformation.tsx b/src/pages/Payments/components/PayTermInformation.tsx new file mode 100644 index 00000000..57c6cc4e --- /dev/null +++ b/src/pages/Payments/components/PayTermInformation.tsx @@ -0,0 +1,21 @@ +import { + Information, + InformationBody, + InformationHeader, +} from '../../../components'; + +const PayTermInfomation = () => { + return ( + + 약관 이용 및 동의 + +
거래정보 제공 동의:NEXTSTEP
+
상세보기
+
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
+ +
+
+ ); +}; + +export default PayTermInfomation; diff --git a/src/pages/Payments/components/index.ts b/src/pages/Payments/components/index.ts new file mode 100644 index 00000000..d45e6447 --- /dev/null +++ b/src/pages/Payments/components/index.ts @@ -0,0 +1,3 @@ +export { default as PayAmountInformation } from './PayAmountInformation'; +export { default as PayCardInformation } from './PayCardInformation'; +export { default as PayTermInformation } from './PayTermInformation'; diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index a1efd337..49858ba6 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -1,11 +1,10 @@ import { FormProvider, useForm } from 'react-hook-form'; +import { ModalHeader, ModalBody, Button } from '../../components'; import { - ModalHeader, - ModalBody, - Information, - InformationHeader, - InformationBody, -} from '../../components'; + PayAmountInformation, + PayCardInformation, + PayTermInformation, +} from './components'; const Payments = () => { const methods = useForm(); @@ -14,28 +13,17 @@ const Payments = () => { <> - - - 보유카드 - {/* */} - - - 결제 금액 - -
총 결제 금액
-
323,600원
-
-
- - 약관 이용 및 동의 - -
거래정보 제공 동의:NEXTSTEP
-
상세보기
-
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
- -
-
-
+
+ + + + + +
+
+ + +
); From b882f937cf7c2fea457b71e4212fe4019d5af4f6 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:22:11 +0900 Subject: [PATCH 031/307] =?UTF-8?q?feat:=20Payment=20=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EA=B2=B0=EC=A0=9C=20=EB=B2=84=ED=8A=BC=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Button/index.style.ts | 8 +++++++- src/pages/Payments/index.style.ts | 12 ++++++++++++ src/pages/Payments/index.tsx | 25 ++++++++++++++++--------- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/components/Button/index.style.ts b/src/components/Button/index.style.ts index 173180e4..efd402ba 100644 --- a/src/components/Button/index.style.ts +++ b/src/components/Button/index.style.ts @@ -8,16 +8,22 @@ export const Button = styled.button` display: flex; justify-content: center; align-items: center; + border-radius: 5px; + border: 0px; + padding: 7px 10px; + background-color: ${({ type, theme }) => type === 'button' ? `${theme.color.white}` : type === 'reset' ? `${theme.color.grayBackground}` : `${theme.color.mainGreen}`}; - border: 0px; + color: ${({ type, theme }) => type === 'button' ? `${theme.color.mainGreen}` : `${theme.color.white}`}; + font-size: 16px; + cursor: pointer; &:hover { diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts index e69de29b..f1a5e764 100644 --- a/src/pages/Payments/index.style.ts +++ b/src/pages/Payments/index.style.ts @@ -0,0 +1,12 @@ +import styled from '@emotion/styled'; + +export const ButtonContainer = styled.div` + width: 100%; + display: flex; + justify-content: center; + gap: 10px; +`; + +export const ButtonLabel = styled.div` + padding: 5px; +`; diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 49858ba6..9a0a0e30 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -1,10 +1,11 @@ import { FormProvider, useForm } from 'react-hook-form'; -import { ModalHeader, ModalBody, Button } from '../../components'; +import { ModalHeader, ModalBody, Button, ModalFooter } from '../../components'; import { PayAmountInformation, PayCardInformation, PayTermInformation, } from './components'; +import * as S from './index.style'; const Payments = () => { const methods = useForm(); @@ -12,19 +13,25 @@ const Payments = () => { return ( <> - -
+ + - -
- - -
-
+
+ + + + + + + ); }; From d5e8642b3db6767962165a1d0b090b18c8ebab3c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 19 Jul 2024 19:26:31 +0900 Subject: [PATCH 032/307] =?UTF-8?q?style:=20PayAmountInformation=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=97=90=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Payments/components/PayAmountInformation.tsx | 7 +++++-- src/pages/Payments/index.style.ts | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pages/Payments/components/PayAmountInformation.tsx b/src/pages/Payments/components/PayAmountInformation.tsx index 17be3d19..18b498d6 100644 --- a/src/pages/Payments/components/PayAmountInformation.tsx +++ b/src/pages/Payments/components/PayAmountInformation.tsx @@ -3,14 +3,17 @@ import { InformationBody, InformationHeader, } from '../../../components'; +import * as S from '../index.style'; const PayAmountInformation = () => { return ( 결제 금액 -
총 결제 금액
-
323,600원
+ +
총 결제 금액
+
323,600원
+
); diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts index f1a5e764..b1655e69 100644 --- a/src/pages/Payments/index.style.ts +++ b/src/pages/Payments/index.style.ts @@ -10,3 +10,10 @@ export const ButtonContainer = styled.div` export const ButtonLabel = styled.div` padding: 5px; `; + +export const PayAmountBody = styled.div` + display: flex; + justify-content: space-between; + + font-weight: bold; +`; From e766c96b108e493dd702d4f57f8dd6e2282d5b3a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 11:49:19 +0900 Subject: [PATCH 033/307] =?UTF-8?q?chore:=20=EC=BB=AC=EB=9F=AC=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/color.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/styles/color.ts b/src/styles/color.ts index f685963e..80ef29ef 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -3,6 +3,9 @@ const color = { grayBackground: '#e5e5e5', deemBackground: '#00000030', mainGreen: '#04C09E', + grayFont: '#575757', + blackAlpha30: '#00000030', + darkYellow: '#cbba64', }; export default color; From ab3ce18a88ad5f498cd70cf8e5119e7700486245 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 11:49:35 +0900 Subject: [PATCH 034/307] =?UTF-8?q?chore:=20=EC=B9=B4=EB=93=9C=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=AC=20=EC=83=89=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/cardColor.ts | 15 +++++++++++++++ src/styles/emotion.d.ts | 8 +++++++- src/styles/theme.ts | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/styles/cardColor.ts diff --git a/src/styles/cardColor.ts b/src/styles/cardColor.ts new file mode 100644 index 00000000..f0933d6d --- /dev/null +++ b/src/styles/cardColor.ts @@ -0,0 +1,15 @@ +import { CardCompany } from '../types'; + +const cardColor: Record = { + none: '#94dacd', + suyeon: '#E24141', + sejin: '#547CE4', + chanwook: '#73BC6D', + jonggil: '#DE59B9', + hyori: '#04C09E4F', + hyesong: '#E76E9A', + jingyeong: '#F37D3B', + geonwoo: '#FBCD58', +}; + +export default cardColor; diff --git a/src/styles/emotion.d.ts b/src/styles/emotion.d.ts index a9f4e88a..90fd1b77 100644 --- a/src/styles/emotion.d.ts +++ b/src/styles/emotion.d.ts @@ -1,12 +1,18 @@ import '@emotion/react'; import color from './color'; +import cardColor from './cardColor'; +import { CardCompany } from '../types'; export type Color = typeof color; +export type CardColor = typeof cardColor; declare module '@emotion/react' { - export interface Theme extends color { + export interface Theme extends color, cardColor { color: { [key in keyof Color]: string; }; + cardColor: { + [key in CardCompany]: string; + }; } } diff --git a/src/styles/theme.ts b/src/styles/theme.ts index 715b4f12..dc21534d 100644 --- a/src/styles/theme.ts +++ b/src/styles/theme.ts @@ -1,8 +1,10 @@ import { Theme } from '@emotion/react'; import color from './color'; +import cardColor from './cardColor'; const theme: Theme = { color, + cardColor, }; export default theme; From a72c3125c9b671c72d116b230515d5cb789c2043 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 12:04:33 +0900 Subject: [PATCH 035/307] =?UTF-8?q?feat:=20Card=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- src/components/Card/index.style.ts | 86 ++++++++++++++++++++++++++++++ src/components/Card/index.tsx | 51 ++++++++++++++++++ src/components/index.ts | 1 + src/pages/Payments/index.tsx | 12 ++++- src/types/index.ts | 17 ++++++ 5 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/components/Card/index.style.ts create mode 100644 src/components/Card/index.tsx create mode 100644 src/types/index.ts diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts new file mode 100644 index 00000000..33248d0b --- /dev/null +++ b/src/components/Card/index.style.ts @@ -0,0 +1,86 @@ +import styled from '@emotion/styled'; +import { CardCompany } from '../../types'; + +interface CardProps { + type: 'register' | 'empty'; + size: 'small' | 'big'; + company: CardCompany; +} + +interface CardChipProps { + size: 'small' | 'big'; +} + +export const Container = styled.div` + display: flex; + align-items: center; + justify-content: center; + + margin: 10px 0; +`; + +export const Card = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + + width: ${({ size }) => (size === 'small' ? 208 : 290)}px; + height: ${({ size }) => (size === 'small' ? 130 : 180)}px; + font-size: ${({ size }) => (size === 'small' ? 12 : 16)}px; + + background: ${({ theme, type, company }) => + type === 'empty' ? theme.color.blackAlpha30 : theme.cardColor[company]}; + box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; + + user-select: ${({ type }) => (type === 'empty' ? 'none' : 'auto')}; + border-radius: 5px; + padding: 10px 20px; +`; + +export const CardTop = styled.div` + width: 100%; + height: 100%; + + display: flex; + align-items: center; +`; + +export const CardChip = styled.div` + width: ${({ size }) => (size === 'small' ? 40 : 55.04)}px; + height: ${({ size }) => (size === 'small' ? 26 : 35.77)}px; + left: 20px; + top: 40px; + + background: ${({ theme }) => theme.color.darkYellow}; + border-radius: 4px; +`; + +export const CardMiddle = styled.div` + width: 100%; + height: 100%; + + display: flex; + flex-direction: column; + gap: 5px; +`; + +export const CardBottom = styled.div` + width: 100%; + height: 100%; + + display: flex; + justify-content: space-between; +`; + +export const CardNumberList = styled.div` + display: flex; + justify-content: space-around; +`; + +export const CardNumberItem = styled.div``; + +export const CardBottomLeft = styled.div``; + +export const CardBottomRight = styled.div``; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx new file mode 100644 index 00000000..908c680d --- /dev/null +++ b/src/components/Card/index.tsx @@ -0,0 +1,51 @@ +import { CardCompany, CardEndDate, CardNumber } from '../../types'; +import * as S from './index.style'; + +interface CardProps { + type?: 'register' | 'empty'; + numbers?: CardNumber; + endDate?: CardEndDate; + cardUser?: string; + company?: CardCompany; + size?: 'small' | 'big'; +} + +const Card = ({ + type = 'register', + size = 'small', + company = 'none', + numbers = ['0000', '0000', '0000', '0000'], + endDate = { + month: '00', + day: '00', + }, + cardUser = 'User', +}: CardProps) => { + return ( + + + {type === 'register' && ( + <> + {company} + + + + {numbers.map((number) => ( + {number} + ))} + + + + {cardUser} + + {endDate.month}/{endDate.day} + + + + )} + + + ); +}; + +export default Card; diff --git a/src/components/index.ts b/src/components/index.ts index 7c4e5d00..3cba3ea9 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -3,3 +3,4 @@ export { default as Modal } from './Modal'; export * from './Modal'; export { default as Information } from './Information'; export * from './Information'; +export { default as Card } from './Card'; diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 9a0a0e30..7380403f 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -8,7 +8,17 @@ import { import * as S from './index.style'; const Payments = () => { - const methods = useForm(); + // defaultValues 는 cards 목록을 가지고 와서 가장 첫번째로 해야함 - 없으면 undefined + const methods = useForm({ + defaultValues: { + card: undefined, + checkTerm: false, + }, + }); + // 카드 불러와야 함... + // 1. 카드 컴포넌트 만들기 + // 2. 카드 전역 state 만들기 + // 3. CardSelector 만들기 return ( <> diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 00000000..206d20b0 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,17 @@ +export type CardCompany = + | 'none' + | 'suyeon' + | 'sejin' + | 'chanwook' + | 'jonggil' + | 'hyori' + | 'hyesong' + | 'jingyeong' + | 'geonwoo'; + +export type CardNumber = [string, string, string, string]; + +export interface CardEndDate { + month: string; + day: string; +} From 62ea9fdae5e3081df4ca8e458387b84fbf4b162d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 13:03:58 +0900 Subject: [PATCH 036/307] =?UTF-8?q?style:=20PayTermInformation=20=EC=97=AC?= =?UTF-8?q?=EB=B0=B1=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/index.style.ts | 5 +++-- .../Payments/components/PayTermInformation.tsx | 14 ++++++++++---- src/pages/Payments/index.style.ts | 18 ++++++++++++++++++ src/pages/Payments/index.tsx | 4 ++-- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index 6c74a721..c2fb5c7d 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -15,8 +15,8 @@ export const DeemBackground = styled.div` `; export const Modal = styled.div` - min-width: 375px; - min-height: 220px; + min-width: 400px; + min-height: 250px; border-radius: 10px; @@ -46,6 +46,7 @@ export const ModalBody = styled.div` export const ModalFooter = styled.footer` width: 100%; height: 70px; + display: flex; flex-direction: column; `; diff --git a/src/pages/Payments/components/PayTermInformation.tsx b/src/pages/Payments/components/PayTermInformation.tsx index 57c6cc4e..843eb5b9 100644 --- a/src/pages/Payments/components/PayTermInformation.tsx +++ b/src/pages/Payments/components/PayTermInformation.tsx @@ -3,16 +3,22 @@ import { InformationBody, InformationHeader, } from '../../../components'; +import * as S from '../index.style'; const PayTermInfomation = () => { return ( 약관 이용 및 동의 -
거래정보 제공 동의:NEXTSTEP
-
상세보기
-
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
- + +
거래정보 제공 동의:
+
NEXTSTEP
+
상세보기
+
+ +
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
+ +
); diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts index b1655e69..7fb2aefa 100644 --- a/src/pages/Payments/index.style.ts +++ b/src/pages/Payments/index.style.ts @@ -1,5 +1,9 @@ import styled from '@emotion/styled'; +export const Form = styled.form` + width: 100%; +`; + export const ButtonContainer = styled.div` width: 100%; display: flex; @@ -17,3 +21,17 @@ export const PayAmountBody = styled.div` font-weight: bold; `; + +export const TermInformationTop = styled.div` + display: flex; + gap: 10px; + + font-size: 14px; +`; + +export const TermInformationBottom = styled.div` + display: flex; + justify-content: space-between; + + font-size: 14px; +`; diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 7380403f..7b2b1dfc 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -23,7 +23,7 @@ const Payments = () => { return ( <> -
+ @@ -41,7 +41,7 @@ const Payments = () => { - +
); }; From af7278b77426389954e52ae29c502ca68b3351fc Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 13:47:01 +0900 Subject: [PATCH 037/307] =?UTF-8?q?chore:=20react-slick=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 --- package-lock.json | 77 ++++++++++++++++++++++++++++++++++++++++++++++- package.json | 5 ++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36960184..67a8dda1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,9 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.50.1", - "react-router-dom": "^6.25.1" + "react-router-dom": "^6.25.1", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1" }, "devDependencies": { "@emotion/eslint-plugin": "^11.11.0", @@ -24,6 +26,7 @@ "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-router-dom": "^5.3.3", + "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react-swc": "^3.5.0", @@ -1786,6 +1789,15 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-slick": { + "version": "0.23.13", + "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz", + "integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", @@ -2331,6 +2343,11 @@ "node": ">= 16" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2544,6 +2561,11 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3502,6 +3524,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3595,6 +3623,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3644,6 +3680,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4301,6 +4342,22 @@ "react-dom": ">=16.8" } }, + "node_modules/react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -4326,6 +4383,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4542,6 +4604,14 @@ "node": ">=8" } }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4572,6 +4642,11 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", diff --git a/package.json b/package.json index c6115cf0..d478f765 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,9 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.50.1", - "react-router-dom": "^6.25.1" + "react-router-dom": "^6.25.1", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1" }, "devDependencies": { "@emotion/eslint-plugin": "^11.11.0", @@ -33,6 +35,7 @@ "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-router-dom": "^5.3.3", + "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", "@vitejs/plugin-react-swc": "^3.5.0", From 78edf426fc756553917338494458ccd60916169d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 13:47:26 +0900 Subject: [PATCH 038/307] =?UTF-8?q?feat:=20CardSlide=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CardSlider/index.style.ts | 5 +++ src/components/CardSlider/index.tsx | 43 +++++++++++++++++++++++ src/components/Information/index.style.ts | 4 --- 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 src/components/CardSlider/index.style.ts create mode 100644 src/components/CardSlider/index.tsx diff --git a/src/components/CardSlider/index.style.ts b/src/components/CardSlider/index.style.ts new file mode 100644 index 00000000..7eb59db1 --- /dev/null +++ b/src/components/CardSlider/index.style.ts @@ -0,0 +1,5 @@ +import styled from '@emotion/styled'; + +export const SlideWrapper = styled.div` + max-width: 500px; +`; diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx new file mode 100644 index 00000000..8d8f2bc1 --- /dev/null +++ b/src/components/CardSlider/index.tsx @@ -0,0 +1,43 @@ +import Slider from 'react-slick'; +import 'slick-carousel/slick/slick.css'; +import 'slick-carousel/slick/slick-theme.css'; +import * as S from './index.style'; +import { useState } from 'react'; +import Card from '../Card'; + +const CardSlider = () => { + const settings = { + dots: true, + speed: 500, + slidesToShow: 1, + slidesToScroll: 1, + }; + const [card, setCard] = useState(); + + return ( + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ ); +}; + +export default CardSlider; diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts index af316c94..a3d947c5 100644 --- a/src/components/Information/index.style.ts +++ b/src/components/Information/index.style.ts @@ -24,8 +24,4 @@ export const InformationHeader = styled.div` export const InformationBody = styled.div` width: 100%; padding: 10px 5px; - - display: flex; - flex-direction: column; - flex-wrap: wrap; `; From 7a9736f074f6fde4daca41395a7698758afca5cd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 14:17:59 +0900 Subject: [PATCH 039/307] =?UTF-8?q?chore:=20Redux=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 84 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 ++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 67a8dda1..5e4661d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,13 @@ "version": "0.0.0", "license": "ISC", "dependencies": { + "@reduxjs/toolkit": "^2.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.50.1", "react-router-dom": "^6.25.1", "react-slick": "^0.30.2", + "redux": "^5.0.1", "slick-carousel": "^1.8.1" }, "devDependencies": { @@ -25,6 +27,7 @@ "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^7.15.0", @@ -1170,6 +1173,29 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", + "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", @@ -1737,6 +1763,16 @@ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", "dev": true }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dev": true, + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -1768,6 +1804,27 @@ "@types/react": "*" } }, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", @@ -3315,6 +3372,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4371,6 +4437,19 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -4383,6 +4462,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", diff --git a/package.json b/package.json index d478f765..da2523e9 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,9 @@ "react-hook-form": "^7.50.1", "react-router-dom": "^6.25.1", "react-slick": "^0.30.2", - "slick-carousel": "^1.8.1" + "slick-carousel": "^1.8.1", + "redux": "^5.0.1", + "@reduxjs/toolkit": "^2.0.1" }, "devDependencies": { "@emotion/eslint-plugin": "^11.11.0", @@ -34,6 +36,7 @@ "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^7.15.0", From 2f5ea4b36d158386b886057a32be86e6ca09e4f3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 14:18:12 +0900 Subject: [PATCH 040/307] =?UTF-8?q?chore:=20google-icon=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.html b/index.html index eeb1087c..95fac163 100644 --- a/index.html +++ b/index.html @@ -9,6 +9,10 @@ crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css" /> + React Clean Code Payments From 24c13726ed678e71c7b10549d18de57d35dd8f13 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 14:24:35 +0900 Subject: [PATCH 041/307] =?UTF-8?q?chore:=20react-redux=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 --- package-lock.json | 42 +++++++++++++++++++++++++++++++++++++++--- package.json | 5 +++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e4661d9..2c2b063c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.50.1", + "react-redux": "^9.1.2", "react-router-dom": "^6.25.1", "react-slick": "^0.30.2", "redux": "^5.0.1", @@ -1783,13 +1784,13 @@ "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1855,6 +1856,11 @@ "@types/react": "*" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", @@ -2505,7 +2511,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true }, "node_modules/data-urls": { "version": "5.0.0", @@ -4378,6 +4384,28 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "6.25.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", @@ -5140,6 +5168,14 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/vite": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", diff --git a/package.json b/package.json index da2523e9..6efe5850 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,15 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.50.1", + "react-redux": "^9.1.2", "react-router-dom": "^6.25.1", "react-slick": "^0.30.2", - "slick-carousel": "^1.8.1", "redux": "^5.0.1", - "@reduxjs/toolkit": "^2.0.1" + "slick-carousel": "^1.8.1" }, "devDependencies": { "@emotion/eslint-plugin": "^11.11.0", From bb1e48d5b106b7c711ecbfbf080c0c57b2dbd17c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 15:14:57 +0900 Subject: [PATCH 042/307] =?UTF-8?q?feat:=20Cards=EB=A5=BC=20=EC=A0=84?= =?UTF-8?q?=EC=97=AD=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 12 ++++++++---- src/store/index.ts | 23 +++++++++++++++++++++++ src/types/index.ts | 7 +++++++ 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/store/index.ts diff --git a/src/App.tsx b/src/App.tsx index 794de53f..af39b28e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,14 +2,18 @@ import { ThemeProvider } from '@emotion/react'; import router from './router/router'; import { RouterProvider } from 'react-router-dom'; import theme from './styles/theme'; +import { Provider } from 'react-redux'; +import store from './store'; function App() { return ( <> -
- - - + +
+ + + +
); } diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 00000000..6ca5d557 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,23 @@ +import { configureStore, createSlice } from '@reduxjs/toolkit'; +import { MyCard } from '../types'; + +interface CardState { + cards: MyCard[]; +} + +const initialCard: CardState = { + cards: [], +}; + +const cardSlice = createSlice({ + name: 'cards', + initialState: initialCard, + reducers: {}, +}); + +export type RootState = ReturnType; +const store = configureStore({ + reducer: cardSlice.reducer, +}); + +export default store; diff --git a/src/types/index.ts b/src/types/index.ts index 206d20b0..3b54fbd9 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -15,3 +15,10 @@ export interface CardEndDate { month: string; day: string; } + +export interface MyCard { + numbers: CardNumber; + endDate: CardEndDate; + cardUser: string; + company: CardCompany; +} From b13bfbfae939faedd03673b08d7c68c68eda8bf1 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 15:15:37 +0900 Subject: [PATCH 043/307] =?UTF-8?q?feat:=20Payments=EB=82=B4=EB=B6=80?= =?UTF-8?q?=EB=A5=BC=20react-hook-form=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.style.ts | 3 ++ src/components/Card/index.tsx | 24 +++++++++++-- src/components/CardSlider/index.style.ts | 8 ++++- src/components/CardSlider/index.tsx | 36 +++++++++++-------- src/components/Modal/index.style.ts | 2 ++ .../components/PayCardInformation.tsx | 28 ++++++++++++++- .../components/PayTermInformation.tsx | 10 +++++- src/pages/Payments/index.tsx | 15 ++++---- 8 files changed, 99 insertions(+), 27 deletions(-) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 33248d0b..9fa04cbb 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -5,6 +5,7 @@ interface CardProps { type: 'register' | 'empty'; size: 'small' | 'big'; company: CardCompany; + clickable: boolean; } interface CardChipProps { @@ -37,6 +38,8 @@ export const Card = styled.div` user-select: ${({ type }) => (type === 'empty' ? 'none' : 'auto')}; border-radius: 5px; padding: 10px 20px; + + cursor: ${({ clickable }) => (clickable ? 'pointer' : 'default')}; `; export const CardTop = styled.div` diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 908c680d..164479ae 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -8,10 +8,12 @@ interface CardProps { cardUser?: string; company?: CardCompany; size?: 'small' | 'big'; + clickable?: boolean; + onClick?: () => void; } const Card = ({ - type = 'register', + type = 'empty', size = 'small', company = 'none', numbers = ['0000', '0000', '0000', '0000'], @@ -20,11 +22,23 @@ const Card = ({ day: '00', }, cardUser = 'User', + clickable = false, + onClick, }: CardProps) => { + const handleClickCard = () => { + onClick && onClick(); + }; + return ( - - {type === 'register' && ( + + {type === 'register' ? ( <> {company} @@ -42,6 +56,10 @@ const Card = ({ + ) : ( + <> + add + )} diff --git a/src/components/CardSlider/index.style.ts b/src/components/CardSlider/index.style.ts index 7eb59db1..60ef32de 100644 --- a/src/components/CardSlider/index.style.ts +++ b/src/components/CardSlider/index.style.ts @@ -1,5 +1,11 @@ import styled from '@emotion/styled'; export const SlideWrapper = styled.div` - max-width: 500px; + max-width: 400px; +`; + +export const ItemWrapper = styled.div``; + +export const LastItemWrapper = styled.div` + cursor: pointer; `; diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 8d8f2bc1..7cc4bd43 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -2,20 +2,30 @@ import Slider from 'react-slick'; import 'slick-carousel/slick/slick.css'; import 'slick-carousel/slick/slick-theme.css'; import * as S from './index.style'; -import { useState } from 'react'; import Card from '../Card'; +import { useNavigate } from 'react-router-dom'; +import { MyCard } from '../../types'; -const CardSlider = () => { +interface CardSliderProps { + cards: MyCard[]; + onChange?: (value: MyCard) => void; +} + +const CardSlider = ({ cards, onChange }: CardSliderProps) => { + const navigate = useNavigate(); const settings = { + centerMode: true, dots: true, speed: 500, slidesToShow: 1, slidesToScroll: 1, + beforeChange: (index: number) => { + onChange && onChange(cards[index]); + }, }; - const [card, setCard] = useState(); return ( - +
@@ -23,18 +33,14 @@ const CardSlider = () => {
-
- -
-
- -
-
- -
-
+ {cards.map((card, index) => ( + + + + ))} + navigate('/card-list')}> -
+ ); diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index c2fb5c7d..3f86c571 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -17,6 +17,8 @@ export const DeemBackground = styled.div` export const Modal = styled.div` min-width: 400px; min-height: 250px; + max-height: 100vh; + overflow-y: scroll; border-radius: 10px; diff --git a/src/pages/Payments/components/PayCardInformation.tsx b/src/pages/Payments/components/PayCardInformation.tsx index 1be2e10f..082c38a6 100644 --- a/src/pages/Payments/components/PayCardInformation.tsx +++ b/src/pages/Payments/components/PayCardInformation.tsx @@ -1,14 +1,40 @@ +import { useSelector } from 'react-redux'; import { + Card, Information, InformationBody, InformationHeader, } from '../../../components'; +import CardSlider from '../../../components/CardSlider'; +import { RootState } from '../../../store'; +import { useNavigate } from 'react-router-dom'; +import { Controller, useFormContext } from 'react-hook-form'; const PayCardInfomation = () => { + const navigate = useNavigate(); + const cards = useSelector((state: RootState) => state.cards); + const { control } = useFormContext(); + return ( 보유카드 - {/* */} + + 0 ? cards[0] : undefined} + render={({ field: { onChange } }) => + cards.length === 0 ? ( + navigate('/card-list')} /> + ) : ( + + ) + } + /> + ); }; diff --git a/src/pages/Payments/components/PayTermInformation.tsx b/src/pages/Payments/components/PayTermInformation.tsx index 843eb5b9..015d1784 100644 --- a/src/pages/Payments/components/PayTermInformation.tsx +++ b/src/pages/Payments/components/PayTermInformation.tsx @@ -1,3 +1,4 @@ +import { useFormContext } from 'react-hook-form'; import { Information, InformationBody, @@ -6,6 +7,8 @@ import { import * as S from '../index.style'; const PayTermInfomation = () => { + const { register } = useFormContext(); + return ( 약관 이용 및 동의 @@ -17,7 +20,12 @@ const PayTermInfomation = () => {
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
- +
diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 7b2b1dfc..8795ef67 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -6,19 +6,22 @@ import { PayTermInformation, } from './components'; import * as S from './index.style'; +import { useEffect, useState } from 'react'; const Payments = () => { - // defaultValues 는 cards 목록을 가지고 와서 가장 첫번째로 해야함 - 없으면 undefined + const [validate, setValidate] = useState(false); const methods = useForm({ defaultValues: { card: undefined, checkTerm: false, }, }); - // 카드 불러와야 함... - // 1. 카드 컴포넌트 만들기 - // 2. 카드 전역 state 만들기 - // 3. CardSelector 만들기 + const { watch, trigger } = methods; + const watchValues = watch(['card', 'checkTerm']); + + useEffect(() => { + trigger().then((validate) => setValidate(validate)); + }, [watchValues]); return ( <> @@ -36,7 +39,7 @@ const Payments = () => { - From 1fef328919e4527dc93640680185836d02ecbbf3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 16:28:51 +0900 Subject: [PATCH 044/307] =?UTF-8?q?feat:=20CardList=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/index.style.ts | 5 ++++ src/pages/CardList.tsx | 36 ----------------------------- src/pages/CardList/index.style.ts | 20 ++++++++++++++++ src/pages/CardList/index.tsx | 34 +++++++++++++++++++++++++++ src/pages/index.ts | 1 + src/router/router.tsx | 3 +-- 6 files changed, 61 insertions(+), 38 deletions(-) delete mode 100644 src/pages/CardList.tsx create mode 100644 src/pages/CardList/index.style.ts create mode 100644 src/pages/CardList/index.tsx diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index 3f86c571..cfb58eb8 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -34,12 +34,16 @@ export const Modal = styled.div` export const ModalHeader = styled.header` width: 100%; height: 70px; + padding: 10px; + display: flex; flex-direction: column; `; export const ModalBody = styled.div` width: 100%; + padding: 10px; + display: flex; flex-direction: column; flex-wrap: wrap; @@ -48,6 +52,7 @@ export const ModalBody = styled.div` export const ModalFooter = styled.footer` width: 100%; height: 70px; + padding: 10px; display: flex; flex-direction: column; diff --git a/src/pages/CardList.tsx b/src/pages/CardList.tsx deleted file mode 100644 index cdfae0ab..00000000 --- a/src/pages/CardList.tsx +++ /dev/null @@ -1,36 +0,0 @@ -const CardList = () => { - return ( -
-
-
-

보유 카드

-
-
-
-
- 클린카드 -
-
-
-
-
-
- 1111 - 2222 - oooo - oooo -
-
- 프롱이 - 12 / 23 -
-
-
-
- 법인카드 -
-
+
-
-
-
- ); -}; - -export default CardList; diff --git a/src/pages/CardList/index.style.ts b/src/pages/CardList/index.style.ts new file mode 100644 index 00000000..672710c1 --- /dev/null +++ b/src/pages/CardList/index.style.ts @@ -0,0 +1,20 @@ +import styled from '@emotion/styled'; + +export const HeaderText = styled.div` + font-size: 16px; +`; + +export const NoneCardText = styled.div` + color: ${({ theme }) => theme.color.grayFont}; + display: flex; + justify-content: center; +`; + +export const CardUl = styled.ul` + width: 100%; + min-height: 300px; + + display: flex; + flex-direction: column; + align-content: center; +`; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx new file mode 100644 index 00000000..fe10d918 --- /dev/null +++ b/src/pages/CardList/index.tsx @@ -0,0 +1,34 @@ +import { useSelector } from 'react-redux'; +import { Card, ModalBody, ModalHeader } from '../../components'; +import * as S from './index.style'; +import { RootState } from '../../store'; +import { useNavigate } from 'react-router-dom'; + +const CardList = () => { + const cards = useSelector((state: RootState) => state.cards); + const navigate = useNavigate(); + + return ( + <> + + 보유 카드 + + + + {cards.length > 0 ? ( + cards.map((card) => ) + ) : ( + 아직 보유중인 카드가 없어요. + )} + + navigate('/card-regist')} + /> + + + ); +}; + +export default CardList; diff --git a/src/pages/index.ts b/src/pages/index.ts index 2269bf5a..368146c6 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,2 +1,3 @@ export { default as Home } from './Home'; export { default as Payments } from './Payments'; +export { default as CardList } from './CardList'; diff --git a/src/router/router.tsx b/src/router/router.tsx index 85eaf307..9eff468f 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,6 +1,5 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home, Payments } from '../pages'; -import CardList from '../pages/CardList'; +import { Home, Payments, CardList } from '../pages'; import CardRegist from '../pages/CardRegist'; import CardAlias from '../pages/CardAlias'; From 55dfdb035d7ad71263c8998383ba068b5633c895 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sat, 20 Jul 2024 16:54:59 +0900 Subject: [PATCH 045/307] =?UTF-8?q?feat:=20InputWrapper=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InputWrapper/index.style.ts | 16 ++++++++++++++++ src/components/InputWrapper/index.tsx | 12 ++++++++++++ src/components/index.ts | 5 +++-- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/components/InputWrapper/index.style.ts create mode 100644 src/components/InputWrapper/index.tsx diff --git a/src/components/InputWrapper/index.style.ts b/src/components/InputWrapper/index.style.ts new file mode 100644 index 00000000..48456233 --- /dev/null +++ b/src/components/InputWrapper/index.style.ts @@ -0,0 +1,16 @@ +import styled from '@emotion/styled'; + +interface ContainerProps { + type: 'fill' | 'flushed'; +} + +export const Container = styled.div` + width: 100%; + height: 100%; + padding: 5px; + + background-color: ${({ theme, type }) => + type === 'fill' ? theme.color.grayBackground : 'transparent'}; + border-bottom: ${({ theme, type }) => + type === 'flushed' ? `1px solid ${theme.color.grayBackground}` : 'none'}; +`; diff --git a/src/components/InputWrapper/index.tsx b/src/components/InputWrapper/index.tsx new file mode 100644 index 00000000..d4cc68ed --- /dev/null +++ b/src/components/InputWrapper/index.tsx @@ -0,0 +1,12 @@ +import { PropsWithChildren } from 'react'; +import * as S from './index.style'; + +interface InputWrapperProps extends PropsWithChildren { + type?: 'fill' | 'flushed'; +} + +const InputWrapper = ({ type = 'fill', children }: InputWrapperProps) => { + return {children}; +}; + +export default InputWrapper; diff --git a/src/components/index.ts b/src/components/index.ts index 3cba3ea9..a0fa8e99 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,6 +1,7 @@ export { default as Button } from './Button'; export { default as Modal } from './Modal'; -export * from './Modal'; export { default as Information } from './Information'; -export * from './Information'; export { default as Card } from './Card'; +export { default as InputWrapper } from './InputWrapper'; +export * from './Modal'; +export * from './Information'; From c73b1b5645fccfd8409a605a399712b25fe93589 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sun, 21 Jul 2024 17:00:24 +0900 Subject: [PATCH 046/307] =?UTF-8?q?feat:=20Input=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Input/index.style.ts | 19 +++++++ src/components/Input/index.tsx | 65 ++++++++++++++++++++++ src/components/InputWrapper/index.style.ts | 7 ++- src/components/index.ts | 1 + 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/components/Input/index.style.ts create mode 100644 src/components/Input/index.tsx diff --git a/src/components/Input/index.style.ts b/src/components/Input/index.style.ts new file mode 100644 index 00000000..e4fd3872 --- /dev/null +++ b/src/components/Input/index.style.ts @@ -0,0 +1,19 @@ +import styled from '@emotion/styled'; + +interface InputProps { + textAlign: 'center' | 'left'; +} + +export const Input = styled.input` + width: 50px; + height: 100%; + background: transparent; + + padding: 5px; + border: none; + outline: none; + + font-size: 16px; + flex-grow: 1; + text-align: ${({ textAlign }) => textAlign}; +`; diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx new file mode 100644 index 00000000..216850e8 --- /dev/null +++ b/src/components/Input/index.tsx @@ -0,0 +1,65 @@ +import { + ChangeEvent, + HTMLInputTypeAttribute, + forwardRef, + useState, +} from 'react'; +import * as S from './index.style'; + +interface InputProps { + onChange?: (value: string) => void; + onComplete?: () => void; + defaultValue?: string; + maxLength?: number; + placeholder?: string; + type?: HTMLInputTypeAttribute; + textAlign?: 'center' | 'left'; + onlyNumber?: boolean; +} + +const Input = forwardRef( + ( + { + onChange, + onComplete, + defaultValue = '', + maxLength, + onlyNumber = false, + textAlign = 'left', + placeholder = '', + type = 'text', + }, + ref, + ) => { + const [value, setValue] = useState(defaultValue); + + const handleChange = (event: ChangeEvent) => { + const newValue = event.target.value; + if (onlyNumber && /^\d*$/.test(newValue)) { + setValue(newValue); + onChange && onChange(newValue); + } else { + setValue(newValue); + onChange && onChange(newValue); + } + if (maxLength && maxLength === newValue.length) { + onComplete && onComplete(); + } + }; + + return ( + + ); + }, +); + +export default Input; diff --git a/src/components/InputWrapper/index.style.ts b/src/components/InputWrapper/index.style.ts index 48456233..7a0fc954 100644 --- a/src/components/InputWrapper/index.style.ts +++ b/src/components/InputWrapper/index.style.ts @@ -7,10 +7,15 @@ interface ContainerProps { export const Container = styled.div` width: 100%; height: 100%; - padding: 5px; + padding: 10px; + border-radius: 5px; background-color: ${({ theme, type }) => type === 'fill' ? theme.color.grayBackground : 'transparent'}; border-bottom: ${({ theme, type }) => type === 'flushed' ? `1px solid ${theme.color.grayBackground}` : 'none'}; + + display: flex; + align-items: center; + flex-wrap: wrap; `; diff --git a/src/components/index.ts b/src/components/index.ts index a0fa8e99..323de64d 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -3,5 +3,6 @@ export { default as Modal } from './Modal'; export { default as Information } from './Information'; export { default as Card } from './Card'; export { default as InputWrapper } from './InputWrapper'; +export { default as Input } from './Input'; export * from './Modal'; export * from './Information'; From 1ecd135509da5d03ab1a499c257e6ef94a8ca642 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sun, 21 Jul 2024 17:00:39 +0900 Subject: [PATCH 047/307] =?UTF-8?q?chore:=20CardRegist=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EA=B2=BD=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 --- src/router/router.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/router/router.tsx b/src/router/router.tsx index 9eff468f..13833c7b 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,6 +1,5 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home, Payments, CardList } from '../pages'; -import CardRegist from '../pages/CardRegist'; +import { Home, Payments, CardList, CardRegist } from '../pages'; import CardAlias from '../pages/CardAlias'; const router = createBrowserRouter([ From 8aa538dec695593ca882686f720d1307126adfeb Mon Sep 17 00:00:00 2001 From: Suyeon Date: Sun, 21 Jul 2024 17:00:52 +0900 Subject: [PATCH 048/307] =?UTF-8?q?chore:=20password=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/types/index.ts b/src/types/index.ts index 3b54fbd9..19dd6095 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -22,3 +22,8 @@ export interface MyCard { cardUser: string; company: CardCompany; } + +export interface MyCardForm extends MyCard { + securityCode: string; + password: [string, string, string, string]; +} From 3fabcf84481997c8a089a9e5dfa741ac18b002af Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:42:42 +0900 Subject: [PATCH 049/307] =?UTF-8?q?feat:=20Input=20props=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - readonly 타입 추가 --- src/components/Input/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index 216850e8..b2a1b2ff 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -15,6 +15,7 @@ interface InputProps { type?: HTMLInputTypeAttribute; textAlign?: 'center' | 'left'; onlyNumber?: boolean; + readonly?: boolean; } const Input = forwardRef( @@ -28,6 +29,7 @@ const Input = forwardRef( textAlign = 'left', placeholder = '', type = 'text', + readonly = false, }, ref, ) => { @@ -56,6 +58,7 @@ const Input = forwardRef( value={value} onChange={handleChange} placeholder={placeholder} + readOnly={readonly} autoComplete='new-password' /> ); From 94054661ef7ee09d808abb37c7c9405460035f9f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:42:58 +0900 Subject: [PATCH 050/307] =?UTF-8?q?feat:=20shuffle=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/suffle.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/utils/suffle.ts diff --git a/src/utils/suffle.ts b/src/utils/suffle.ts new file mode 100644 index 00000000..ed1d8b90 --- /dev/null +++ b/src/utils/suffle.ts @@ -0,0 +1,9 @@ +const suffle = (arr: any[]) => { + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + return arr; +}; + +export default suffle; From c07ba400343714081a79f81de961343b0290c3cd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:43:32 +0900 Subject: [PATCH 051/307] =?UTF-8?q?feat:=20Keypad=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/index.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/types/index.ts b/src/types/index.ts index 19dd6095..868006b7 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -23,7 +23,22 @@ export interface MyCard { company: CardCompany; } +export type CardPassword = [string, string, string, string]; + export interface MyCardForm extends MyCard { securityCode: string; - password: [string, string, string, string]; + password: CardPassword; } + +export type KeypadNumbers = [ + number, + number, + number, + number, + number, + number, + number, + number, + number, + number, +]; From b0a74be105d933baf8c56fcfe912f5296c2b5612 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:43:45 +0900 Subject: [PATCH 052/307] =?UTF-8?q?feat:=20Keypad=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- src/components/Keypad/index.style.ts | 56 ++++++++++++++++++++++++++++ src/components/Keypad/index.tsx | 52 ++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/components/Keypad/index.style.ts create mode 100644 src/components/Keypad/index.tsx diff --git a/src/components/Keypad/index.style.ts b/src/components/Keypad/index.style.ts new file mode 100644 index 00000000..285915ce --- /dev/null +++ b/src/components/Keypad/index.style.ts @@ -0,0 +1,56 @@ +import styled from '@emotion/styled'; + +export const DeemBackground = styled.div` + position: absolute; + left: 0px; + top: 0px; + z-index: 2; + + width: 100%; + height: 100%; + background-color: ${({ theme }) => theme.color.deemBackground}; +`; + +export const KeypadContainer = styled.div` + width: 100%; + position: absolute; + left: 0px; + bottom: 0px; + + background-color: ${({ theme }) => theme.color.white}; + z-index: 3; + + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(3, 90px); +`; + +interface KeypadItemProps { + order: number; +} + +export const KeypadItem = styled.div` + color: ${({ theme }) => theme.color.mainGreen}; + + width: 100%; + padding: 30px 0px; + + display: flex; + justify-content: center; + align-items: center; + order: ${({ order }) => order}; + + cursor: pointer; +`; + +export const LeftEmptyItem = styled.div` + background-color: transparent; + border: none; + order: 8; +`; + +export const RightEmptyItem = styled.div` + background-color: transparent; + border: none; + order: 12; +`; diff --git a/src/components/Keypad/index.tsx b/src/components/Keypad/index.tsx new file mode 100644 index 00000000..77208501 --- /dev/null +++ b/src/components/Keypad/index.tsx @@ -0,0 +1,52 @@ +import { MouseEvent } from 'react'; +import * as S from './index.style'; +import { KeypadNumbers } from '../../types'; + +interface KeypadProps { + isOpen: boolean; + numbers?: KeypadNumbers; + onClose: () => void; + onClick?: (value: string) => void; +} + +const Keypad = ({ + isOpen, + onClick, + onClose, + numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], +}: KeypadProps) => { + const handleClickBackground = () => { + onClose && onClose(); + }; + const handleClickKeypad = (event: MouseEvent) => { + if (event.target instanceof HTMLDivElement) { + const $number = event.target; + + if ($number.classList.contains('keypad-item')) { + onClick && onClick($number.innerText); + } + } + }; + + return ( + isOpen && ( + + + {numbers.map((number, index) => ( + + {number} + + ))} + + + + + ) + ); +}; + +export default Keypad; From 9ebdc82d7d21cc750805567348888533b7de2703 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:44:02 +0900 Subject: [PATCH 053/307] =?UTF-8?q?feat:=20useModal=EC=97=90=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=EA=B0=92=20=EC=84=A4=EC=A0=95=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/useModal.tsx b/src/hooks/useModal.tsx index a7f22c55..d993aabf 100644 --- a/src/hooks/useModal.tsx +++ b/src/hooks/useModal.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; -const useModal = () => { - const [isOpen, setIsOpen] = useState(true); +const useModal = (initialOpen?: boolean) => { + const [isOpen, setIsOpen] = useState(initialOpen || false); const close = () => { setIsOpen(false); From d4abce40e1941d58503a097765a75af7e96fa49f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:44:16 +0900 Subject: [PATCH 054/307] =?UTF-8?q?feat:=20InputNumbers=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CardRegist/components/InputNumbers.tsx | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/pages/CardRegist/components/InputNumbers.tsx diff --git a/src/pages/CardRegist/components/InputNumbers.tsx b/src/pages/CardRegist/components/InputNumbers.tsx new file mode 100644 index 00000000..3138956f --- /dev/null +++ b/src/pages/CardRegist/components/InputNumbers.tsx @@ -0,0 +1,99 @@ +import { Controller, useFormContext } from 'react-hook-form'; +import { + Information, + InformationBody, + InformationHeader, + InputWrapper, +} from '../../../components'; +import * as S from '../index.style'; +import { Input } from '../../../components'; +import { useRef } from 'react'; + +const InputNumbers = () => { + const { control } = useFormContext(); + const firstInputRef = useRef(null); + const secondInputRef = useRef(null); + const thirdInputRef = useRef(null); + const fourthInputRef = useRef(null); + + return ( + + 카드 번호 + + + + ( + { + secondInputRef.current?.focus(); + }} + /> + )} + /> + ( + { + thirdInputRef.current?.focus(); + }} + /> + )} + /> + ( + { + fourthInputRef.current?.focus(); + }} + /> + )} + /> + ( + + )} + /> + + + + + ); +}; + +export default InputNumbers; From 866f95dca710d498fe3174513d363bf425f01acf Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:44:40 +0900 Subject: [PATCH 055/307] =?UTF-8?q?feat:=20=EB=B3=B4=EC=95=88=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20Input=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/InputSecurityCode.tsx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/pages/CardRegist/components/InputSecurityCode.tsx diff --git a/src/pages/CardRegist/components/InputSecurityCode.tsx b/src/pages/CardRegist/components/InputSecurityCode.tsx new file mode 100644 index 00000000..dac64e54 --- /dev/null +++ b/src/pages/CardRegist/components/InputSecurityCode.tsx @@ -0,0 +1,39 @@ +import { Controller, useFormContext } from 'react-hook-form'; +import { + Information, + InformationBody, + InformationHeader, + Input, + InputWrapper, +} from '../../../components'; +import * as S from '../index.style'; + +const InputSecurityCode = () => { + const { control } = useFormContext(); + + return ( + + 보안코드(CVC/CVV) + + + + ( + + )} + /> + + + + + ); +}; + +export default InputSecurityCode; From 1620dd7c2a8be124e7ea608d206b90bf8b58b234 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:44:52 +0900 Subject: [PATCH 056/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=86=8C?= =?UTF-8?q?=EC=9C=A0=EC=9E=90=20Input=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CardRegist/components/InputCardUser.tsx | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/pages/CardRegist/components/InputCardUser.tsx diff --git a/src/pages/CardRegist/components/InputCardUser.tsx b/src/pages/CardRegist/components/InputCardUser.tsx new file mode 100644 index 00000000..db605910 --- /dev/null +++ b/src/pages/CardRegist/components/InputCardUser.tsx @@ -0,0 +1,36 @@ +import { Controller, useFormContext } from 'react-hook-form'; +import { + Information, + InformationBody, + InformationHeader, + Input, + InputWrapper, +} from '../../../components'; + +const InputCardUser = () => { + const { control } = useFormContext(); + + return ( + + 카드 소유자이름(선택) + + + ( + + )} + /> + + + + ); +}; + +export default InputCardUser; From 1bc0eb3d8ca2e35c6e1cd6f98e4e1d0c8518088f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:45:42 +0900 Subject: [PATCH 057/307] =?UTF-8?q?style:=20=EB=AA=A8=EB=8B=AC=20=EB=AA=A8?= =?UTF-8?q?=EC=84=9C=EB=A6=AC=20radius=20=EC=A0=9C=EA=B1=B0=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/index.style.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index cfb58eb8..e683579f 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -20,8 +20,6 @@ export const Modal = styled.div` max-height: 100vh; overflow-y: scroll; - border-radius: 10px; - display: flex; justify-content: center; align-items: center; From 0e0341ad4118be6dc37218f99492286904c1c648 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:45:59 +0900 Subject: [PATCH 058/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=A7=8C?= =?UTF-8?q?=EB=A3=8C=EC=9D=BC=20Input=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CardRegist/components/InputEndDate.tsx | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/pages/CardRegist/components/InputEndDate.tsx diff --git a/src/pages/CardRegist/components/InputEndDate.tsx b/src/pages/CardRegist/components/InputEndDate.tsx new file mode 100644 index 00000000..c625cc32 --- /dev/null +++ b/src/pages/CardRegist/components/InputEndDate.tsx @@ -0,0 +1,64 @@ +import { useRef } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; +import { + Information, + InformationBody, + InformationHeader, + InputWrapper, + Input, +} from '../../../components'; +import * as S from '../index.style'; + +const InputEndDate = () => { + const { control } = useFormContext(); + const firstInputRef = useRef(null); + const secondInputRef = useRef(null); + + return ( + + 만료일 + + + + ( + { + secondInputRef.current?.focus(); + }} + /> + )} + /> + / + ( + + )} + /> + + + + + ); +}; + +export default InputEndDate; From 2f01c805b5f6b752bae0a9391602772bb52b4094 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:46:18 +0900 Subject: [PATCH 059/307] =?UTF-8?q?feat:=20InputWrapper=EC=97=90=20div=20?= =?UTF-8?q?=EC=97=98=EB=A6=AC=EB=A8=BC=ED=8A=B8=20props=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InputWrapper/index.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/InputWrapper/index.tsx b/src/components/InputWrapper/index.tsx index d4cc68ed..c6b55811 100644 --- a/src/components/InputWrapper/index.tsx +++ b/src/components/InputWrapper/index.tsx @@ -1,12 +1,20 @@ -import { PropsWithChildren } from 'react'; +import { HTMLAttributes, PropsWithChildren } from 'react'; import * as S from './index.style'; -interface InputWrapperProps extends PropsWithChildren { +interface InputWrapperProps extends HTMLAttributes { type?: 'fill' | 'flushed'; } -const InputWrapper = ({ type = 'fill', children }: InputWrapperProps) => { - return {children}; +const InputWrapper: React.FC> = ({ + type = 'fill', + children, + ...props +}) => { + return ( + + {children} + + ); }; export default InputWrapper; From 368dec00115679865bedc5c70d1603e196cf0ec0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 14:53:55 +0900 Subject: [PATCH 060/307] =?UTF-8?q?style:=20Modal=EC=97=90=20relative=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal/index.style.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index e683579f..d1bc66f5 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -19,6 +19,7 @@ export const Modal = styled.div` min-height: 250px; max-height: 100vh; overflow-y: scroll; + position: relative; display: flex; justify-content: center; From 57e195fa52250a56075eeb7ff5e7cbaee725a0ae Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 15:41:23 +0900 Subject: [PATCH 061/307] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=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 --- src/components/Input/index.style.ts | 12 ++- src/components/Input/index.tsx | 5 + src/components/Keypad/index.tsx | 27 +++--- src/components/index.ts | 2 + .../CardRegist/components/InputPassword.tsx | 92 +++++++++++++++++++ src/pages/CardRegist/components/index.ts | 5 + src/utils/suffle.ts | 2 +- 7 files changed, 129 insertions(+), 16 deletions(-) create mode 100644 src/pages/CardRegist/components/InputPassword.tsx create mode 100644 src/pages/CardRegist/components/index.ts diff --git a/src/components/Input/index.style.ts b/src/components/Input/index.style.ts index e4fd3872..de52ffb5 100644 --- a/src/components/Input/index.style.ts +++ b/src/components/Input/index.style.ts @@ -5,15 +5,19 @@ interface InputProps { } export const Input = styled.input` - width: 50px; + width: 10px; height: 100%; - background: transparent; + padding: 5px 0px; - padding: 5px; + background: transparent; border: none; outline: none; - font-size: 16px; + display: flex; + justify-content: center; + align-items: center; flex-grow: 1; + font-size: 16px; text-align: ${({ textAlign }) => textAlign}; + cursor: pointer; `; diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index b2a1b2ff..b0cf418f 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -2,6 +2,7 @@ import { ChangeEvent, HTMLInputTypeAttribute, forwardRef, + useEffect, useState, } from 'react'; import * as S from './index.style'; @@ -35,6 +36,10 @@ const Input = forwardRef( ) => { const [value, setValue] = useState(defaultValue); + useEffect(() => { + setValue(defaultValue); + }, [defaultValue]); + const handleChange = (event: ChangeEvent) => { const newValue = event.target.value; if (onlyNumber && /^\d*$/.test(newValue)) { diff --git a/src/components/Keypad/index.tsx b/src/components/Keypad/index.tsx index 77208501..407f8a77 100644 --- a/src/components/Keypad/index.tsx +++ b/src/components/Keypad/index.tsx @@ -4,33 +4,38 @@ import { KeypadNumbers } from '../../types'; interface KeypadProps { isOpen: boolean; + onClose?: () => void; numbers?: KeypadNumbers; - onClose: () => void; - onClick?: (value: string) => void; + index?: number; + onClick?: (value: string, index: number) => void; } const Keypad = ({ isOpen, onClick, onClose, + index = 0, numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], }: KeypadProps) => { - const handleClickBackground = () => { - onClose && onClose(); - }; - const handleClickKeypad = (event: MouseEvent) => { - if (event.target instanceof HTMLDivElement) { - const $number = event.target; + const handleClickBackground = (event: MouseEvent) => { + const { target } = event; - if ($number.classList.contains('keypad-item')) { - onClick && onClick($number.innerText); + if (target instanceof HTMLDivElement) { + if (target.classList.contains('keypad-item')) { + onClick && onClick(target.innerText, index); + } else if (target.classList.contains('keypad-background')) { + onClose && onClose(); } } }; + const handleClickKeypad = () => {}; return ( isOpen && ( - + {numbers.map((number, index) => ( { + const defaultNumbers: KeypadNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + const [password, setPassword] = useState(['', '', '', '']); + const [index, setIndex] = useState(0); + const { control } = useFormContext(); + const { isOpen, open, close } = useModal(false); + + useEffect(() => { + if (password.every((value) => value.length === 1)) { + close(); + } + }, [password, close]); + + useEffect(() => { + if (index > 3) { + close(); + } + }, [index, close]); + + const handleClickInput = (index: number) => { + setIndex(index); + open(); + }; + + const handleClickKeypad = (value: string, index: number) => { + const nextState: CardPassword = [...password]; + nextState.splice(index, 1, value); + + setPassword(nextState); + setIndex(index + 1); + }; + + return ( + + 카드 비밀번호 + + + {password.map((value, index) => ( + ( + + { + handleClickInput(index); + }} + > + + + + )} + /> + ))} + + { + close(); + }} + /> + + + ); +}; + +export default InputPassword; diff --git a/src/pages/CardRegist/components/index.ts b/src/pages/CardRegist/components/index.ts new file mode 100644 index 00000000..3e76f71d --- /dev/null +++ b/src/pages/CardRegist/components/index.ts @@ -0,0 +1,5 @@ +export { default as InputNumbers } from './InputNumbers'; +export { default as InputEndDate } from './InputEndDate'; +export { default as InputCardUser } from './InputCardUser'; +export { default as InputSecurityCode } from './InputSecurityCode'; +export { default as InputPassword } from './InputPassword'; diff --git a/src/utils/suffle.ts b/src/utils/suffle.ts index ed1d8b90..3a8fcd7d 100644 --- a/src/utils/suffle.ts +++ b/src/utils/suffle.ts @@ -1,4 +1,4 @@ -const suffle = (arr: any[]) => { +const suffle = >(arr: T) => { for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; From 5250f774a4bb72471731fa8f6ec8511a9abbed6e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 15:50:52 +0900 Subject: [PATCH 062/307] =?UTF-8?q?style:=20Information=20Header=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=20=ED=81=AC=EA=B8=B0=20=EC=A1=B0=EC=A0=95?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Information/InformationHeader.tsx | 2 +- src/components/Information/index.style.ts | 3 +-- src/pages/CardRegist/components/InputCardUser.tsx | 5 ++++- src/pages/CardRegist/components/InputEndDate.tsx | 4 +++- src/pages/CardRegist/components/InputNumbers.tsx | 4 +++- src/pages/CardRegist/components/InputPassword.tsx | 4 +++- src/pages/CardRegist/components/InputSecurityCode.tsx | 4 +++- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components/Information/InformationHeader.tsx b/src/components/Information/InformationHeader.tsx index 9c8681b4..ea6800d9 100644 --- a/src/components/Information/InformationHeader.tsx +++ b/src/components/Information/InformationHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import * as S from './index.style'; -interface InformationHeaderProps extends PropsWithChildren {} +export interface InformationHeaderProps extends PropsWithChildren {} const InformationHeader = ({ children }: InformationHeaderProps) => { return {children}; diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts index a3d947c5..14bda4e3 100644 --- a/src/components/Information/index.style.ts +++ b/src/components/Information/index.style.ts @@ -11,14 +11,13 @@ export const Information = styled.div` export const InformationHeader = styled.div` width: 100%; - padding: 10px 5px; + padding: 0px 5px; font-size: 20px; font-weight: bold; display: flex; flex-direction: column; - border-bottom: 2px solid ${({ theme }) => theme.color.grayBackground}; `; export const InformationBody = styled.div` diff --git a/src/pages/CardRegist/components/InputCardUser.tsx b/src/pages/CardRegist/components/InputCardUser.tsx index db605910..f9ae3db8 100644 --- a/src/pages/CardRegist/components/InputCardUser.tsx +++ b/src/pages/CardRegist/components/InputCardUser.tsx @@ -6,13 +6,16 @@ import { Input, InputWrapper, } from '../../../components'; +import * as S from '../index.style'; const InputCardUser = () => { const { control } = useFormContext(); return ( - 카드 소유자이름(선택) + + 카드 소유자이름(선택) + { return ( - 만료일 + + 만료일 + diff --git a/src/pages/CardRegist/components/InputNumbers.tsx b/src/pages/CardRegist/components/InputNumbers.tsx index 3138956f..fd88dca6 100644 --- a/src/pages/CardRegist/components/InputNumbers.tsx +++ b/src/pages/CardRegist/components/InputNumbers.tsx @@ -18,7 +18,9 @@ const InputNumbers = () => { return ( - 카드 번호 + + 카드 번호 + diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index f7af4a7c..b9b23f92 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -47,7 +47,9 @@ const InputPassword = () => { return ( - 카드 비밀번호 + + 카드 비밀번호 + {password.map((value, index) => ( diff --git a/src/pages/CardRegist/components/InputSecurityCode.tsx b/src/pages/CardRegist/components/InputSecurityCode.tsx index dac64e54..a8f38fdc 100644 --- a/src/pages/CardRegist/components/InputSecurityCode.tsx +++ b/src/pages/CardRegist/components/InputSecurityCode.tsx @@ -13,7 +13,9 @@ const InputSecurityCode = () => { return ( - 보안코드(CVC/CVV) + + 보안코드(CVC/CVV) + From efbd921e70830d0cdb43632810dfd340a2ed347d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 15:54:19 +0900 Subject: [PATCH 063/307] =?UTF-8?q?style:=20Information=20border=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=EC=9D=84=20Payments=EB=A1=9C=20=EC=98=AE?= =?UTF-8?q?=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Payments/components/PayAmountInformation.tsx | 4 +++- src/pages/Payments/components/PayCardInformation.tsx | 5 ++++- src/pages/Payments/components/PayTermInformation.tsx | 4 +++- src/pages/Payments/index.style.ts | 5 +++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/pages/Payments/components/PayAmountInformation.tsx b/src/pages/Payments/components/PayAmountInformation.tsx index 18b498d6..bb5f0787 100644 --- a/src/pages/Payments/components/PayAmountInformation.tsx +++ b/src/pages/Payments/components/PayAmountInformation.tsx @@ -8,7 +8,9 @@ import * as S from '../index.style'; const PayAmountInformation = () => { return ( - 결제 금액 + + 결제 금액 +
총 결제 금액
diff --git a/src/pages/Payments/components/PayCardInformation.tsx b/src/pages/Payments/components/PayCardInformation.tsx index 082c38a6..b93a572d 100644 --- a/src/pages/Payments/components/PayCardInformation.tsx +++ b/src/pages/Payments/components/PayCardInformation.tsx @@ -9,6 +9,7 @@ import CardSlider from '../../../components/CardSlider'; import { RootState } from '../../../store'; import { useNavigate } from 'react-router-dom'; import { Controller, useFormContext } from 'react-hook-form'; +import * as S from '../index.style'; const PayCardInfomation = () => { const navigate = useNavigate(); @@ -17,7 +18,9 @@ const PayCardInfomation = () => { return ( - 보유카드 + + 보유카드 + { return ( - 약관 이용 및 동의 + + 약관 이용 및 동의 +
거래정보 제공 동의:
diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts index 7fb2aefa..4f508e1f 100644 --- a/src/pages/Payments/index.style.ts +++ b/src/pages/Payments/index.style.ts @@ -35,3 +35,8 @@ export const TermInformationBottom = styled.div` font-size: 14px; `; + +export const TitleText = styled.div` + border-bottom: 2px solid ${({ theme }) => theme.color.grayBackground}; + padding: 5px 0px; +`; From 7153556ca8ba535e960cd9e72030db53b99a5472 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:38:22 +0900 Subject: [PATCH 064/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CardSelector/index.style.ts | 50 ++++++++++++++++++ src/components/CardSelector/index.tsx | 61 ++++++++++++++++++++++ src/components/index.ts | 1 + 3 files changed, 112 insertions(+) create mode 100644 src/components/CardSelector/index.style.ts create mode 100644 src/components/CardSelector/index.tsx diff --git a/src/components/CardSelector/index.style.ts b/src/components/CardSelector/index.style.ts new file mode 100644 index 00000000..b627c72b --- /dev/null +++ b/src/components/CardSelector/index.style.ts @@ -0,0 +1,50 @@ +import styled from '@emotion/styled'; +import { CardCompany } from '../../types'; + +export const DeemBackground = styled.div` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + background-color: ${({ theme }) => theme.color.deemBackground}; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: end; +`; + +export const Container = styled.div` + position: absolute; + bottom: 0; + + width: 100%; + + display: grid; + grid-template-columns: repeat(4, 1fr); + background-color: ${({ theme }) => theme.color.white}; +`; + +interface PaleteProps { + companey: CardCompany; +} + +export const PaleteItem = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 20px; +`; + +export const CompanyName = styled.div``; + +export const Color = styled.div` + width: 50px; + height: 50px; + border-radius: 50%; + background-color: ${({ theme, companey }) => theme.cardColor[companey]}; + cursor: pointer; +`; diff --git a/src/components/CardSelector/index.tsx b/src/components/CardSelector/index.tsx new file mode 100644 index 00000000..7ffd0c07 --- /dev/null +++ b/src/components/CardSelector/index.tsx @@ -0,0 +1,61 @@ +import * as S from './index.style'; +import { cardCompany } from '../../constants'; +import { MouseEvent } from 'react'; +import { CardCompany } from '../../types'; + +function isCardCompany(key: string): key is keyof typeof cardCompany { + return key in cardCompany; +} + +interface CardSelectorProps { + isOpen: boolean; + onClose?: () => void; + onClick?: (company: CardCompany) => void; +} + +const CardSelector = ({ isOpen, onClose, onClick }: CardSelectorProps) => { + const handleClick = (event: MouseEvent) => { + const { target } = event; + + if (target instanceof HTMLElement) { + if (target.classList.contains('palete-background')) { + onClose && onClose(); + return; + } + const $palateItem = target.closest('.palete-item'); + + if ($palateItem instanceof HTMLElement) { + const { company } = $palateItem.dataset; + + if (company) { + onClick && onClick(company as CardCompany); + onClose && onClose(); + } + } + } + }; + + return ( + isOpen && ( + + + {Object.entries(cardCompany).map( + ([key, value]) => + isCardCompany(key) && ( + + + {value} + + ), + )} + + + ) + ); +}; + +export default CardSelector; diff --git a/src/components/index.ts b/src/components/index.ts index 38d19ab8..615512dd 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -5,6 +5,7 @@ export { default as Card } from './Card'; export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; +export { default as CardSelector } from './CardSelector'; export * from './Modal'; export * from './Information'; export * from './Keypad'; From 056799424dc2a7786cb357e8970aabb47e1c5198 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:38:43 +0900 Subject: [PATCH 065/307] =?UTF-8?q?chore:=20=EC=B9=B4=EB=93=9C=20=ED=9A=8C?= =?UTF-8?q?=EC=82=AC=20=EC=83=81=EC=88=98=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants/index.ts | 10 ++++++++++ src/types/index.ts | 13 +++---------- 2 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 src/constants/index.ts diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 00000000..5bc29eaa --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,10 @@ +export const cardCompany = Object.freeze({ + suyeon: '수연카드', + sejin: '세진카드', + chanwook: '찬욱카드', + jonggil: '종길카드', + hyori: '효리카드', + hyesong: '혜성카드', + jingyeong: '진경카드', + geonwoo: '건우카드', +}); diff --git a/src/types/index.ts b/src/types/index.ts index 868006b7..204f9235 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,13 +1,6 @@ -export type CardCompany = - | 'none' - | 'suyeon' - | 'sejin' - | 'chanwook' - | 'jonggil' - | 'hyori' - | 'hyesong' - | 'jingyeong' - | 'geonwoo'; +import { cardCompany } from '../constants'; + +export type CardCompany = keyof typeof cardCompany | 'none'; export type CardNumber = [string, string, string, string]; From 6fa16565d54b54288cd037c94f105b05a4ed4c71 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:38:59 +0900 Subject: [PATCH 066/307] =?UTF-8?q?refactoring:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9D=84=20=ED=9A=8C=EC=82=AC=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A5=98=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.style.ts | 13 ++++++++----- src/components/Card/index.tsx | 27 +++++++++++++-------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 9fa04cbb..30821e73 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -2,7 +2,6 @@ import styled from '@emotion/styled'; import { CardCompany } from '../../types'; interface CardProps { - type: 'register' | 'empty'; size: 'small' | 'big'; company: CardCompany; clickable: boolean; @@ -31,11 +30,11 @@ export const Card = styled.div` height: ${({ size }) => (size === 'small' ? 130 : 180)}px; font-size: ${({ size }) => (size === 'small' ? 12 : 16)}px; - background: ${({ theme, type, company }) => - type === 'empty' ? theme.color.blackAlpha30 : theme.cardColor[company]}; + background: ${({ theme, company }) => + company === 'none' ? theme.color.blackAlpha30 : theme.cardColor[company]}; box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; - user-select: ${({ type }) => (type === 'empty' ? 'none' : 'auto')}; + user-select: ${({ company }) => (company === 'none' ? 'none' : 'auto')}; border-radius: 5px; padding: 10px 20px; @@ -82,7 +81,11 @@ export const CardNumberList = styled.div` justify-content: space-around; `; -export const CardNumberItem = styled.div``; +export const CardNumberItem = styled.div` + min-width: 30px; + flex-grow: 1; + text-align: center; +`; export const CardBottomLeft = styled.div``; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 164479ae..aaf712b7 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -1,8 +1,8 @@ +import { cardCompany } from '../../constants'; import { CardCompany, CardEndDate, CardNumber } from '../../types'; import * as S from './index.style'; interface CardProps { - type?: 'register' | 'empty'; numbers?: CardNumber; endDate?: CardEndDate; cardUser?: string; @@ -13,39 +13,40 @@ interface CardProps { } const Card = ({ - type = 'empty', size = 'small', company = 'none', - numbers = ['0000', '0000', '0000', '0000'], + numbers = ['', '', '', ''], endDate = { - month: '00', - day: '00', + month: 'MM', + day: 'YY', }, - cardUser = 'User', + cardUser = undefined, clickable = false, onClick, }: CardProps) => { const handleClickCard = () => { onClick && onClick(); }; + const editedNumbers = numbers.map((number, index) => + index < 2 ? number : '●'.repeat(number.length), + ); return ( - {type === 'register' ? ( + {company !== 'none' ? ( <> - {company} + {cardCompany[company]} - {numbers.map((number) => ( - {number} + {editedNumbers.map((number, index) => ( + {number} ))} @@ -57,9 +58,7 @@ const Card = ({ ) : ( - <> - add - + add )} From 0c1f66150f8b0884004b31a749bd22edb85e05b6 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:39:17 +0900 Subject: [PATCH 067/307] =?UTF-8?q?style:=20Information=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=ED=8C=A8=EB=94=A9=EA=B0=92=20?= =?UTF-8?q?=EC=97=86=EC=95=A0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Information/index.style.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts index 14bda4e3..ea3eac4b 100644 --- a/src/components/Information/index.style.ts +++ b/src/components/Information/index.style.ts @@ -11,7 +11,6 @@ export const Information = styled.div` export const InformationHeader = styled.div` width: 100%; - padding: 0px 5px; font-size: 20px; font-weight: bold; From 1ae841e07207baa95b1bbf73b5d86f949991821f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:40:07 +0900 Subject: [PATCH 068/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=ED=9A=8C?= =?UTF-8?q?=EC=82=AC=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/components/InputCard.tsx | 37 +++++++++++++++++++ .../CardRegist/components/InputEndDate.tsx | 2 +- .../CardRegist/components/InputNumbers.tsx | 8 ++-- .../CardRegist/components/InputPassword.tsx | 2 +- src/pages/CardRegist/components/index.ts | 1 + src/pages/CardRegist/index.style.ts | 33 +++++++++++++++++ 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 src/pages/CardRegist/components/InputCard.tsx create mode 100644 src/pages/CardRegist/index.style.ts diff --git a/src/pages/CardRegist/components/InputCard.tsx b/src/pages/CardRegist/components/InputCard.tsx new file mode 100644 index 00000000..84937256 --- /dev/null +++ b/src/pages/CardRegist/components/InputCard.tsx @@ -0,0 +1,37 @@ +import { Controller, useFormContext } from 'react-hook-form'; +import { Card, CardSelector } from '../../../components'; +import { useModal } from '../../../hooks'; + +const InputCard = () => { + const { control, watch } = useFormContext(); + const { isOpen, close, open } = useModal(true); + + return ( +
+ { + open(); + }} + /> + ( + { + close(); + }} + onClick={onChange} + /> + )} + /> +
+ ); +}; + +export default InputCard; diff --git a/src/pages/CardRegist/components/InputEndDate.tsx b/src/pages/CardRegist/components/InputEndDate.tsx index 99732cea..54b0ac89 100644 --- a/src/pages/CardRegist/components/InputEndDate.tsx +++ b/src/pages/CardRegist/components/InputEndDate.tsx @@ -42,7 +42,7 @@ const InputEndDate = () => { /> / ( diff --git a/src/pages/CardRegist/components/InputNumbers.tsx b/src/pages/CardRegist/components/InputNumbers.tsx index fd88dca6..8d9c4fb8 100644 --- a/src/pages/CardRegist/components/InputNumbers.tsx +++ b/src/pages/CardRegist/components/InputNumbers.tsx @@ -25,7 +25,7 @@ const InputNumbers = () => { ( @@ -42,7 +42,7 @@ const InputNumbers = () => { )} /> ( @@ -59,7 +59,7 @@ const InputNumbers = () => { )} /> ( @@ -77,7 +77,7 @@ const InputNumbers = () => { )} /> ( diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index b9b23f92..8e4fce68 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -54,7 +54,7 @@ const InputPassword = () => { {password.map((value, index) => ( ( diff --git a/src/pages/CardRegist/components/index.ts b/src/pages/CardRegist/components/index.ts index 3e76f71d..1be8c43f 100644 --- a/src/pages/CardRegist/components/index.ts +++ b/src/pages/CardRegist/components/index.ts @@ -3,3 +3,4 @@ export { default as InputEndDate } from './InputEndDate'; export { default as InputCardUser } from './InputCardUser'; export { default as InputSecurityCode } from './InputSecurityCode'; export { default as InputPassword } from './InputPassword'; +export { default as InputCard } from './InputCard'; diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts new file mode 100644 index 00000000..2b01aca0 --- /dev/null +++ b/src/pages/CardRegist/index.style.ts @@ -0,0 +1,33 @@ +import styled from '@emotion/styled'; + +export const Form = styled.form` + width: 100%; +`; + +export const InputNumbersContainer = styled.div` + width: 100%; +`; + +export const InputEndDateContainer = styled.div` + width: 150px; +`; + +export const InputSecurityCodeContainer = styled.div` + width: 100px; +`; + +export const InputPasswordListContainer = styled.div` + display: flex; + gap: 10px; +`; + +export const InputPasswordItemContainer = styled.div` + width: 50px; + display: flex; + gap: 5px; +`; + +export const TitleText = styled.span` + font-size: 16px; + font-weight: normal; +`; From 48c1ab4e004b6deab3b461210b2d55a1812a406e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 17:44:07 +0900 Subject: [PATCH 069/307] =?UTF-8?q?refactoring:=20Card=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist.tsx | 74 ------------------- src/pages/CardRegist/components/InputCard.tsx | 22 ++---- src/pages/CardRegist/index.tsx | 60 +++++++++++++++ src/pages/index.ts | 1 + 4 files changed, 69 insertions(+), 88 deletions(-) delete mode 100644 src/pages/CardRegist.tsx create mode 100644 src/pages/CardRegist/index.tsx diff --git a/src/pages/CardRegist.tsx b/src/pages/CardRegist.tsx deleted file mode 100644 index 08803fa1..00000000 --- a/src/pages/CardRegist.tsx +++ /dev/null @@ -1,74 +0,0 @@ -const CardRegist = () => { - return ( -
-
-

카드 추가

-
-
-
- 클린카드 -
-
-
-
-
-
- 1111 - 2222 - oooo - oooo -
-
- 프롱이 - 12 / 23 -
-
-
-
-
- 카드 번호 -
- - - - -
-
-
- 만료일 -
- - -
-
-
- 카드 소유자 이름(선택) - -
-
- 보안코드(CVC/CVV) - -
-
- 카드 비밀번호 - - - - -
-
- 다음 -
-
-
- ); -}; - -export default CardRegist; diff --git a/src/pages/CardRegist/components/InputCard.tsx b/src/pages/CardRegist/components/InputCard.tsx index 84937256..b9cf4eeb 100644 --- a/src/pages/CardRegist/components/InputCard.tsx +++ b/src/pages/CardRegist/components/InputCard.tsx @@ -1,22 +1,16 @@ import { Controller, useFormContext } from 'react-hook-form'; -import { Card, CardSelector } from '../../../components'; -import { useModal } from '../../../hooks'; +import { CardSelector } from '../../../components'; -const InputCard = () => { - const { control, watch } = useFormContext(); - const { isOpen, close, open } = useModal(true); +interface InputCardProps { + isOpen: boolean; + close: () => void; +} + +const InputCard = ({ isOpen, close }: InputCardProps) => { + const { control } = useFormContext(); return (
- { - open(); - }} - /> { + const methods = useForm({ + defaultValues: { + numbers: ['', '', '', ''], + endDate: { month: '', day: '' }, + cardUser: '', + company: 'none', + securityCode: '', + password: ['', '', '', ''], + }, + }); + const { watch } = methods; + const { isOpen, close, open } = useModal(true); + + return ( + <> + +

카드 추가

+
+ + { + open(); + }} + /> + + + + + + + + + + + + + + ); +}; + +export default CardRegist; diff --git a/src/pages/index.ts b/src/pages/index.ts index 368146c6..524623a0 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,3 +1,4 @@ export { default as Home } from './Home'; export { default as Payments } from './Payments'; export { default as CardList } from './CardList'; +export { default as CardRegist } from './CardRegist'; From 9e20581860ce850e9e46a1ad0d72300233c93fbf Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 22:22:25 +0900 Subject: [PATCH 070/307] =?UTF-8?q?feat:=20CardAlias=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardAlias.tsx | 63 ------------------------------ src/pages/CardAlias/index.style.ts | 39 ++++++++++++++++++ src/pages/CardAlias/index.tsx | 47 ++++++++++++++++++++++ src/pages/index.ts | 1 + src/router/router.tsx | 3 +- 5 files changed, 88 insertions(+), 65 deletions(-) delete mode 100644 src/pages/CardAlias.tsx create mode 100644 src/pages/CardAlias/index.style.ts create mode 100644 src/pages/CardAlias/index.tsx diff --git a/src/pages/CardAlias.tsx b/src/pages/CardAlias.tsx deleted file mode 100644 index 9940b011..00000000 --- a/src/pages/CardAlias.tsx +++ /dev/null @@ -1,63 +0,0 @@ -const CardAlias = () => { - return ( -
-
-

카드 추가

-
-
-
-
-
-
-
-
- NAME - MM / YY -
-
-
-
-
- 카드 번호 -
- - - - -
-
-
- 만료일 -
- - -
-
-
- 카드 소유자 이름(선택) - -
-
- 보안코드(CVC/CVV) - -
-
- 카드 비밀번호 - - - - -
-
- 다음 -
-
-
- ); -}; - -export default CardAlias; diff --git a/src/pages/CardAlias/index.style.ts b/src/pages/CardAlias/index.style.ts new file mode 100644 index 00000000..81409890 --- /dev/null +++ b/src/pages/CardAlias/index.style.ts @@ -0,0 +1,39 @@ +import styled from '@emotion/styled'; + +export const BodyContainer = styled.div` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + position: relative; +`; + +export const ContentContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; + +export const TextContainer = styled.div` + height: 100px; + display: flex; + justify-content: center; + align-items: center; +`; + +export const CompleteText = styled.span` + font-size: 24px; +`; + +export const InputContainer = styled.div` + width: 300px; +`; + +export const ButtonContainer = styled.div` + width: 100%; + display: flex; + justify-content: flex-end; +`; diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx new file mode 100644 index 00000000..bd4a9d4b --- /dev/null +++ b/src/pages/CardAlias/index.tsx @@ -0,0 +1,47 @@ +import { useNavigate } from 'react-router-dom'; +import { + Button, + Card, + Input, + InputWrapper, + ModalBody, + ModalFooter, +} from '../../components'; +import * as S from './index.style'; + +const CardAlias = () => { + const navigate = useNavigate(); + + return ( + <> + + + + + 카드등록이 완료되었습니다. + + + + + + + + + + + + + + + + + ); +}; + +export default CardAlias; diff --git a/src/pages/index.ts b/src/pages/index.ts index 524623a0..b6e076e9 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -2,3 +2,4 @@ export { default as Home } from './Home'; export { default as Payments } from './Payments'; export { default as CardList } from './CardList'; export { default as CardRegist } from './CardRegist'; +export { default as CardAlias } from './CardAlias'; diff --git a/src/router/router.tsx b/src/router/router.tsx index 13833c7b..481012c3 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,6 +1,5 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home, Payments, CardList, CardRegist } from '../pages'; -import CardAlias from '../pages/CardAlias'; +import { Home, Payments, CardList, CardRegist, CardAlias } from '../pages'; const router = createBrowserRouter([ { From 602b7b534d275410c2144d8a524727ade1c21c18 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 22 Jul 2024 22:22:34 +0900 Subject: [PATCH 071/307] =?UTF-8?q?style:=EC=A0=84=EC=B2=B4=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Information/index.style.ts | 1 - src/components/Input/index.style.ts | 1 - src/components/Modal/index.style.ts | 9 +++--- src/pages/CardList/index.style.ts | 1 - src/pages/CardList/index.tsx | 6 +--- src/pages/CardRegist/index.style.ts | 5 +++ src/pages/CardRegist/index.tsx | 22 +++++++++++-- src/pages/Home/index.style.ts | 8 +++++ src/pages/Home/index.tsx | 4 ++- src/pages/Payments/index.style.ts | 7 +++++ src/pages/Payments/index.tsx | 38 ++++++++++++----------- 11 files changed, 69 insertions(+), 33 deletions(-) diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts index ea3eac4b..402ac2c0 100644 --- a/src/components/Information/index.style.ts +++ b/src/components/Information/index.style.ts @@ -13,7 +13,6 @@ export const InformationHeader = styled.div` width: 100%; font-size: 20px; - font-weight: bold; display: flex; flex-direction: column; diff --git a/src/components/Input/index.style.ts b/src/components/Input/index.style.ts index de52ffb5..b92c817f 100644 --- a/src/components/Input/index.style.ts +++ b/src/components/Input/index.style.ts @@ -19,5 +19,4 @@ export const Input = styled.input` flex-grow: 1; font-size: 16px; text-align: ${({ textAlign }) => textAlign}; - cursor: pointer; `; diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts index d1bc66f5..38705b8d 100644 --- a/src/components/Modal/index.style.ts +++ b/src/components/Modal/index.style.ts @@ -22,7 +22,7 @@ export const Modal = styled.div` position: relative; display: flex; - justify-content: center; + flex-direction: column; align-items: center; flex-wrap: wrap; @@ -46,13 +46,14 @@ export const ModalBody = styled.div` display: flex; flex-direction: column; flex-wrap: wrap; + flex-grow: 1; `; export const ModalFooter = styled.footer` width: 100%; - height: 70px; - padding: 10px; + padding: 20px; + + bottom: 0px; display: flex; - flex-direction: column; `; diff --git a/src/pages/CardList/index.style.ts b/src/pages/CardList/index.style.ts index 672710c1..46ed5a3e 100644 --- a/src/pages/CardList/index.style.ts +++ b/src/pages/CardList/index.style.ts @@ -12,7 +12,6 @@ export const NoneCardText = styled.div` export const CardUl = styled.ul` width: 100%; - min-height: 300px; display: flex; flex-direction: column; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index fe10d918..c3b31dd7 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -21,11 +21,7 @@ const CardList = () => { 아직 보유중인 카드가 없어요. )} - navigate('/card-regist')} - /> + navigate('/card-regist')} /> ); diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index 2b01aca0..d02463aa 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -4,6 +4,11 @@ export const Form = styled.form` width: 100%; `; +export const FooterButtonContainer = styled.div` + display: flex; + justify-content: end; +`; + export const InputNumbersContainer = styled.div` width: 100%; `; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 6f4390a3..987dfd8c 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -1,5 +1,11 @@ import { FormProvider, useForm } from 'react-hook-form'; -import { ModalBody, ModalFooter, ModalHeader, Card } from '../../components'; +import { + ModalBody, + ModalFooter, + ModalHeader, + Card, + Button, +} from '../../components'; import * as S from './index.style'; import { MyCardForm } from '../../types'; import { @@ -11,6 +17,7 @@ import { InputCard, } from './components'; import { useModal } from '../../hooks'; +import { useNavigate } from 'react-router-dom'; const CardRegist = () => { const methods = useForm({ @@ -24,6 +31,7 @@ const CardRegist = () => { }, }); const { watch } = methods; + const navigate = useNavigate(); const { isOpen, close, open } = useModal(true); return ( @@ -52,7 +60,17 @@ const CardRegist = () => { - + + + + + ); }; diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts index 54e556c1..6b9b77fb 100644 --- a/src/pages/Home/index.style.ts +++ b/src/pages/Home/index.style.ts @@ -14,3 +14,11 @@ export const ButtonLabel = styled.div` align-items: center; font-size: 16px; `; + +export const ContentContainer = styled.div` + width: 400px; + height: 700px; + overflow-y: scroll; + display: flex; + flex-direction: column; +`; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index dca4b41e..c0795941 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -18,7 +18,9 @@ const Home = () => { 열기 - + + + ); diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payments/index.style.ts index 4f508e1f..6c433e79 100644 --- a/src/pages/Payments/index.style.ts +++ b/src/pages/Payments/index.style.ts @@ -4,7 +4,14 @@ export const Form = styled.form` width: 100%; `; +export const InformationList = styled.div` + display: flex; + flex-direction: column; + gap: 20px; +`; + export const ButtonContainer = styled.div` + margin-top: 30px; width: 100%; display: flex; justify-content: center; diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 8795ef67..43baec55 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -25,26 +25,28 @@ const Payments = () => { return ( <> - - - + Pay 결제 + + - - - + + + + + - - - - - - - - + + + + + + + + ); }; From bb3698b39c8fc6fb9a3086dfc4faf0512f2449e9 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 15:23:08 +0900 Subject: [PATCH 072/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EC=8B=9C=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Input/index.tsx | 5 +- src/components/InputWrapper/index.style.ts | 3 ++ src/components/InputWrapper/index.tsx | 4 +- .../CardRegist/components/InputEndDate.tsx | 12 +++-- .../CardRegist/components/InputNumbers.tsx | 48 ++++++++++++++----- .../CardRegist/components/InputPassword.tsx | 28 ++++++++++- .../components/InputSecurityCode.tsx | 15 +++++- src/pages/CardRegist/index.tsx | 1 + src/styles/color.ts | 1 + src/types/index.ts | 2 +- 10 files changed, 99 insertions(+), 20 deletions(-) diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index b0cf418f..d1d482cc 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -10,6 +10,7 @@ import * as S from './index.style'; interface InputProps { onChange?: (value: string) => void; onComplete?: () => void; + onBlur?: () => void; defaultValue?: string; maxLength?: number; placeholder?: string; @@ -24,6 +25,7 @@ const Input = forwardRef( { onChange, onComplete, + onBlur, defaultValue = '', maxLength, onlyNumber = false, @@ -45,7 +47,7 @@ const Input = forwardRef( if (onlyNumber && /^\d*$/.test(newValue)) { setValue(newValue); onChange && onChange(newValue); - } else { + } else if (!onlyNumber) { setValue(newValue); onChange && onChange(newValue); } @@ -61,6 +63,7 @@ const Input = forwardRef( maxLength={maxLength} type={type} value={value} + onBlur={onBlur} onChange={handleChange} placeholder={placeholder} readOnly={readonly} diff --git a/src/components/InputWrapper/index.style.ts b/src/components/InputWrapper/index.style.ts index 7a0fc954..eefd8b6f 100644 --- a/src/components/InputWrapper/index.style.ts +++ b/src/components/InputWrapper/index.style.ts @@ -2,6 +2,7 @@ import styled from '@emotion/styled'; interface ContainerProps { type: 'fill' | 'flushed'; + isInvalidation?: boolean; } export const Container = styled.div` @@ -14,6 +15,8 @@ export const Container = styled.div` type === 'fill' ? theme.color.grayBackground : 'transparent'}; border-bottom: ${({ theme, type }) => type === 'flushed' ? `1px solid ${theme.color.grayBackground}` : 'none'}; + border: ${({ theme, isInvalidation }) => + isInvalidation ? `2px solid ${theme.color.red}` : 'none'}; display: flex; align-items: center; diff --git a/src/components/InputWrapper/index.tsx b/src/components/InputWrapper/index.tsx index c6b55811..6fd21e34 100644 --- a/src/components/InputWrapper/index.tsx +++ b/src/components/InputWrapper/index.tsx @@ -3,15 +3,17 @@ import * as S from './index.style'; interface InputWrapperProps extends HTMLAttributes { type?: 'fill' | 'flushed'; + isInvalidation?: boolean; } const InputWrapper: React.FC> = ({ type = 'fill', + isInvalidation = false, children, ...props }) => { return ( - + {children} ); diff --git a/src/pages/CardRegist/components/InputEndDate.tsx b/src/pages/CardRegist/components/InputEndDate.tsx index 54b0ac89..01349a93 100644 --- a/src/pages/CardRegist/components/InputEndDate.tsx +++ b/src/pages/CardRegist/components/InputEndDate.tsx @@ -1,4 +1,4 @@ -import { useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { Information, @@ -10,9 +10,15 @@ import { import * as S from '../index.style'; const InputEndDate = () => { - const { control } = useFormContext(); + const { control, getFieldState, formState } = useFormContext(); + const [isInvalidation, setIsInvalidation] = useState(false); const firstInputRef = useRef(null); const secondInputRef = useRef(null); + const { invalid } = getFieldState('endDate', formState); + + useEffect(() => { + setIsInvalidation(invalid); + }, [invalid]); return ( @@ -21,7 +27,7 @@ const InputEndDate = () => { - + { - const { control } = useFormContext(); + const { control, getFieldState, formState } = useFormContext(); + const [isInvalidation, setIsInvalidation] = useState(false); const firstInputRef = useRef(null); const secondInputRef = useRef(null); const thirdInputRef = useRef(null); const fourthInputRef = useRef(null); + const { invalid } = getFieldState('numbers', formState); + + useEffect(() => { + setIsInvalidation(invalid); + }, [invalid]); return ( @@ -23,16 +29,21 @@ const InputNumbers = () => { - + value.length === 4, + required: true, + }} control={control} - render={({ field: { onChange } }) => ( + render={({ field: { value, onChange, onBlur } }) => ( { @@ -43,13 +54,18 @@ const InputNumbers = () => { /> value.length === 4, + required: true, + }} control={control} - render={({ field: { onChange } }) => ( + render={({ field: { value, onChange, onBlur } }) => ( { @@ -60,14 +76,19 @@ const InputNumbers = () => { /> value.length === 4, + required: true, + }} control={control} - render={({ field: { onChange } }) => ( + render={({ field: { value, onChange, onBlur } }) => ( { @@ -78,15 +99,20 @@ const InputNumbers = () => { /> value.length === 4, + required: true, + }} control={control} - render={({ field: { onChange } }) => ( + render={({ field: { value, onChange, onBlur } }) => ( )} diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index 8e4fce68..d01eeeae 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -15,14 +15,19 @@ import suffle from '../../../utils/suffle'; const InputPassword = () => { const defaultNumbers: KeypadNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - const [password, setPassword] = useState(['', '', '', '']); + const [password, setPassword] = useState(['', '']); const [index, setIndex] = useState(0); + const [isInvalidation, setIsInvalidation] = useState(false); const { control } = useFormContext(); const { isOpen, open, close } = useModal(false); useEffect(() => { if (password.every((value) => value.length === 1)) { + setIsInvalidation(false); close(); + return; + } else if (password.some((value) => value.length === 1)) { + setIsInvalidation(true); } }, [password, close]); @@ -55,10 +60,15 @@ const InputPassword = () => { {password.map((value, index) => ( value.length === 1, + }} control={control} render={({ field: { onChange } }) => ( { handleClickInput(index); }} @@ -76,6 +86,22 @@ const InputPassword = () => { )} /> ))} + + + + + + { - const { control } = useFormContext(); + const { control, getFieldState, formState } = useFormContext(); + const [isInvalidation, setIsInvalidation] = useState(false); + const { invalid } = getFieldState('securityCode', formState); + + useEffect(() => { + setIsInvalidation(invalid); + }, [invalid]); return ( @@ -18,10 +25,14 @@ const InputSecurityCode = () => { - + value.length === 3, + }} render={({ field: { onChange } }) => ( { securityCode: '', password: ['', '', '', ''], }, + mode: 'onChange', }); const { watch } = methods; const navigate = useNavigate(); diff --git a/src/styles/color.ts b/src/styles/color.ts index 80ef29ef..60b098fa 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -6,6 +6,7 @@ const color = { grayFont: '#575757', blackAlpha30: '#00000030', darkYellow: '#cbba64', + red: '#E24141', }; export default color; diff --git a/src/types/index.ts b/src/types/index.ts index 204f9235..80125058 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -16,7 +16,7 @@ export interface MyCard { company: CardCompany; } -export type CardPassword = [string, string, string, string]; +export type CardPassword = [string, string]; export interface MyCardForm extends MyCard { securityCode: string; From bdc70f99e4c1982e0681b3084e3d1ab2860b8633 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 15:57:04 +0900 Subject: [PATCH 073/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Input/index.tsx | 3 +- src/pages/CardAlias/index.tsx | 17 +++++++++-- .../CardRegist/components/InputPassword.tsx | 4 +-- src/pages/CardRegist/index.tsx | 30 ++++++++++++------- src/router/router.tsx | 2 +- src/store/index.ts | 18 ++++++++--- src/types/index.ts | 1 + src/utils/generateID.ts | 5 ++++ 8 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 src/utils/generateID.ts diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index d1d482cc..59c8062a 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -40,7 +40,8 @@ const Input = forwardRef( useEffect(() => { setValue(defaultValue); - }, [defaultValue]); + onChange && onChange(defaultValue); + }, [onChange, defaultValue]); const handleChange = (event: ChangeEvent) => { const newValue = event.target.value; diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index bd4a9d4b..9c6b6eba 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -1,4 +1,4 @@ -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { Button, Card, @@ -8,9 +8,17 @@ import { ModalFooter, } from '../../components'; import * as S from './index.style'; +import { useSelector } from 'react-redux'; +import { CardState, RootState } from '../../store'; const CardAlias = () => { const navigate = useNavigate(); + const params = useParams(); + console.log(params); + const { id } = params; + const targetCard = useSelector((state: RootState) => { + return state.cards.find((card) => card.id === id) as CardState; + }); return ( <> @@ -20,10 +28,13 @@ const CardAlias = () => { 카드등록이 완료되었습니다. - + - + diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index d01eeeae..eeb80474 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -44,7 +44,7 @@ const InputPassword = () => { const handleClickKeypad = (value: string, index: number) => { const nextState: CardPassword = [...password]; - nextState.splice(index, 1, value); + nextState[index] = value; setPassword(nextState); setIndex(index + 1); @@ -59,7 +59,7 @@ const InputPassword = () => { {password.map((value, index) => ( value.length === 1, diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 0b21a326..6280f170 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -18,6 +18,9 @@ import { } from './components'; import { useModal } from '../../hooks'; import { useNavigate } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; +import { addCard } from '../../store'; +import generateID from '../../utils/generateId'; const CardRegist = () => { const methods = useForm({ @@ -27,13 +30,14 @@ const CardRegist = () => { cardUser: '', company: 'none', securityCode: '', - password: ['', '', '', ''], + password: ['', ''], }, mode: 'onChange', }); - const { watch } = methods; + const { watch, formState, getValues } = methods; const navigate = useNavigate(); const { isOpen, close, open } = useModal(true); + const dispatch = useDispatch(); return ( <> @@ -62,15 +66,19 @@ const CardRegist = () => { - - - + {Object.values(formState.errors).length === 0 && ( + + + + )} ); diff --git a/src/router/router.tsx b/src/router/router.tsx index 481012c3..0fad8ad5 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -9,7 +9,7 @@ const router = createBrowserRouter([ { element: , path: '/payments' }, { element: , path: '/card-list' }, { element: , path: '/card-regist' }, - { element: , path: '/card-alias' }, + { element: , path: '/card-alias/:id' }, ], }, ]); diff --git a/src/store/index.ts b/src/store/index.ts index 6ca5d557..3e043e77 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,18 +1,26 @@ import { configureStore, createSlice } from '@reduxjs/toolkit'; import { MyCard } from '../types'; -interface CardState { - cards: MyCard[]; +export type CardState = MyCard & { id: string }; + +interface CardsState { + cards: CardState[]; } -const initialCard: CardState = { +const initialCard: CardsState = { cards: [], }; const cardSlice = createSlice({ name: 'cards', initialState: initialCard, - reducers: {}, + reducers: { + addCard: (state, actions) => { + const { card } = actions.payload; + console.log(card); + state.cards.push(card); + }, + }, }); export type RootState = ReturnType; @@ -20,4 +28,6 @@ const store = configureStore({ reducer: cardSlice.reducer, }); +export const { addCard } = cardSlice.actions; + export default store; diff --git a/src/types/index.ts b/src/types/index.ts index 80125058..956c1c93 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -14,6 +14,7 @@ export interface MyCard { endDate: CardEndDate; cardUser: string; company: CardCompany; + cardAlias?: string; } export type CardPassword = [string, string]; diff --git a/src/utils/generateID.ts b/src/utils/generateID.ts new file mode 100644 index 00000000..c9360af7 --- /dev/null +++ b/src/utils/generateID.ts @@ -0,0 +1,5 @@ +const generateID = () => { + return Math.random().toString(36).substring(2, 9); +}; + +export default generateID; From 4915c9ebe2e75669c133c722c9c72bdef9f4d42a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 16:05:24 +0900 Subject: [PATCH 074/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardAlias/index.tsx | 9 +++++++-- src/pages/CardList/index.style.ts | 13 +++++++++++++ src/pages/CardList/index.tsx | 18 +++++++++++++++--- src/store/index.ts | 13 ++++++++++++- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 9c6b6eba..d0f197bc 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -9,16 +9,19 @@ import { } from '../../components'; import * as S from './index.style'; import { useSelector } from 'react-redux'; -import { CardState, RootState } from '../../store'; +import { addCardName, CardState, RootState } from '../../store'; +import { useDispatch } from 'react-redux'; +import { useRef } from 'react'; const CardAlias = () => { const navigate = useNavigate(); const params = useParams(); - console.log(params); + const dispatch = useDispatch(); const { id } = params; const targetCard = useSelector((state: RootState) => { return state.cards.find((card) => card.id === id) as CardState; }); + const inputRef = useRef(null); return ( <> @@ -32,6 +35,7 @@ const CardAlias = () => { @@ -45,6 +49,7 @@ const CardAlias = () => { + + + )) ) : ( 아직 보유중인 카드가 없어요. )} diff --git a/src/store/index.ts b/src/store/index.ts index 3e043e77..1cab0ee7 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -20,6 +20,17 @@ const cardSlice = createSlice({ console.log(card); state.cards.push(card); }, + removeCard: (state, actions) => { + const { id } = actions.payload; + state.cards = state.cards.filter((card) => card.id !== id); + }, + addCardName: (state, actions) => { + const { id, cardAlias } = actions.payload; + const targetCard = state.cards.find((card) => card.id === id); + if (targetCard) { + targetCard.cardAlias = cardAlias; + } + }, }, }); @@ -28,6 +39,6 @@ const store = configureStore({ reducer: cardSlice.reducer, }); -export const { addCard } = cardSlice.actions; +export const { addCard, removeCard, addCardName } = cardSlice.actions; export default store; From f075a328eb8491133242f5a8acfac92ee8f76143 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 16:34:24 +0900 Subject: [PATCH 075/307] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PrevIcon/index.tsx | 17 +++++++++++++++++ src/components/index.ts | 1 + src/pages/CardList/index.style.ts | 2 ++ src/pages/CardList/index.tsx | 13 +++++++++++-- src/pages/CardRegist/index.style.ts | 7 +++++++ src/pages/CardRegist/index.tsx | 8 ++++++-- 6 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/components/PrevIcon/index.tsx diff --git a/src/components/PrevIcon/index.tsx b/src/components/PrevIcon/index.tsx new file mode 100644 index 00000000..7bd58f6e --- /dev/null +++ b/src/components/PrevIcon/index.tsx @@ -0,0 +1,17 @@ +interface PrevIconProps { + onClick?: () => void; +} + +const PrevIcon = ({ onClick }: PrevIconProps) => { + const handleClick = () => { + onClick && onClick(); + }; + + return ( + + arrow_back + + ); +}; + +export default PrevIcon; diff --git a/src/components/index.ts b/src/components/index.ts index 615512dd..a17423b8 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -6,6 +6,7 @@ export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; export { default as CardSelector } from './CardSelector'; +export { default as PrevIcon } from './PrevIcon'; export * from './Modal'; export * from './Information'; export * from './Keypad'; diff --git a/src/pages/CardList/index.style.ts b/src/pages/CardList/index.style.ts index 8c9bbfe9..5106cfff 100644 --- a/src/pages/CardList/index.style.ts +++ b/src/pages/CardList/index.style.ts @@ -1,6 +1,8 @@ import styled from '@emotion/styled'; export const HeaderText = styled.div` + display: flex; + align-items: center; font-size: 16px; `; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 2950f3e6..f76316d2 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -1,5 +1,11 @@ import { useSelector } from 'react-redux'; -import { Button, Card, ModalBody, ModalHeader } from '../../components'; +import { + Button, + Card, + ModalBody, + ModalHeader, + PrevIcon, +} from '../../components'; import * as S from './index.style'; import { removeCard, RootState } from '../../store'; import { useNavigate } from 'react-router-dom'; @@ -13,7 +19,10 @@ const CardList = () => { return ( <> - 보유 카드 + + navigate('/payments')} /> + 보유 카드 + diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index d02463aa..f9801ab1 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -1,5 +1,12 @@ import styled from '@emotion/styled'; +export const HeaderTitleText = styled.div` + font-size: 16px; + font-weight: normal; + display: flex; + align-items: center; +`; + export const Form = styled.form` width: 100%; `; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 6280f170..ed6e9fc6 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -5,6 +5,7 @@ import { ModalHeader, Card, Button, + PrevIcon, } from '../../components'; import * as S from './index.style'; import { MyCardForm } from '../../types'; @@ -20,7 +21,7 @@ import { useModal } from '../../hooks'; import { useNavigate } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import { addCard } from '../../store'; -import generateID from '../../utils/generateId'; +import generateID from '../../utils/generateID'; const CardRegist = () => { const methods = useForm({ @@ -42,7 +43,10 @@ const CardRegist = () => { return ( <> -

카드 추가

+ + navigate('/card-list')} /> + 카드 추가 +
Date: Tue, 23 Jul 2024 16:35:58 +0900 Subject: [PATCH 076/307] =?UTF-8?q?feat:=20InputPassword=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=EA=B0=80=20=EA=B0=92=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=B4=88=EA=B8=B0=EC=97=90=EB=8F=84=20?= =?UTF-8?q?=EC=9D=B4=EB=A4=84=EC=A7=80=EB=8F=84=EB=A1=9D=20=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/components/InputPassword.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index eeb80474..75b300a7 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -25,8 +25,7 @@ const InputPassword = () => { if (password.every((value) => value.length === 1)) { setIsInvalidation(false); close(); - return; - } else if (password.some((value) => value.length === 1)) { + } else { setIsInvalidation(true); } }, [password, close]); From ea1a69a7594cfec40cca79ad03d96578f9c4d52d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 17:34:26 +0900 Subject: [PATCH 077/307] =?UTF-8?q?feat:=20Payments=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20form=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EB=92=A4=20=EA=B2=B0=EC=A0=9C=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CardSlider/index.tsx | 13 ++++++------- .../Payments/components/PayCardInformation.tsx | 1 + .../Payments/components/PayTermInformation.tsx | 2 +- src/pages/Payments/index.tsx | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 7cc4bd43..51bdd932 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -5,6 +5,7 @@ import * as S from './index.style'; import Card from '../Card'; import { useNavigate } from 'react-router-dom'; import { MyCard } from '../../types'; +import { useEffect } from 'react'; interface CardSliderProps { cards: MyCard[]; @@ -19,20 +20,18 @@ const CardSlider = ({ cards, onChange }: CardSliderProps) => { speed: 500, slidesToShow: 1, slidesToScroll: 1, - beforeChange: (index: number) => { + afterChange: (index: number) => { onChange && onChange(cards[index]); }, }; + useEffect(() => { + onChange && onChange(cards[0]); + }, [onChange, cards]); + return ( -
- -
-
- -
{cards.map((card, index) => ( diff --git a/src/pages/Payments/components/PayCardInformation.tsx b/src/pages/Payments/components/PayCardInformation.tsx index b93a572d..9f1ba5bc 100644 --- a/src/pages/Payments/components/PayCardInformation.tsx +++ b/src/pages/Payments/components/PayCardInformation.tsx @@ -26,6 +26,7 @@ const PayCardInfomation = () => { name='card' rules={{ required: true, + validate: (value) => value !== undefined, }} control={control} defaultValue={cards.length > 0 ? cards[0] : undefined} diff --git a/src/pages/Payments/components/PayTermInformation.tsx b/src/pages/Payments/components/PayTermInformation.tsx index 1ce14db2..bf72e60b 100644 --- a/src/pages/Payments/components/PayTermInformation.tsx +++ b/src/pages/Payments/components/PayTermInformation.tsx @@ -25,7 +25,7 @@ const PayTermInfomation = () => { value === true, })} /> diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index 43baec55..e168678e 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -9,19 +9,19 @@ import * as S from './index.style'; import { useEffect, useState } from 'react'; const Payments = () => { - const [validate, setValidate] = useState(false); + const [isInvalidation, setIsInvalidation] = useState(true); const methods = useForm({ defaultValues: { card: undefined, checkTerm: false, }, + mode: 'onChange', }); - const { watch, trigger } = methods; - const watchValues = watch(['card', 'checkTerm']); + const { formState } = methods; useEffect(() => { - trigger().then((validate) => setValidate(validate)); - }, [watchValues]); + setIsInvalidation(!formState.isValid); + }, [formState.isValid]); return ( <> @@ -42,7 +42,7 @@ const Payments = () => { - From 734952ed81696816a2b3cf02e7899034ec938ce9 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 23 Jul 2024 17:42:52 +0900 Subject: [PATCH 078/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EC=8B=9C=20=EC=B9=B4=EB=93=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=B0=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InputWrapper/index.style.ts | 8 +++++--- src/pages/CardList/index.tsx | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/InputWrapper/index.style.ts b/src/components/InputWrapper/index.style.ts index eefd8b6f..8b68ba19 100644 --- a/src/components/InputWrapper/index.style.ts +++ b/src/components/InputWrapper/index.style.ts @@ -13,10 +13,12 @@ export const Container = styled.div` background-color: ${({ theme, type }) => type === 'fill' ? theme.color.grayBackground : 'transparent'}; - border-bottom: ${({ theme, type }) => - type === 'flushed' ? `1px solid ${theme.color.grayBackground}` : 'none'}; + border-bottom: ${({ theme, type, isInvalidation }) => + isInvalidation === false && type === 'flushed' + ? `1px solid ${theme.color.grayBackground}` + : 'none'}; border: ${({ theme, isInvalidation }) => - isInvalidation ? `2px solid ${theme.color.red}` : 'none'}; + isInvalidation === true ? `2px solid ${theme.color.red}` : ''}; display: flex; align-items: center; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index f76316d2..8b3bee45 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -29,7 +29,9 @@ const CardList = () => { {cards.length > 0 ? ( cards.map((card) => ( - +
navigate(`/card-alias/${card.id}`)}> + +
{card.cardAlias} diff --git a/src/pages/Payments/index.tsx b/src/pages/Payments/index.tsx index e168678e..1e9fc223 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payments/index.tsx @@ -1,12 +1,13 @@ +import { useEffect, useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; -import { ModalHeader, ModalBody, Button, ModalFooter } from '../../components'; + import { PayAmountInformation, PayCardInformation, PayTermInformation, } from './components'; import * as S from './index.style'; -import { useEffect, useState } from 'react'; +import { ModalHeader, ModalBody, Button, ModalFooter } from '../../components'; const Payments = () => { const [isInvalidation, setIsInvalidation] = useState(true); From 7101dc81f3c7bf49accebe43bc2c7c1d0ef4293b Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 14:29:41 +0900 Subject: [PATCH 082/307] =?UTF-8?q?Refactoring:=20Payment=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useState와 useEffect없이 Button렌더링하기 - payments로 사용하던 경로를 payment로 변경하기 - 하위 컴포넌트 이름 미리 작성해두기 --- src/pages/CardList/index.tsx | 2 +- src/pages/Home/index.tsx | 2 +- .../components/PayAmountInformation.tsx | 0 .../components/PayCardInformation.tsx | 0 .../components/PayTermInformation.tsx | 0 .../{Payments => Payment}/components/index.ts | 0 .../{Payments => Payment}/index.style.ts | 0 src/pages/{Payments => Payment}/index.tsx | 41 +++++++++---------- src/pages/index.ts | 2 +- src/router/router.tsx | 5 ++- 10 files changed, 25 insertions(+), 27 deletions(-) rename src/pages/{Payments => Payment}/components/PayAmountInformation.tsx (100%) rename src/pages/{Payments => Payment}/components/PayCardInformation.tsx (100%) rename src/pages/{Payments => Payment}/components/PayTermInformation.tsx (100%) rename src/pages/{Payments => Payment}/components/index.ts (100%) rename src/pages/{Payments => Payment}/index.style.ts (100%) rename src/pages/{Payments => Payment}/index.tsx (51%) diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 8b3bee45..cca15c02 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -20,7 +20,7 @@ const CardList = () => { <> - navigate('/payments')} /> + navigate('/payment')} /> 보유 카드 diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index 77d7054f..a9a78cca 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -10,7 +10,7 @@ const Home = () => { const handleClickOpenButton = () => { open(); - navigate('/payments'); + navigate('/payment'); }; return ( diff --git a/src/pages/Payments/components/PayAmountInformation.tsx b/src/pages/Payment/components/PayAmountInformation.tsx similarity index 100% rename from src/pages/Payments/components/PayAmountInformation.tsx rename to src/pages/Payment/components/PayAmountInformation.tsx diff --git a/src/pages/Payments/components/PayCardInformation.tsx b/src/pages/Payment/components/PayCardInformation.tsx similarity index 100% rename from src/pages/Payments/components/PayCardInformation.tsx rename to src/pages/Payment/components/PayCardInformation.tsx diff --git a/src/pages/Payments/components/PayTermInformation.tsx b/src/pages/Payment/components/PayTermInformation.tsx similarity index 100% rename from src/pages/Payments/components/PayTermInformation.tsx rename to src/pages/Payment/components/PayTermInformation.tsx diff --git a/src/pages/Payments/components/index.ts b/src/pages/Payment/components/index.ts similarity index 100% rename from src/pages/Payments/components/index.ts rename to src/pages/Payment/components/index.ts diff --git a/src/pages/Payments/index.style.ts b/src/pages/Payment/index.style.ts similarity index 100% rename from src/pages/Payments/index.style.ts rename to src/pages/Payment/index.style.ts diff --git a/src/pages/Payments/index.tsx b/src/pages/Payment/index.tsx similarity index 51% rename from src/pages/Payments/index.tsx rename to src/pages/Payment/index.tsx index 1e9fc223..08c42505 100644 --- a/src/pages/Payments/index.tsx +++ b/src/pages/Payment/index.tsx @@ -1,4 +1,3 @@ -import { useEffect, useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { @@ -9,8 +8,7 @@ import { import * as S from './index.style'; import { ModalHeader, ModalBody, Button, ModalFooter } from '../../components'; -const Payments = () => { - const [isInvalidation, setIsInvalidation] = useState(true); +const Payment = () => { const methods = useForm({ defaultValues: { card: undefined, @@ -20,36 +18,35 @@ const Payments = () => { }); const { formState } = methods; - useEffect(() => { - setIsInvalidation(!formState.isValid); - }, [formState.isValid]); - return ( <> Pay 결제 - + - + + {/* + + */} - + + + + + + + -
- - - - - - + ); }; -export default Payments; +export default Payment; diff --git a/src/pages/index.ts b/src/pages/index.ts index b6e076e9..98fa3174 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,5 +1,5 @@ export { default as Home } from './Home'; -export { default as Payments } from './Payments'; +export { default as Payment } from './Payment'; export { default as CardList } from './CardList'; export { default as CardRegist } from './CardRegist'; export { default as CardAlias } from './CardAlias'; diff --git a/src/router/router.tsx b/src/router/router.tsx index 0fad8ad5..f70a5206 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,12 +1,13 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home, Payments, CardList, CardRegist, CardAlias } from '../pages'; + +import { Home, Payment, CardList, CardRegist, CardAlias } from '../pages'; const router = createBrowserRouter([ { element: , path: '/', children: [ - { element: , path: '/payments' }, + { element: , path: '/Payment' }, { element: , path: '/card-list' }, { element: , path: '/card-regist' }, { element: , path: '/card-alias/:id' }, From 4e018062c92a8501f1e0b0a0567577be41ce0c26 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 14:35:52 +0900 Subject: [PATCH 083/307] =?UTF-8?q?chore:=20=EA=B2=BD=EB=A1=9C=20=EB=B3=84?= =?UTF-8?q?=EC=B9=AD=20=EC=84=B8=ED=8C=85=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 16 ++++++++++++++++ package.json | 1 + tsconfig.app.json | 6 +++++- vite.config.ts | 9 +++++++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7faa7d32..714c49b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", + "@types/node": "^20.11.5", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", @@ -1781,6 +1782,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -6402,6 +6412,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", diff --git a/package.json b/package.json index 615668af..f3f72175 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", + "@types/node": "^20.11.5", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", diff --git a/tsconfig.app.json b/tsconfig.app.json index e53d6167..a60e8d1d 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -21,7 +21,11 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "baseUrl": "./src", + "paths": { + "~/*": ["*"] + } }, "include": ["src"] } diff --git a/vite.config.ts b/vite.config.ts index 9387a238..2b8c4e4a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,8 @@ -import { defineConfig as defineTestConfig, mergeConfig } from 'vitest/config'; -import { defineConfig } from 'vite'; +import path from 'path'; + import react from '@vitejs/plugin-react-swc'; +import { defineConfig } from 'vite'; +import { defineConfig as defineTestConfig, mergeConfig } from 'vitest/config'; export default mergeConfig( defineConfig({ @@ -16,5 +18,8 @@ export default mergeConfig( reporter: ['lcov', 'json', 'json-summary'], }, }, + resolve: { + alias: [{ find: '~', replacement: path.resolve(__dirname, 'src') }], + }, }), ); From c21434502e6bbaa4efe5bb85b4ab3290cca3fe43 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 14:37:31 +0900 Subject: [PATCH 084/307] =?UTF-8?q?refactoring:=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=84=EC=B9=AD=20ESLint=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 9 +++++---- src/main.tsx | 3 ++- src/pages/Home/index.tsx | 5 +++-- src/pages/Payment/index.tsx | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index af39b28e..cb951809 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,10 @@ import { ThemeProvider } from '@emotion/react'; -import router from './router/router'; -import { RouterProvider } from 'react-router-dom'; -import theme from './styles/theme'; import { Provider } from 'react-redux'; -import store from './store'; +import { RouterProvider } from 'react-router-dom'; + +import router from '~/router/router'; +import store from '~/store'; +import theme from '~/styles/theme'; function App() { return ( diff --git a/src/main.tsx b/src/main.tsx index 671e1a00..4b036e69 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,5 +1,6 @@ -import { createRoot } from 'react-dom/client'; import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + import App from './App.tsx'; import './styles/main.css'; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index a9a78cca..aa57adb3 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -1,8 +1,9 @@ import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; -import { Button, Modal } from '../../components'; -import { useModal } from '../../hooks'; + +import { Button, Modal } from '~/components'; +import { useModal } from '~/hooks'; const Home = () => { const navigate = useNavigate(); diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index 08c42505..5b2f1dbb 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -6,7 +6,8 @@ import { PayTermInformation, } from './components'; import * as S from './index.style'; -import { ModalHeader, ModalBody, Button, ModalFooter } from '../../components'; + +import { ModalHeader, ModalBody, Button, ModalFooter } from '~/components'; const Payment = () => { const methods = useForm({ From 7462b87d1109abc2212a9de6f7e7e7726d0c2898 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 14:51:40 +0900 Subject: [PATCH 085/307] =?UTF-8?q?refactoring:=20CardSelection=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PayCardInformation -> CardSelction으로 이름 변경 - TitleText 컴포넌트 분리 - 경로 별칭 적용 - import-order 적용 --- src/components/Card/index.tsx | 5 ++-- src/components/CardSlider/index.tsx | 7 ++--- src/components/Information/index.tsx | 1 + src/components/index.ts | 1 + .../index.tsx} | 26 ++++++++++++------- .../components/TitleText/index.style.ts | 6 +++++ .../Payment/components/TitleText/index.tsx | 11 ++++++++ src/pages/Payment/components/index.ts | 2 +- src/pages/Payment/index.style.ts | 5 ---- src/pages/Payment/index.tsx | 4 +-- src/router/router.tsx | 2 +- 11 files changed, 46 insertions(+), 24 deletions(-) rename src/pages/Payment/components/{PayCardInformation.tsx => CardSelection/index.tsx} (76%) create mode 100644 src/pages/Payment/components/TitleText/index.style.ts create mode 100644 src/pages/Payment/components/TitleText/index.tsx diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index aaf712b7..9ce7cd1e 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -1,7 +1,8 @@ -import { cardCompany } from '../../constants'; -import { CardCompany, CardEndDate, CardNumber } from '../../types'; import * as S from './index.style'; +import { cardCompany } from '~/constants'; +import { CardCompany, CardEndDate, CardNumber } from '~/types'; + interface CardProps { numbers?: CardNumber; endDate?: CardEndDate; diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 51bdd932..a671cdd9 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -1,11 +1,12 @@ +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; import Slider from 'react-slick'; + import 'slick-carousel/slick/slick.css'; import 'slick-carousel/slick/slick-theme.css'; import * as S from './index.style'; -import Card from '../Card'; -import { useNavigate } from 'react-router-dom'; import { MyCard } from '../../types'; -import { useEffect } from 'react'; +import Card from '../Card'; interface CardSliderProps { cards: MyCard[]; diff --git a/src/components/Information/index.tsx b/src/components/Information/index.tsx index 2e4a52e8..814caf41 100644 --- a/src/components/Information/index.tsx +++ b/src/components/Information/index.tsx @@ -1,4 +1,5 @@ import { PropsWithChildren } from 'react'; + import * as S from './index.style'; interface InformationProps extends PropsWithChildren {} diff --git a/src/components/index.ts b/src/components/index.ts index a17423b8..db3e8cbe 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -5,6 +5,7 @@ export { default as Card } from './Card'; export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; +export { default as CardSlider } from './CardSlider'; export { default as CardSelector } from './CardSelector'; export { default as PrevIcon } from './PrevIcon'; export * from './Modal'; diff --git a/src/pages/Payment/components/PayCardInformation.tsx b/src/pages/Payment/components/CardSelection/index.tsx similarity index 76% rename from src/pages/Payment/components/PayCardInformation.tsx rename to src/pages/Payment/components/CardSelection/index.tsx index 9f1ba5bc..6035f12d 100644 --- a/src/pages/Payment/components/PayCardInformation.tsx +++ b/src/pages/Payment/components/CardSelection/index.tsx @@ -1,38 +1,44 @@ +import { Controller, useFormContext } from 'react-hook-form'; import { useSelector } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; + +import TitleText from '../TitleText'; + +import { CardSlider } from '~/components'; import { Card, Information, InformationBody, InformationHeader, -} from '../../../components'; -import CardSlider from '../../../components/CardSlider'; -import { RootState } from '../../../store'; -import { useNavigate } from 'react-router-dom'; -import { Controller, useFormContext } from 'react-hook-form'; -import * as S from '../index.style'; +} from '~/components'; +import { RootState } from '~/store'; const PayCardInfomation = () => { const navigate = useNavigate(); const cards = useSelector((state: RootState) => state.cards); const { control } = useFormContext(); + const clickEmptyCard = () => { + navigate('/card-list'); + }; + return ( - 보유카드 + 0 ? cards[0] : undefined} rules={{ required: true, validate: (value) => value !== undefined, }} - control={control} - defaultValue={cards.length > 0 ? cards[0] : undefined} render={({ field: { onChange } }) => cards.length === 0 ? ( - navigate('/card-list')} /> + ) : ( ) diff --git a/src/pages/Payment/components/TitleText/index.style.ts b/src/pages/Payment/components/TitleText/index.style.ts new file mode 100644 index 00000000..5337e77c --- /dev/null +++ b/src/pages/Payment/components/TitleText/index.style.ts @@ -0,0 +1,6 @@ +import styled from '@emotion/styled'; + +export const TitleText = styled.div` + border-bottom: 2px solid ${({ theme }) => theme.color.grayBackground}; + padding: 5px 0px; +`; diff --git a/src/pages/Payment/components/TitleText/index.tsx b/src/pages/Payment/components/TitleText/index.tsx new file mode 100644 index 00000000..346f9ede --- /dev/null +++ b/src/pages/Payment/components/TitleText/index.tsx @@ -0,0 +1,11 @@ +import * as S from './index.style'; + +interface TitleTextProps { + label: string; +} + +const TitleText = ({ label }: TitleTextProps) => { + return {label}; +}; + +export default TitleText; diff --git a/src/pages/Payment/components/index.ts b/src/pages/Payment/components/index.ts index d45e6447..961b2803 100644 --- a/src/pages/Payment/components/index.ts +++ b/src/pages/Payment/components/index.ts @@ -1,3 +1,3 @@ export { default as PayAmountInformation } from './PayAmountInformation'; -export { default as PayCardInformation } from './PayCardInformation'; +export { default as CardSelection } from './CardSelection'; export { default as PayTermInformation } from './PayTermInformation'; diff --git a/src/pages/Payment/index.style.ts b/src/pages/Payment/index.style.ts index 6c433e79..a1fbca1d 100644 --- a/src/pages/Payment/index.style.ts +++ b/src/pages/Payment/index.style.ts @@ -42,8 +42,3 @@ export const TermInformationBottom = styled.div` font-size: 14px; `; - -export const TitleText = styled.div` - border-bottom: 2px solid ${({ theme }) => theme.color.grayBackground}; - padding: 5px 0px; -`; diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index 5b2f1dbb..11f06e09 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -2,7 +2,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { PayAmountInformation, - PayCardInformation, + CardSelection, PayTermInformation, } from './components'; import * as S from './index.style'; @@ -29,7 +29,7 @@ const Payment = () => { {/* */} - + diff --git a/src/router/router.tsx b/src/router/router.tsx index f70a5206..ef280e51 100644 --- a/src/router/router.tsx +++ b/src/router/router.tsx @@ -1,6 +1,6 @@ import { createBrowserRouter } from 'react-router-dom'; -import { Home, Payment, CardList, CardRegist, CardAlias } from '../pages'; +import { Home, Payment, CardList, CardRegist, CardAlias } from '~/pages'; const router = createBrowserRouter([ { From 5256eaa15de6ac4e361cfa7622d0677bdfba35d9 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 15:32:42 +0900 Subject: [PATCH 086/307] refactoring: Card Refactoring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - clickable props를 다른 props를 통해서 유추하기 - 보안된 카드 번호들 변수명 변경하기 --- src/components/Card/index.style.ts | 3 ++- src/components/Card/index.tsx | 20 +++++++++---------- src/components/GoogleIcon/index.style.ts | 0 src/components/GoogleIcon/index.tsx | 11 ++++++++++ src/components/index.ts | 1 + src/constants/index.ts | 5 +++++ .../components/PayAmountInformation.tsx | 3 ++- .../Payment/components/PayTermInformation.tsx | 4 +++- 8 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 src/components/GoogleIcon/index.style.ts create mode 100644 src/components/GoogleIcon/index.tsx diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 30821e73..4ba19ed9 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -1,5 +1,6 @@ import styled from '@emotion/styled'; -import { CardCompany } from '../../types'; + +import { CardCompany } from '~/types'; interface CardProps { size: 'small' | 'big'; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 9ce7cd1e..e2cf228d 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -1,4 +1,5 @@ import * as S from './index.style'; +import GoogleIcon from '../GoogleIcon'; import { cardCompany } from '~/constants'; import { CardCompany, CardEndDate, CardNumber } from '~/types'; @@ -9,7 +10,6 @@ interface CardProps { cardUser?: string; company?: CardCompany; size?: 'small' | 'big'; - clickable?: boolean; onClick?: () => void; } @@ -22,31 +22,33 @@ const Card = ({ day: 'YY', }, cardUser = undefined, - clickable = false, onClick, }: CardProps) => { + const clickable = onClick ? true : false; + const encryptedNumbers = numbers.map((number, index) => { + return index < 2 ? number : '●'.repeat(number.length); + }); const handleClickCard = () => { onClick && onClick(); }; - const editedNumbers = numbers.map((number, index) => - index < 2 ? number : '●'.repeat(number.length), - ); return ( - {company !== 'none' ? ( + {company === 'none' ? ( + + ) : ( <> {cardCompany[company]} - {editedNumbers.map((number, index) => ( + {encryptedNumbers.map((number, index) => ( {number} ))} @@ -58,8 +60,6 @@ const Card = ({ - ) : ( - add )} diff --git a/src/components/GoogleIcon/index.style.ts b/src/components/GoogleIcon/index.style.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/components/GoogleIcon/index.tsx b/src/components/GoogleIcon/index.tsx new file mode 100644 index 00000000..11b58d7e --- /dev/null +++ b/src/components/GoogleIcon/index.tsx @@ -0,0 +1,11 @@ +import { googleIcon } from '~/constants'; + +interface GoogleIconProps { + name: keyof typeof googleIcon; +} + +const GoogleIcon = ({ name }: GoogleIconProps) => { + return {googleIcon[name]}; +}; + +export default GoogleIcon; diff --git a/src/components/index.ts b/src/components/index.ts index db3e8cbe..b32993d6 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -8,6 +8,7 @@ export { default as Keypad } from './Keypad'; export { default as CardSlider } from './CardSlider'; export { default as CardSelector } from './CardSelector'; export { default as PrevIcon } from './PrevIcon'; +export { default as GoogleIcon } from './GoogleIcon'; export * from './Modal'; export * from './Information'; export * from './Keypad'; diff --git a/src/constants/index.ts b/src/constants/index.ts index 5bc29eaa..59bf36fb 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -8,3 +8,8 @@ export const cardCompany = Object.freeze({ jingyeong: '진경카드', geonwoo: '건우카드', }); + +export const googleIcon = Object.freeze({ + arrowBack: 'arrow_back', + add: 'add', +}); diff --git a/src/pages/Payment/components/PayAmountInformation.tsx b/src/pages/Payment/components/PayAmountInformation.tsx index bb5f0787..7cc9f86a 100644 --- a/src/pages/Payment/components/PayAmountInformation.tsx +++ b/src/pages/Payment/components/PayAmountInformation.tsx @@ -1,3 +1,4 @@ +import TitleText from './TitleText'; import { Information, InformationBody, @@ -9,7 +10,7 @@ const PayAmountInformation = () => { return ( - 결제 금액 + diff --git a/src/pages/Payment/components/PayTermInformation.tsx b/src/pages/Payment/components/PayTermInformation.tsx index bf72e60b..9a145a68 100644 --- a/src/pages/Payment/components/PayTermInformation.tsx +++ b/src/pages/Payment/components/PayTermInformation.tsx @@ -1,4 +1,6 @@ import { useFormContext } from 'react-hook-form'; + +import TitleText from './TitleText'; import { Information, InformationBody, @@ -12,7 +14,7 @@ const PayTermInfomation = () => { return ( - 약관 이용 및 동의 + From 55428c48b92ee85d40167cd43ca214633456d2ba Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 15:39:15 +0900 Subject: [PATCH 087/307] =?UTF-8?q?refactoring:=20CardSelector=20->=20Comp?= =?UTF-8?q?anySelection=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.style.ts | 0 .../{CardSelector => CompanySelection}/index.tsx | 13 +++++++++---- src/components/index.ts | 2 +- src/pages/CardRegist/components/InputCard.tsx | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) rename src/components/{CardSelector => CompanySelection}/index.style.ts (100%) rename src/components/{CardSelector => CompanySelection}/index.tsx (90%) diff --git a/src/components/CardSelector/index.style.ts b/src/components/CompanySelection/index.style.ts similarity index 100% rename from src/components/CardSelector/index.style.ts rename to src/components/CompanySelection/index.style.ts diff --git a/src/components/CardSelector/index.tsx b/src/components/CompanySelection/index.tsx similarity index 90% rename from src/components/CardSelector/index.tsx rename to src/components/CompanySelection/index.tsx index 7ffd0c07..95d4d1d2 100644 --- a/src/components/CardSelector/index.tsx +++ b/src/components/CompanySelection/index.tsx @@ -1,19 +1,24 @@ +import { MouseEvent } from 'react'; + import * as S from './index.style'; import { cardCompany } from '../../constants'; -import { MouseEvent } from 'react'; import { CardCompany } from '../../types'; function isCardCompany(key: string): key is keyof typeof cardCompany { return key in cardCompany; } -interface CardSelectorProps { +interface CompanySelectionProps { isOpen: boolean; onClose?: () => void; onClick?: (company: CardCompany) => void; } -const CardSelector = ({ isOpen, onClose, onClick }: CardSelectorProps) => { +const CompanySelection = ({ + isOpen, + onClose, + onClick, +}: CompanySelectionProps) => { const handleClick = (event: MouseEvent) => { const { target } = event; @@ -58,4 +63,4 @@ const CardSelector = ({ isOpen, onClose, onClick }: CardSelectorProps) => { ); }; -export default CardSelector; +export default CompanySelection; diff --git a/src/components/index.ts b/src/components/index.ts index b32993d6..9e5a621e 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -6,7 +6,7 @@ export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; export { default as CardSlider } from './CardSlider'; -export { default as CardSelector } from './CardSelector'; +export { default as CompanySelection } from './CompanySelection'; export { default as PrevIcon } from './PrevIcon'; export { default as GoogleIcon } from './GoogleIcon'; export * from './Modal'; diff --git a/src/pages/CardRegist/components/InputCard.tsx b/src/pages/CardRegist/components/InputCard.tsx index b9cf4eeb..3944ac91 100644 --- a/src/pages/CardRegist/components/InputCard.tsx +++ b/src/pages/CardRegist/components/InputCard.tsx @@ -1,5 +1,6 @@ import { Controller, useFormContext } from 'react-hook-form'; -import { CardSelector } from '../../../components'; + +import { CompanySelection } from '../../../components'; interface InputCardProps { isOpen: boolean; @@ -15,7 +16,7 @@ const InputCard = ({ isOpen, close }: InputCardProps) => { name='company' control={control} render={({ field: { onChange } }) => ( - { close(); From 42eeb7ac2e97cd680562ac6734070f8c98c94322 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 15:46:04 +0900 Subject: [PATCH 088/307] =?UTF-8?q?refactoring:=20PaymentAmount=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 결제 금액을 다양하게 받기 위해 외부에서 주입받기 - style파일 분리하기 - PayAmountInformation -> PaymentAmount로 이름 변경 --- .../components/PayAmountInformation.tsx | 25 ------------------ .../components/PaymentAmount/index.style.ts | 8 ++++++ .../components/PaymentAmount/index.tsx | 26 +++++++++++++++++++ src/pages/Payment/components/index.ts | 2 +- src/pages/Payment/index.style.ts | 7 ----- src/pages/Payment/index.tsx | 9 +++---- 6 files changed, 38 insertions(+), 39 deletions(-) delete mode 100644 src/pages/Payment/components/PayAmountInformation.tsx create mode 100644 src/pages/Payment/components/PaymentAmount/index.style.ts create mode 100644 src/pages/Payment/components/PaymentAmount/index.tsx diff --git a/src/pages/Payment/components/PayAmountInformation.tsx b/src/pages/Payment/components/PayAmountInformation.tsx deleted file mode 100644 index 7cc9f86a..00000000 --- a/src/pages/Payment/components/PayAmountInformation.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import TitleText from './TitleText'; -import { - Information, - InformationBody, - InformationHeader, -} from '../../../components'; -import * as S from '../index.style'; - -const PayAmountInformation = () => { - return ( - - - - - - -
총 결제 금액
-
323,600원
-
-
-
- ); -}; - -export default PayAmountInformation; diff --git a/src/pages/Payment/components/PaymentAmount/index.style.ts b/src/pages/Payment/components/PaymentAmount/index.style.ts new file mode 100644 index 00000000..f803bbff --- /dev/null +++ b/src/pages/Payment/components/PaymentAmount/index.style.ts @@ -0,0 +1,8 @@ +import styled from '@emotion/styled'; + +export const PayAmountBody = styled.div` + display: flex; + justify-content: space-between; + + font-weight: bold; +`; diff --git a/src/pages/Payment/components/PaymentAmount/index.tsx b/src/pages/Payment/components/PaymentAmount/index.tsx new file mode 100644 index 00000000..66ea130b --- /dev/null +++ b/src/pages/Payment/components/PaymentAmount/index.tsx @@ -0,0 +1,26 @@ +import * as S from './index.style'; +import TitleText from '../TitleText'; + +import { Information, InformationBody, InformationHeader } from '~/components'; + +interface PaymentAmountProps { + amount: string; +} + +const PaymentAmount = ({ amount }: PaymentAmountProps) => { + return ( + + + + + + +
총 결제 금액
+
{amount}원
+
+
+
+ ); +}; + +export default PaymentAmount; diff --git a/src/pages/Payment/components/index.ts b/src/pages/Payment/components/index.ts index 961b2803..0b311237 100644 --- a/src/pages/Payment/components/index.ts +++ b/src/pages/Payment/components/index.ts @@ -1,3 +1,3 @@ -export { default as PayAmountInformation } from './PayAmountInformation'; +export { default as PaymentAmount } from './PaymentAmount'; export { default as CardSelection } from './CardSelection'; export { default as PayTermInformation } from './PayTermInformation'; diff --git a/src/pages/Payment/index.style.ts b/src/pages/Payment/index.style.ts index a1fbca1d..491e0f2f 100644 --- a/src/pages/Payment/index.style.ts +++ b/src/pages/Payment/index.style.ts @@ -22,13 +22,6 @@ export const ButtonLabel = styled.div` padding: 5px; `; -export const PayAmountBody = styled.div` - display: flex; - justify-content: space-between; - - font-weight: bold; -`; - export const TermInformationTop = styled.div` display: flex; gap: 10px; diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index 11f06e09..f1f40a83 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -1,10 +1,6 @@ import { FormProvider, useForm } from 'react-hook-form'; -import { - PayAmountInformation, - CardSelection, - PayTermInformation, -} from './components'; +import { PaymentAmount, CardSelection, PayTermInformation } from './components'; import * as S from './index.style'; import { ModalHeader, ModalBody, Button, ModalFooter } from '~/components'; @@ -13,6 +9,7 @@ const Payment = () => { const methods = useForm({ defaultValues: { card: undefined, + amount: '500,000,000', checkTerm: false, }, mode: 'onChange', @@ -30,7 +27,7 @@ const Payment = () => { */} - +
From 6d187a0044eb64ed238271036a3cd72e8fc0854f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 15:49:39 +0900 Subject: [PATCH 089/307] =?UTF-8?q?refactoring:=20TermAgreement=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - style 파일 분리하기 - PayTermInformation -> TermAgreement 로 이름 변경하기 --- .../components/TermAgreement/index.style.ts | 15 +++++++++++++++ .../index.tsx} | 15 ++++++--------- src/pages/Payment/components/index.ts | 2 +- src/pages/Payment/index.style.ts | 14 -------------- src/pages/Payment/index.tsx | 7 ++----- 5 files changed, 24 insertions(+), 29 deletions(-) create mode 100644 src/pages/Payment/components/TermAgreement/index.style.ts rename src/pages/Payment/components/{PayTermInformation.tsx => TermAgreement/index.tsx} (77%) diff --git a/src/pages/Payment/components/TermAgreement/index.style.ts b/src/pages/Payment/components/TermAgreement/index.style.ts new file mode 100644 index 00000000..075bb99d --- /dev/null +++ b/src/pages/Payment/components/TermAgreement/index.style.ts @@ -0,0 +1,15 @@ +import styled from '@emotion/styled'; + +export const TermInformationTop = styled.div` + display: flex; + gap: 10px; + + font-size: 14px; +`; + +export const TermInformationBottom = styled.div` + display: flex; + justify-content: space-between; + + font-size: 14px; +`; diff --git a/src/pages/Payment/components/PayTermInformation.tsx b/src/pages/Payment/components/TermAgreement/index.tsx similarity index 77% rename from src/pages/Payment/components/PayTermInformation.tsx rename to src/pages/Payment/components/TermAgreement/index.tsx index 9a145a68..544cdf2c 100644 --- a/src/pages/Payment/components/PayTermInformation.tsx +++ b/src/pages/Payment/components/TermAgreement/index.tsx @@ -1,14 +1,11 @@ import { useFormContext } from 'react-hook-form'; -import TitleText from './TitleText'; -import { - Information, - InformationBody, - InformationHeader, -} from '../../../components'; -import * as S from '../index.style'; +import * as S from './index.style'; +import TitleText from '../TitleText'; -const PayTermInfomation = () => { +import { Information, InformationBody, InformationHeader } from '~/components'; + +const TermAgreement = () => { const { register } = useFormContext(); return ( @@ -36,4 +33,4 @@ const PayTermInfomation = () => { ); }; -export default PayTermInfomation; +export default TermAgreement; diff --git a/src/pages/Payment/components/index.ts b/src/pages/Payment/components/index.ts index 0b311237..614eb54a 100644 --- a/src/pages/Payment/components/index.ts +++ b/src/pages/Payment/components/index.ts @@ -1,3 +1,3 @@ export { default as PaymentAmount } from './PaymentAmount'; export { default as CardSelection } from './CardSelection'; -export { default as PayTermInformation } from './PayTermInformation'; +export { default as TermAgreement } from './TermAgreement'; diff --git a/src/pages/Payment/index.style.ts b/src/pages/Payment/index.style.ts index 491e0f2f..fcad8fa0 100644 --- a/src/pages/Payment/index.style.ts +++ b/src/pages/Payment/index.style.ts @@ -21,17 +21,3 @@ export const ButtonContainer = styled.div` export const ButtonLabel = styled.div` padding: 5px; `; - -export const TermInformationTop = styled.div` - display: flex; - gap: 10px; - - font-size: 14px; -`; - -export const TermInformationBottom = styled.div` - display: flex; - justify-content: space-between; - - font-size: 14px; -`; diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index f1f40a83..0bc932a1 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -1,6 +1,6 @@ import { FormProvider, useForm } from 'react-hook-form'; -import { PaymentAmount, CardSelection, PayTermInformation } from './components'; +import { PaymentAmount, CardSelection, TermAgreement } from './components'; import * as S from './index.style'; import { ModalHeader, ModalBody, Button, ModalFooter } from '~/components'; @@ -23,12 +23,9 @@ const Payment = () => { - {/* - - */} - + From 3cb524cf32fe40fe7e050912bed8841703e28eae Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 16:41:07 +0900 Subject: [PATCH 090/307] =?UTF-8?q?refactoring:=20CardSlide=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Card에 onClick메서드를 직접 넣는 방식으로 수정 - onClick메서드 함수로 분리하기 --- src/components/CardSlider/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index a671cdd9..1d07cfef 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -25,6 +25,9 @@ const CardSlider = ({ cards, onChange }: CardSliderProps) => { onChange && onChange(cards[index]); }, }; + const handleClickAddCard = () => { + navigate('/card-list'); + }; useEffect(() => { onChange && onChange(cards[0]); @@ -38,9 +41,9 @@ const CardSlider = ({ cards, onChange }: CardSliderProps) => { ))} - navigate('/card-list')}> - - + + + ); From da085f8ac777c2cd71bb7a62efc660da2d4f49a5 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 17:30:44 +0900 Subject: [PATCH 091/307] =?UTF-8?q?refactoring:=20CardList=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이벤트 위임으로 메서드 관리하기 - Card 타입 분리하기 --- src/components/Card/index.tsx | 10 ++---- src/components/CardSlider/index.tsx | 4 +-- src/pages/CardList/index.tsx | 53 +++++++++++++++++++++-------- src/pages/CardRegist/index.tsx | 25 +++++++------- src/store/index.ts | 3 +- src/styles/color.ts | 1 + src/types/index.ts | 14 +++++--- 7 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index e2cf228d..5408336e 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -2,15 +2,11 @@ import * as S from './index.style'; import GoogleIcon from '../GoogleIcon'; import { cardCompany } from '~/constants'; -import { CardCompany, CardEndDate, CardNumber } from '~/types'; +import { DefaultCard } from '~/types'; -interface CardProps { - numbers?: CardNumber; - endDate?: CardEndDate; - cardUser?: string; - company?: CardCompany; +interface CardProps extends Partial { size?: 'small' | 'big'; - onClick?: () => void; + onClick?: (card?: DefaultCard) => void; } const Card = ({ diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 1d07cfef..9b16e99a 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -36,8 +36,8 @@ const CardSlider = ({ cards, onChange }: CardSliderProps) => { return ( - {cards.map((card, index) => ( - + {cards.map((card) => ( + ))} diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index cca15c02..ad11044c 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -1,4 +1,9 @@ +import { MouseEvent } from 'react'; import { useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; + +import * as S from './index.style'; import { Button, Card, @@ -6,16 +11,42 @@ import { ModalHeader, PrevIcon, } from '../../components'; -import * as S from './index.style'; import { removeCard, RootState } from '../../store'; -import { useNavigate } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; const CardList = () => { const cards = useSelector((state: RootState) => state.cards); const navigate = useNavigate(); const dispatch = useDispatch(); + const handleClickRemoveButton = (id: string) => { + dispatch(removeCard({ id })); + }; + + const handleClickRegisteredCard = (id: string) => { + navigate(`/card-alias/${id}`); + }; + + const handleClickCardUL = (event: MouseEvent) => { + const { currentTarget, target } = event; + + if (currentTarget instanceof HTMLUListElement) { + const $li = currentTarget.querySelector('li') as HTMLLIElement; + const { id } = $li.dataset; + + if (target instanceof HTMLButtonElement) { + id && handleClickRemoveButton(id); + } + + if (target instanceof HTMLDivElement) { + id && handleClickRegisteredCard(id); + } + } + }; + + const handleClickAddCard = () => { + navigate('/card-regist'); + }; + return ( <> @@ -25,26 +56,20 @@ const CardList = () => { - + {cards.length > 0 ? ( cards.map((card) => ( - -
navigate(`/card-alias/${card.id}`)}> - -
+ + {card.cardAlias} - - - + )) ) : ( 아직 보유중인 카드가 없어요. )}
- navigate('/card-regist')} /> +
); diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index ed6e9fc6..d0be8a3c 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -1,14 +1,7 @@ import { FormProvider, useForm } from 'react-hook-form'; -import { - ModalBody, - ModalFooter, - ModalHeader, - Card, - Button, - PrevIcon, -} from '../../components'; -import * as S from './index.style'; -import { MyCardForm } from '../../types'; +import { useDispatch } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; + import { InputNumbers, InputEndDate, @@ -17,10 +10,18 @@ import { InputPassword, InputCard, } from './components'; +import * as S from './index.style'; +import { + ModalBody, + ModalFooter, + ModalHeader, + Card, + Button, + PrevIcon, +} from '../../components'; import { useModal } from '../../hooks'; -import { useNavigate } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; import { addCard } from '../../store'; +import { MyCardForm } from '../../types'; import generateID from '../../utils/generateID'; const CardRegist = () => { diff --git a/src/store/index.ts b/src/store/index.ts index 1cab0ee7..16bfc5e8 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,7 +1,8 @@ import { configureStore, createSlice } from '@reduxjs/toolkit'; + import { MyCard } from '../types'; -export type CardState = MyCard & { id: string }; +export type CardState = MyCard; interface CardsState { cards: CardState[]; diff --git a/src/styles/color.ts b/src/styles/color.ts index 60b098fa..a494e241 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -1,5 +1,6 @@ const color = { white: '#ffffff', + gray100: '#eeeeee', grayBackground: '#e5e5e5', deemBackground: '#00000030', mainGreen: '#04C09E', diff --git a/src/types/index.ts b/src/types/index.ts index 956c1c93..5f4a2dce 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -4,22 +4,26 @@ export type CardCompany = keyof typeof cardCompany | 'none'; export type CardNumber = [string, string, string, string]; +export type CardPassword = [string, string]; + export interface CardEndDate { month: string; day: string; } -export interface MyCard { +export interface DefaultCard { numbers: CardNumber; endDate: CardEndDate; - cardUser: string; + cardUser?: string; company: CardCompany; - cardAlias?: string; } -export type CardPassword = [string, string]; +export interface RegisteredCard extends DefaultCard { + id: string; + cardAlias?: string; +} -export interface MyCardForm extends MyCard { +export interface CardForm extends RegisteredCard { securityCode: string; password: CardPassword; } From 146324fb167fa6fcf89c2dc5c13d1609a7dc5dac Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 24 Jul 2024 17:38:00 +0900 Subject: [PATCH 092/307] =?UTF-8?q?refactoring:=20CardAlias=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 버튼 메서드 분리하기 - import-order ESLint 적용하기 --- src/pages/CardAlias/index.tsx | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index d0f197bc..4d558603 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -1,4 +1,9 @@ +import { useRef } from 'react'; +import { useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import { useNavigate, useParams } from 'react-router-dom'; + +import * as S from './index.style'; import { Button, Card, @@ -7,22 +12,25 @@ import { ModalBody, ModalFooter, } from '../../components'; -import * as S from './index.style'; -import { useSelector } from 'react-redux'; import { addCardName, CardState, RootState } from '../../store'; -import { useDispatch } from 'react-redux'; -import { useRef } from 'react'; const CardAlias = () => { const navigate = useNavigate(); - const params = useParams(); const dispatch = useDispatch(); + const params = useParams(); const { id } = params; + const targetCard = useSelector((state: RootState) => { return state.cards.find((card) => card.id === id) as CardState; }); + const { cardAlias } = targetCard; const inputRef = useRef(null); + const handleClickConfirmButton = () => { + navigate('/card-list'); + dispatch(addCardName({ id, cardAlias: inputRef.current?.value })); + }; + return ( <> @@ -37,7 +45,7 @@ const CardAlias = () => {
@@ -46,14 +54,7 @@ const CardAlias = () => { - + From eb5aa174e6cee57d02f39ebc721cd4bd293be532 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 14:11:29 +0900 Subject: [PATCH 093/307] =?UTF-8?q?refactoring:=20CompanySelection=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DeemBackground 컴포넌트를 별도의 컴포넌트로 분리 --- .../CompanySelection/index.style.ts | 22 ++------- src/components/CompanySelection/index.tsx | 49 ++++++------------- src/components/DeemBackground/index.style.ts | 14 ++++++ src/components/DeemBackground/index.tsx | 27 ++++++++++ src/components/index.ts | 1 + 5 files changed, 61 insertions(+), 52 deletions(-) create mode 100644 src/components/DeemBackground/index.style.ts create mode 100644 src/components/DeemBackground/index.tsx diff --git a/src/components/CompanySelection/index.style.ts b/src/components/CompanySelection/index.style.ts index b627c72b..4b2602d4 100644 --- a/src/components/CompanySelection/index.style.ts +++ b/src/components/CompanySelection/index.style.ts @@ -1,20 +1,10 @@ import styled from '@emotion/styled'; -import { CardCompany } from '../../types'; -export const DeemBackground = styled.div` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; +import { CardCompany } from '~/types'; - background-color: ${({ theme }) => theme.color.deemBackground}; - - display: flex; - flex-direction: column; - align-items: center; - justify-content: end; -`; +interface PaleteProps { + companey: CardCompany; +} export const Container = styled.div` position: absolute; @@ -27,10 +17,6 @@ export const Container = styled.div` background-color: ${({ theme }) => theme.color.white}; `; -interface PaleteProps { - companey: CardCompany; -} - export const PaleteItem = styled.div` display: flex; flex-direction: column; diff --git a/src/components/CompanySelection/index.tsx b/src/components/CompanySelection/index.tsx index 95d4d1d2..97787677 100644 --- a/src/components/CompanySelection/index.tsx +++ b/src/components/CompanySelection/index.tsx @@ -9,57 +9,38 @@ function isCardCompany(key: string): key is keyof typeof cardCompany { } interface CompanySelectionProps { - isOpen: boolean; - onClose?: () => void; onClick?: (company: CardCompany) => void; } -const CompanySelection = ({ - isOpen, - onClose, - onClick, -}: CompanySelectionProps) => { - const handleClick = (event: MouseEvent) => { +const CompanySelection = ({ onClick }: CompanySelectionProps) => { + const handleClickCompany = (event: MouseEvent) => { const { target } = event; if (target instanceof HTMLElement) { - if (target.classList.contains('palete-background')) { - onClose && onClose(); - return; - } const $palateItem = target.closest('.palete-item'); if ($palateItem instanceof HTMLElement) { const { company } = $palateItem.dataset; - if (company) { - onClick && onClick(company as CardCompany); - onClose && onClose(); + if (company && isCardCompany(company)) { + onClick && onClick(company); } } } }; return ( - isOpen && ( - - - {Object.entries(cardCompany).map( - ([key, value]) => - isCardCompany(key) && ( - - - {value} - - ), - )} - - - ) + + {Object.entries(cardCompany).map( + ([key, value]) => + isCardCompany(key) && ( + + + {value} + + ), + )} + ); }; diff --git a/src/components/DeemBackground/index.style.ts b/src/components/DeemBackground/index.style.ts new file mode 100644 index 00000000..0c0b5de7 --- /dev/null +++ b/src/components/DeemBackground/index.style.ts @@ -0,0 +1,14 @@ +import styled from '@emotion/styled'; + +export const DeemBackgroundContainer = styled.div` + position: absolute; + top: 0; + left: 0; + z-index: 1000; + width: 100%; + height: 100%; + background-color: ${({ theme }) => theme.color.deemBackground}; + display: flex; + justify-content: center; + align-items: center; +`; diff --git a/src/components/DeemBackground/index.tsx b/src/components/DeemBackground/index.tsx new file mode 100644 index 00000000..f66eae47 --- /dev/null +++ b/src/components/DeemBackground/index.tsx @@ -0,0 +1,27 @@ +import { PropsWithChildren } from 'react'; + +import * as S from './index.style'; + +interface DeemBackgroundProps { + onClose?: () => void; +} + +const DeemBackground: React.FC> = ({ + children, + onClose, +}) => { + const handleClickBackground = () => { + onClose && onClose(); + }; + + return ( + + {children} + + ); +}; + +export default DeemBackground; diff --git a/src/components/index.ts b/src/components/index.ts index 9e5a621e..d9f70e85 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -9,6 +9,7 @@ export { default as CardSlider } from './CardSlider'; export { default as CompanySelection } from './CompanySelection'; export { default as PrevIcon } from './PrevIcon'; export { default as GoogleIcon } from './GoogleIcon'; +export { default as DeemBackground } from './DeemBackground'; export * from './Modal'; export * from './Information'; export * from './Keypad'; From dd9e48188e252d52c9c821f5327e8613bcd341d1 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 14:13:28 +0900 Subject: [PATCH 094/307] =?UTF-8?q?refactoring:=20InputCompany=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DeemBackground 와 CompanySelection 분리하기 - validate 추가하기 - style 컴포넌트 분리하기 - InputCard -> InputCompany로 파일 이름 변경하기 --- src/pages/CardRegist/components/InputCard.tsx | 32 -------------- .../components/InputCompany/index.style.ts | 14 ++++++ .../components/InputCompany/index.tsx | 39 +++++++++++++++++ src/pages/CardRegist/components/index.ts | 2 +- src/pages/CardRegist/index.tsx | 43 ++++++++----------- 5 files changed, 73 insertions(+), 57 deletions(-) delete mode 100644 src/pages/CardRegist/components/InputCard.tsx create mode 100644 src/pages/CardRegist/components/InputCompany/index.style.ts create mode 100644 src/pages/CardRegist/components/InputCompany/index.tsx diff --git a/src/pages/CardRegist/components/InputCard.tsx b/src/pages/CardRegist/components/InputCard.tsx deleted file mode 100644 index 3944ac91..00000000 --- a/src/pages/CardRegist/components/InputCard.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Controller, useFormContext } from 'react-hook-form'; - -import { CompanySelection } from '../../../components'; - -interface InputCardProps { - isOpen: boolean; - close: () => void; -} - -const InputCard = ({ isOpen, close }: InputCardProps) => { - const { control } = useFormContext(); - - return ( -
- ( - { - close(); - }} - onClick={onChange} - /> - )} - /> -
- ); -}; - -export default InputCard; diff --git a/src/pages/CardRegist/components/InputCompany/index.style.ts b/src/pages/CardRegist/components/InputCompany/index.style.ts new file mode 100644 index 00000000..7e6561b6 --- /dev/null +++ b/src/pages/CardRegist/components/InputCompany/index.style.ts @@ -0,0 +1,14 @@ +import styled from '@emotion/styled'; + +export const Container = styled.div` + width: 100%; +`; + +export const InputCompanyContainer = styled.div` + position: absolute; + bottom: 0px; + left: 0px; + + width: 100%; + background-color: ${({ theme }) => theme.color.white}; +`; diff --git a/src/pages/CardRegist/components/InputCompany/index.tsx b/src/pages/CardRegist/components/InputCompany/index.tsx new file mode 100644 index 00000000..d04121a8 --- /dev/null +++ b/src/pages/CardRegist/components/InputCompany/index.tsx @@ -0,0 +1,39 @@ +import { Controller, useFormContext } from 'react-hook-form'; + +import * as S from './index.style'; + +import { CompanySelection, DeemBackground } from '~/components'; +import { cardCompany } from '~/constants'; + +interface InputCompanyProps { + isOpen: boolean; + close: () => void; +} + +const InputCompany = ({ isOpen, close }: InputCompanyProps) => { + const { control } = useFormContext(); + + return ( + + {isOpen && ( + + + value in cardCompany, + }} + render={({ field: { onChange } }) => ( + + )} + /> + + + )} + + ); +}; + +export default InputCompany; diff --git a/src/pages/CardRegist/components/index.ts b/src/pages/CardRegist/components/index.ts index 1be8c43f..7f3a7dc5 100644 --- a/src/pages/CardRegist/components/index.ts +++ b/src/pages/CardRegist/components/index.ts @@ -1,6 +1,6 @@ +export { default as InputCompany } from './InputCompany'; export { default as InputNumbers } from './InputNumbers'; export { default as InputEndDate } from './InputEndDate'; export { default as InputCardUser } from './InputCardUser'; export { default as InputSecurityCode } from './InputSecurityCode'; export { default as InputPassword } from './InputPassword'; -export { default as InputCard } from './InputCard'; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index d0be8a3c..32dbc728 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -8,9 +8,10 @@ import { InputCardUser, InputSecurityCode, InputPassword, - InputCard, + InputCompany, } from './components'; import * as S from './index.style'; + import { ModalBody, ModalFooter, @@ -18,28 +19,24 @@ import { Card, Button, PrevIcon, -} from '../../components'; -import { useModal } from '../../hooks'; -import { addCard } from '../../store'; -import { MyCardForm } from '../../types'; -import generateID from '../../utils/generateID'; +} from '~/components'; +import { useModal } from '~/hooks'; +import { addCard } from '~/store'; +import { CardForm } from '~/types'; +import generateID from '~/utils/generateID'; const CardRegist = () => { - const methods = useForm({ - defaultValues: { - numbers: ['', '', '', ''], - endDate: { month: '', day: '' }, - cardUser: '', - company: 'none', - securityCode: '', - password: ['', ''], - }, + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { isOpen, close, open } = useModal(true); + const methods = useForm({ mode: 'onChange', }); const { watch, formState, getValues } = methods; - const navigate = useNavigate(); - const { isOpen, close, open } = useModal(true); - const dispatch = useDispatch(); + + const handleClickCard = () => { + open(); + }; return ( <> @@ -55,18 +52,16 @@ const CardRegist = () => { endDate={watch('endDate')} cardUser={watch('cardUser')} company={watch('company')} - onClick={() => { - open(); - }} + onClick={handleClickCard} /> - + - - + {/* */} + {/* */} From 1938d07dba4887312aced71e8edd436f38474a00 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:29:08 +0900 Subject: [PATCH 095/307] =?UTF-8?q?refactoring:=20HTMLAttributes=20?= =?UTF-8?q?=EB=8C=80=EC=8B=A0=20ComponentProps=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InputWrapper/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/InputWrapper/index.tsx b/src/components/InputWrapper/index.tsx index 6fd21e34..7c5bd631 100644 --- a/src/components/InputWrapper/index.tsx +++ b/src/components/InputWrapper/index.tsx @@ -1,7 +1,8 @@ -import { HTMLAttributes, PropsWithChildren } from 'react'; +import { ComponentProps, PropsWithChildren } from 'react'; + import * as S from './index.style'; -interface InputWrapperProps extends HTMLAttributes { +interface InputWrapperProps extends ComponentProps<'div'> { type?: 'fill' | 'flushed'; isInvalidation?: boolean; } From a85f1929113818a533a614b62e5200cbdfadc17a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:41:35 +0900 Subject: [PATCH 096/307] =?UTF-8?q?feat:=20number=EA=B0=80=20string?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9D=B4=20=EC=95=84=EB=8B=8C=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=83=80=EC=9E=85=EA=B0=80=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 5408336e..41f33d9b 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -22,7 +22,10 @@ const Card = ({ }: CardProps) => { const clickable = onClick ? true : false; const encryptedNumbers = numbers.map((number, index) => { - return index < 2 ? number : '●'.repeat(number.length); + if (typeof number === 'string') { + return index < 2 ? number : '●'.repeat(number.length); + } + return number; }); const handleClickCard = () => { onClick && onClick(); From 6abd992b8eea4bd48590cdd7532e51f148203134 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:45:02 +0900 Subject: [PATCH 097/307] =?UTF-8?q?refactoring:=20InputCardNumbers=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputNumbers -> InputCardNumbers로 파일 이름 변경 - InputRef를 배열로 관리하기 - Controller를 map으로 반복하기 - import order ESLiint 적용하기 - 경로 별칭 사용하기 - 불필요한 state 삭제하기 - TitleText를 별개의 컴포넌트로 분리하기 --- .../InputCardNumbers/index.style.ts | 5 + .../components/InputCardNumbers/index.tsx | 68 +++++++++ .../CardRegist/components/InputNumbers.tsx | 130 ------------------ .../components/TitleText/index.style.ts | 6 + .../CardRegist/components/TitleText/index.tsx | 11 ++ src/pages/CardRegist/components/index.ts | 2 +- src/pages/CardRegist/index.style.ts | 9 -- src/pages/CardRegist/index.tsx | 4 +- 8 files changed, 93 insertions(+), 142 deletions(-) create mode 100644 src/pages/CardRegist/components/InputCardNumbers/index.style.ts create mode 100644 src/pages/CardRegist/components/InputCardNumbers/index.tsx delete mode 100644 src/pages/CardRegist/components/InputNumbers.tsx create mode 100644 src/pages/CardRegist/components/TitleText/index.style.ts create mode 100644 src/pages/CardRegist/components/TitleText/index.tsx diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.style.ts b/src/pages/CardRegist/components/InputCardNumbers/index.style.ts new file mode 100644 index 00000000..c294c2f5 --- /dev/null +++ b/src/pages/CardRegist/components/InputCardNumbers/index.style.ts @@ -0,0 +1,5 @@ +import styled from '@emotion/styled'; + +export const InputNumbersContainer = styled.div` + width: 100%; +`; diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.tsx b/src/pages/CardRegist/components/InputCardNumbers/index.tsx new file mode 100644 index 00000000..27c80e85 --- /dev/null +++ b/src/pages/CardRegist/components/InputCardNumbers/index.tsx @@ -0,0 +1,68 @@ +import { useRef } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; + +import * as S from './index.style'; +import TitleText from '../TitleText'; + +import { + Information, + InformationBody, + InformationHeader, + InputWrapper, +} from '~/components'; +import { Input } from '~/components'; + +const InputCardNumbers = () => { + const { control, getFieldState, formState } = useFormContext(); + const inputRefArray = useRef<(HTMLInputElement | null)[]>([ + null, + null, + null, + null, + ]); + const { invalid } = getFieldState('numbers', formState); + + return ( + + + + + + + + {inputRefArray.current.map((_, index) => ( + value.length === 4, + required: true, + }} + render={({ field: { onChange } }) => ( + { + if (element instanceof HTMLInputElement) { + inputRefArray.current[index] = element; + } + }} + type={index < 2 ? 'text' : 'password'} + onChange={onChange} + maxLength={4} + onComplete={() => { + inputRefArray.current[index + 1]?.focus(); + }} + /> + )} + /> + ))} + + + + + ); +}; + +export default InputCardNumbers; diff --git a/src/pages/CardRegist/components/InputNumbers.tsx b/src/pages/CardRegist/components/InputNumbers.tsx deleted file mode 100644 index d27cd6d8..00000000 --- a/src/pages/CardRegist/components/InputNumbers.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { Controller, useFormContext } from 'react-hook-form'; -import { - Information, - InformationBody, - InformationHeader, - InputWrapper, -} from '../../../components'; -import * as S from '../index.style'; -import { Input } from '../../../components'; -import { useEffect, useRef, useState } from 'react'; - -const InputNumbers = () => { - const { control, getFieldState, formState } = useFormContext(); - const [isInvalidation, setIsInvalidation] = useState(false); - const firstInputRef = useRef(null); - const secondInputRef = useRef(null); - const thirdInputRef = useRef(null); - const fourthInputRef = useRef(null); - const { invalid } = getFieldState('numbers', formState); - - useEffect(() => { - setIsInvalidation(invalid); - }, [invalid]); - - return ( - - - 카드 번호 - - - - - value.length === 4, - required: true, - }} - control={control} - render={({ field: { value, onChange, onBlur } }) => ( - { - secondInputRef.current?.focus(); - }} - /> - )} - /> - - - value.length === 4, - required: true, - }} - control={control} - render={({ field: { value, onChange, onBlur } }) => ( - { - thirdInputRef.current?.focus(); - }} - /> - )} - /> - - - value.length === 4, - required: true, - }} - control={control} - render={({ field: { value, onChange, onBlur } }) => ( - { - fourthInputRef.current?.focus(); - }} - /> - )} - /> - - - value.length === 4, - required: true, - }} - control={control} - render={({ field: { value, onChange, onBlur } }) => ( - - )} - /> - - - - - ); -}; - -export default InputNumbers; diff --git a/src/pages/CardRegist/components/TitleText/index.style.ts b/src/pages/CardRegist/components/TitleText/index.style.ts new file mode 100644 index 00000000..c98359f3 --- /dev/null +++ b/src/pages/CardRegist/components/TitleText/index.style.ts @@ -0,0 +1,6 @@ +import styled from '@emotion/styled'; + +export const TitleText = styled.span` + font-size: 16px; + font-weight: normal; +`; diff --git a/src/pages/CardRegist/components/TitleText/index.tsx b/src/pages/CardRegist/components/TitleText/index.tsx new file mode 100644 index 00000000..346f9ede --- /dev/null +++ b/src/pages/CardRegist/components/TitleText/index.tsx @@ -0,0 +1,11 @@ +import * as S from './index.style'; + +interface TitleTextProps { + label: string; +} + +const TitleText = ({ label }: TitleTextProps) => { + return {label}; +}; + +export default TitleText; diff --git a/src/pages/CardRegist/components/index.ts b/src/pages/CardRegist/components/index.ts index 7f3a7dc5..3b66a3b3 100644 --- a/src/pages/CardRegist/components/index.ts +++ b/src/pages/CardRegist/components/index.ts @@ -1,5 +1,5 @@ export { default as InputCompany } from './InputCompany'; -export { default as InputNumbers } from './InputNumbers'; +export { default as InputCardNumbers } from './InputCardNumbers'; export { default as InputEndDate } from './InputEndDate'; export { default as InputCardUser } from './InputCardUser'; export { default as InputSecurityCode } from './InputSecurityCode'; diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index f9801ab1..edea5a3c 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -16,10 +16,6 @@ export const FooterButtonContainer = styled.div` justify-content: end; `; -export const InputNumbersContainer = styled.div` - width: 100%; -`; - export const InputEndDateContainer = styled.div` width: 150px; `; @@ -38,8 +34,3 @@ export const InputPasswordItemContainer = styled.div` display: flex; gap: 5px; `; - -export const TitleText = styled.span` - font-size: 16px; - font-weight: normal; -`; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 32dbc728..c8bd782f 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -3,7 +3,7 @@ import { useDispatch } from 'react-redux'; import { useNavigate } from 'react-router-dom'; import { - InputNumbers, + InputCardNumbers, InputEndDate, InputCardUser, InputSecurityCode, @@ -57,7 +57,7 @@ const CardRegist = () => { - + {/* */} From 42e8604f979205c8aacbbf25bd02fc75fe5a2784 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:48:13 +0900 Subject: [PATCH 098/307] =?UTF-8?q?refactoring:=20Input=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 props를 기본 InputElement타입으로 받기 --- src/components/Input/index.tsx | 76 ++++++++++++---------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index 59c8062a..cf017c1e 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -1,59 +1,37 @@ -import { - ChangeEvent, - HTMLInputTypeAttribute, - forwardRef, - useEffect, - useState, -} from 'react'; +import { ChangeEvent, ComponentProps, forwardRef, useState } from 'react'; + import * as S from './index.style'; -interface InputProps { - onChange?: (value: string) => void; - onComplete?: () => void; - onBlur?: () => void; - defaultValue?: string; - maxLength?: number; - placeholder?: string; - type?: HTMLInputTypeAttribute; +export interface InputProps extends ComponentProps<'input'> { + onComplete?: (target?: HTMLInputElement) => void; textAlign?: 'center' | 'left'; onlyNumber?: boolean; - readonly?: boolean; } const Input = forwardRef( ( - { - onChange, - onComplete, - onBlur, - defaultValue = '', - maxLength, - onlyNumber = false, - textAlign = 'left', - placeholder = '', - type = 'text', - readonly = false, - }, + { onComplete, onChange, onlyNumber = false, textAlign = 'left', ...props }, ref, ) => { - const [value, setValue] = useState(defaultValue); + const [value, setState] = useState(''); - useEffect(() => { - setValue(defaultValue); - onChange && onChange(defaultValue); - }, [onChange, defaultValue]); + const handleChangeInput = (event: ChangeEvent) => { + const { target } = event; - const handleChange = (event: ChangeEvent) => { - const newValue = event.target.value; - if (onlyNumber && /^\d*$/.test(newValue)) { - setValue(newValue); - onChange && onChange(newValue); - } else if (!onlyNumber) { - setValue(newValue); - onChange && onChange(newValue); - } - if (maxLength && maxLength === newValue.length) { - onComplete && onComplete(); + if (target instanceof HTMLInputElement) { + const { maxLength } = target; + const newValue = event.target.value; + + if (onlyNumber && isNaN(Number(newValue))) { + return; + } + if (!onlyNumber || (onlyNumber && !isNaN(Number(newValue)))) { + onChange && onChange(event); + setState(newValue); + } + if (maxLength === newValue.length) { + onComplete && onComplete(event.target); + } } }; @@ -61,13 +39,11 @@ const Input = forwardRef( { + handleChangeInput(event); + }} + {...props} autoComplete='new-password' /> ); From c748b003fef4d3901eb930b9bce9055fd1d4def4 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:48:39 +0900 Subject: [PATCH 099/307] =?UTF-8?q?refactoring:=20TextTitle=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/components/InputCardUser.tsx | 5 +++-- src/pages/CardRegist/components/InputEndDate.tsx | 4 +++- src/pages/CardRegist/components/InputPassword.tsx | 8 +++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/pages/CardRegist/components/InputCardUser.tsx b/src/pages/CardRegist/components/InputCardUser.tsx index f9ae3db8..d1bff18b 100644 --- a/src/pages/CardRegist/components/InputCardUser.tsx +++ b/src/pages/CardRegist/components/InputCardUser.tsx @@ -1,4 +1,6 @@ import { Controller, useFormContext } from 'react-hook-form'; + +import TitleText from './TitleText'; import { Information, InformationBody, @@ -6,7 +8,6 @@ import { Input, InputWrapper, } from '../../../components'; -import * as S from '../index.style'; const InputCardUser = () => { const { control } = useFormContext(); @@ -14,7 +15,7 @@ const InputCardUser = () => { return ( - 카드 소유자이름(선택) + diff --git a/src/pages/CardRegist/components/InputEndDate.tsx b/src/pages/CardRegist/components/InputEndDate.tsx index 01349a93..95660757 100644 --- a/src/pages/CardRegist/components/InputEndDate.tsx +++ b/src/pages/CardRegist/components/InputEndDate.tsx @@ -1,5 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; + +import TitleText from './TitleText'; import { Information, InformationBody, @@ -23,7 +25,7 @@ const InputEndDate = () => { return ( - 만료일 + diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx index 75b300a7..b3d029bc 100644 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ b/src/pages/CardRegist/components/InputPassword.tsx @@ -1,4 +1,7 @@ +import { useEffect, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; + +import TitleText from './TitleText'; import { Information, InformationBody, @@ -7,11 +10,10 @@ import { InputWrapper, Keypad, } from '../../../components'; -import * as S from '../index.style'; import { useModal } from '../../../hooks'; -import { useEffect, useState } from 'react'; import { CardPassword, KeypadNumbers } from '../../../types'; import suffle from '../../../utils/suffle'; +import * as S from '../index.style'; const InputPassword = () => { const defaultNumbers: KeypadNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; @@ -52,7 +54,7 @@ const InputPassword = () => { return ( - 카드 비밀번호 + From faa686c561996880d857d14c82a3a504c656aa7f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:48:47 +0900 Subject: [PATCH 100/307] =?UTF-8?q?chore:=20=EB=B3=80=EA=B2=BD=EB=90=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=ED=83=80=EC=9E=85=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/index.ts b/src/store/index.ts index 16bfc5e8..d4d5d457 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,8 +1,8 @@ import { configureStore, createSlice } from '@reduxjs/toolkit'; -import { MyCard } from '../types'; +import { RegisteredCard } from '../types'; -export type CardState = MyCard; +export type CardState = RegisteredCard; interface CardsState { cards: CardState[]; From d0e77daad6ac8c2da49e9e392973e88d2ea585f5 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 15:56:51 +0900 Subject: [PATCH 101/307] =?UTF-8?q?refacotoring:=20InputEndDate=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 useState, useEffect 삭제 - import-order ESLint 적용 - inputRef를 배열로 관리하기 - 불필요한 rules 삭제 --- .../components/InputEndDate/index.style.ts | 5 ++++ .../index.tsx} | 29 ++++++++----------- src/pages/CardRegist/index.style.ts | 4 --- 3 files changed, 17 insertions(+), 21 deletions(-) create mode 100644 src/pages/CardRegist/components/InputEndDate/index.style.ts rename src/pages/CardRegist/components/{InputEndDate.tsx => InputEndDate/index.tsx} (66%) diff --git a/src/pages/CardRegist/components/InputEndDate/index.style.ts b/src/pages/CardRegist/components/InputEndDate/index.style.ts new file mode 100644 index 00000000..656e7d0b --- /dev/null +++ b/src/pages/CardRegist/components/InputEndDate/index.style.ts @@ -0,0 +1,5 @@ +import styled from '@emotion/styled'; + +export const InputEndDateContainer = styled.div` + width: 150px; +`; diff --git a/src/pages/CardRegist/components/InputEndDate.tsx b/src/pages/CardRegist/components/InputEndDate/index.tsx similarity index 66% rename from src/pages/CardRegist/components/InputEndDate.tsx rename to src/pages/CardRegist/components/InputEndDate/index.tsx index 95660757..d3658764 100644 --- a/src/pages/CardRegist/components/InputEndDate.tsx +++ b/src/pages/CardRegist/components/InputEndDate/index.tsx @@ -1,27 +1,22 @@ -import { useEffect, useRef, useState } from 'react'; +import { useRef } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; -import TitleText from './TitleText'; +import * as S from './index.style'; +import TitleText from '../TitleText'; + import { Information, InformationBody, InformationHeader, InputWrapper, Input, -} from '../../../components'; -import * as S from '../index.style'; +} from '~/components'; const InputEndDate = () => { const { control, getFieldState, formState } = useFormContext(); - const [isInvalidation, setIsInvalidation] = useState(false); - const firstInputRef = useRef(null); - const secondInputRef = useRef(null); + const InputRefArray = useRef<(HTMLInputElement | null)[]>([null, null]); const { invalid } = getFieldState('endDate', formState); - useEffect(() => { - setIsInvalidation(invalid); - }, [invalid]); - return ( @@ -29,21 +24,21 @@ const InputEndDate = () => { - + ( (InputRefArray.current[0] = element)} onlyNumber={true} - ref={firstInputRef} maxLength={2} onChange={onChange} placeholder={'MM'} textAlign='center' onComplete={() => { - secondInputRef.current?.focus(); + InputRefArray.current[1]?.focus(); }} /> )} @@ -52,11 +47,11 @@ const InputEndDate = () => { ( (InputRefArray.current[1] = element)} onlyNumber={true} - ref={secondInputRef} maxLength={2} textAlign='center' placeholder={'YY'} diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index edea5a3c..2f8441f8 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -16,10 +16,6 @@ export const FooterButtonContainer = styled.div` justify-content: end; `; -export const InputEndDateContainer = styled.div` - width: 150px; -`; - export const InputSecurityCodeContainer = styled.div` width: 100px; `; From 131609a513aa1b9e74fb52eea81b331e700fed01 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 16:00:02 +0900 Subject: [PATCH 102/307] =?UTF-8?q?refactoring:=20InputCardUser=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - import-order ESLint 적용 - 최대 20자 문구 추가 --- .../{InputCardUser.tsx => InputCardUser/index.tsx} | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) rename src/pages/CardRegist/components/{InputCardUser.tsx => InputCardUser/index.tsx} (85%) diff --git a/src/pages/CardRegist/components/InputCardUser.tsx b/src/pages/CardRegist/components/InputCardUser/index.tsx similarity index 85% rename from src/pages/CardRegist/components/InputCardUser.tsx rename to src/pages/CardRegist/components/InputCardUser/index.tsx index d1bff18b..ffc9ca50 100644 --- a/src/pages/CardRegist/components/InputCardUser.tsx +++ b/src/pages/CardRegist/components/InputCardUser/index.tsx @@ -1,13 +1,14 @@ import { Controller, useFormContext } from 'react-hook-form'; -import TitleText from './TitleText'; +import TitleText from '../TitleText'; + import { Information, InformationBody, InformationHeader, Input, InputWrapper, -} from '../../../components'; +} from '~/components'; const InputCardUser = () => { const { control } = useFormContext(); @@ -15,7 +16,7 @@ const InputCardUser = () => { return ( - + From 76dc08b825d786a73fb5f74051486e1ee1391473 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 25 Jul 2024 16:04:23 +0900 Subject: [PATCH 103/307] =?UTF-8?q?refactoring:=20InputSecurityCode=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 useState, useEffect 삭제 - import-order ESLint 적용 - 스타일 파일 푼리 --- .../InputSecurityCode/index.style.ts | 5 +++++ .../index.tsx} | 18 ++++++++---------- src/pages/CardRegist/index.style.ts | 4 ---- src/pages/CardRegist/index.tsx | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 src/pages/CardRegist/components/InputSecurityCode/index.style.ts rename src/pages/CardRegist/components/{InputSecurityCode.tsx => InputSecurityCode/index.tsx} (75%) diff --git a/src/pages/CardRegist/components/InputSecurityCode/index.style.ts b/src/pages/CardRegist/components/InputSecurityCode/index.style.ts new file mode 100644 index 00000000..91ca3029 --- /dev/null +++ b/src/pages/CardRegist/components/InputSecurityCode/index.style.ts @@ -0,0 +1,5 @@ +import styled from '@emotion/styled'; + +export const InputSecurityCodeContainer = styled.div` + width: 100px; +`; diff --git a/src/pages/CardRegist/components/InputSecurityCode.tsx b/src/pages/CardRegist/components/InputSecurityCode/index.tsx similarity index 75% rename from src/pages/CardRegist/components/InputSecurityCode.tsx rename to src/pages/CardRegist/components/InputSecurityCode/index.tsx index 2bdd9d53..d691feb6 100644 --- a/src/pages/CardRegist/components/InputSecurityCode.tsx +++ b/src/pages/CardRegist/components/InputSecurityCode/index.tsx @@ -1,31 +1,28 @@ import { Controller, useFormContext } from 'react-hook-form'; + +import * as S from './index.style'; +import TitleText from '../TitleText'; + import { Information, InformationBody, InformationHeader, Input, InputWrapper, -} from '../../../components'; -import * as S from '../index.style'; -import { useEffect, useState } from 'react'; +} from '~/components'; const InputSecurityCode = () => { const { control, getFieldState, formState } = useFormContext(); - const [isInvalidation, setIsInvalidation] = useState(false); const { invalid } = getFieldState('securityCode', formState); - useEffect(() => { - setIsInvalidation(invalid); - }, [invalid]); - return ( - 보안코드(CVC/CVV) + - + { render={({ field: { onChange } }) => ( { - {/* */} + {/* */} From c0e8d57e4a88b6fa6cef91a9b238373b2e6945fe Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 13:32:16 +0900 Subject: [PATCH 104/307] =?UTF-8?q?fix:=20Deembackground=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20onClose=EA=B0=80=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EB=8F=99=EC=9E=91=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - event.target 에 제한을 둠으로써 수정 --- src/components/DeemBackground/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/DeemBackground/index.tsx b/src/components/DeemBackground/index.tsx index f66eae47..95234fc0 100644 --- a/src/components/DeemBackground/index.tsx +++ b/src/components/DeemBackground/index.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren } from 'react'; +import { MouseEvent, PropsWithChildren } from 'react'; import * as S from './index.style'; @@ -10,7 +10,8 @@ const DeemBackground: React.FC> = ({ children, onClose, }) => { - const handleClickBackground = () => { + const handleClickBackground = (event: MouseEvent) => { + if (event.target !== event.currentTarget) return; onClose && onClose(); }; From c71987c2c0042736bb5e318fc98c0e26bcf19fa3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 13:32:45 +0900 Subject: [PATCH 105/307] =?UTF-8?q?feat:=20Input=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20value=20=ED=83=80=EC=9E=85=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20input=20=EC=97=98=EB=A6=AC=EB=A8=BC=ED=8A=B8?= =?UTF-8?q?=EC=9D=98=20defaultValue=20=ED=83=80=EC=9E=85=EA=B3=BC=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=ED=95=98=EA=B2=8C=20=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Input/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx index cf017c1e..b696bbce 100644 --- a/src/components/Input/index.tsx +++ b/src/components/Input/index.tsx @@ -10,10 +10,19 @@ export interface InputProps extends ComponentProps<'input'> { const Input = forwardRef( ( - { onComplete, onChange, onlyNumber = false, textAlign = 'left', ...props }, + { + onComplete, + onChange, + defaultValue, + onlyNumber = false, + textAlign = 'left', + ...props + }, ref, ) => { - const [value, setState] = useState(''); + const [value, setState] = useState< + string | number | readonly string[] | undefined + >(defaultValue); const handleChangeInput = (event: ChangeEvent) => { const { target } = event; From a52e349b0dd4d8993ab16c5f4ed18f1d49d6b28d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 13:34:54 +0900 Subject: [PATCH 106/307] =?UTF-8?q?refactoring:=20CardRegist=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Keypad에서 Deembackground 분리하기 - KeypadModal 컴포넌트 분리 - ReadonlyPassword 컴포넌트 분리 - 불필요한 useState, useEffect 삭제 - import-order ESLint 적용 - 경로 별칭 적용 - useRef를 배열로 관리하기 - 이벤트 위임 방식으로 이벤트 관리하기 --- src/components/Keypad/index.style.ts | 17 +-- src/components/Keypad/index.tsx | 52 +++----- .../CardRegist/components/InputPassword.tsx | 121 ------------------ .../components/InputPassword/KeypadModal.tsx | 23 ++++ .../InputPassword/ReadonlyPassword.tsx | 18 +++ .../components/InputPassword/index.style.ts | 12 ++ .../components/InputPassword/index.tsx | 95 ++++++++++++++ src/pages/CardRegist/index.style.ts | 11 -- src/pages/CardRegist/index.tsx | 2 +- 9 files changed, 171 insertions(+), 180 deletions(-) delete mode 100644 src/pages/CardRegist/components/InputPassword.tsx create mode 100644 src/pages/CardRegist/components/InputPassword/KeypadModal.tsx create mode 100644 src/pages/CardRegist/components/InputPassword/ReadonlyPassword.tsx create mode 100644 src/pages/CardRegist/components/InputPassword/index.style.ts create mode 100644 src/pages/CardRegist/components/InputPassword/index.tsx diff --git a/src/components/Keypad/index.style.ts b/src/components/Keypad/index.style.ts index 285915ce..6474b8e1 100644 --- a/src/components/Keypad/index.style.ts +++ b/src/components/Keypad/index.style.ts @@ -1,15 +1,8 @@ import styled from '@emotion/styled'; -export const DeemBackground = styled.div` - position: absolute; - left: 0px; - top: 0px; - z-index: 2; - - width: 100%; - height: 100%; - background-color: ${({ theme }) => theme.color.deemBackground}; -`; +interface KeypadItemProps { + order: number; +} export const KeypadContainer = styled.div` width: 100%; @@ -25,10 +18,6 @@ export const KeypadContainer = styled.div` grid-template-rows: repeat(3, 90px); `; -interface KeypadItemProps { - order: number; -} - export const KeypadItem = styled.div` color: ${({ theme }) => theme.color.mainGreen}; diff --git a/src/components/Keypad/index.tsx b/src/components/Keypad/index.tsx index 407f8a77..c9defff7 100644 --- a/src/components/Keypad/index.tsx +++ b/src/components/Keypad/index.tsx @@ -1,56 +1,42 @@ import { MouseEvent } from 'react'; + import * as S from './index.style'; -import { KeypadNumbers } from '../../types'; + +import { KeypadNumbers } from '~/types'; interface KeypadProps { - isOpen: boolean; - onClose?: () => void; numbers?: KeypadNumbers; - index?: number; - onClick?: (value: string, index: number) => void; + onClick?: (value: string) => void; } const Keypad = ({ - isOpen, onClick, - onClose, - index = 0, numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], }: KeypadProps) => { - const handleClickBackground = (event: MouseEvent) => { + const handleClickKeypad = (event: MouseEvent) => { const { target } = event; if (target instanceof HTMLDivElement) { if (target.classList.contains('keypad-item')) { - onClick && onClick(target.innerText, index); - } else if (target.classList.contains('keypad-background')) { - onClose && onClose(); + onClick && onClick(target.innerText); } } }; - const handleClickKeypad = () => {}; return ( - isOpen && ( - - - {numbers.map((number, index) => ( - - {number} - - ))} - - - - - ) + + {numbers.map((number, index) => ( + + {number} + + ))} + + + ); }; diff --git a/src/pages/CardRegist/components/InputPassword.tsx b/src/pages/CardRegist/components/InputPassword.tsx deleted file mode 100644 index b3d029bc..00000000 --- a/src/pages/CardRegist/components/InputPassword.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { useEffect, useState } from 'react'; -import { Controller, useFormContext } from 'react-hook-form'; - -import TitleText from './TitleText'; -import { - Information, - InformationBody, - InformationHeader, - Input, - InputWrapper, - Keypad, -} from '../../../components'; -import { useModal } from '../../../hooks'; -import { CardPassword, KeypadNumbers } from '../../../types'; -import suffle from '../../../utils/suffle'; -import * as S from '../index.style'; - -const InputPassword = () => { - const defaultNumbers: KeypadNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - const [password, setPassword] = useState(['', '']); - const [index, setIndex] = useState(0); - const [isInvalidation, setIsInvalidation] = useState(false); - const { control } = useFormContext(); - const { isOpen, open, close } = useModal(false); - - useEffect(() => { - if (password.every((value) => value.length === 1)) { - setIsInvalidation(false); - close(); - } else { - setIsInvalidation(true); - } - }, [password, close]); - - useEffect(() => { - if (index > 3) { - close(); - } - }, [index, close]); - - const handleClickInput = (index: number) => { - setIndex(index); - open(); - }; - - const handleClickKeypad = (value: string, index: number) => { - const nextState: CardPassword = [...password]; - nextState[index] = value; - - setPassword(nextState); - setIndex(index + 1); - }; - - return ( - - - - - - - {password.map((value, index) => ( - value.length === 1, - }} - control={control} - render={({ field: { onChange } }) => ( - - { - handleClickInput(index); - }} - > - - - - )} - /> - ))} - - - - - - - - { - close(); - }} - /> - - - ); -}; - -export default InputPassword; diff --git a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx new file mode 100644 index 00000000..3bd8cf2f --- /dev/null +++ b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx @@ -0,0 +1,23 @@ +import { DeemBackground, Keypad } from '~/components'; +import { KeypadNumbers } from '~/types'; +import suffle from '~/utils/suffle'; + +interface KeypadModalProps { + isOpen: boolean; + close: () => void; + onSelect: (value: string) => void; +} + +const KeypadModal = ({ isOpen, close, onSelect }: KeypadModalProps) => { + const keypadNumbers: KeypadNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + + return ( + isOpen && ( + + + + ) + ); +}; + +export default KeypadModal; diff --git a/src/pages/CardRegist/components/InputPassword/ReadonlyPassword.tsx b/src/pages/CardRegist/components/InputPassword/ReadonlyPassword.tsx new file mode 100644 index 00000000..5c73bd54 --- /dev/null +++ b/src/pages/CardRegist/components/InputPassword/ReadonlyPassword.tsx @@ -0,0 +1,18 @@ +import * as S from './index.style'; + +import { Input } from '~/components'; + +const ReadonlyPassword = () => { + return ( + <> + + + + + + + + ); +}; + +export default ReadonlyPassword; diff --git a/src/pages/CardRegist/components/InputPassword/index.style.ts b/src/pages/CardRegist/components/InputPassword/index.style.ts new file mode 100644 index 00000000..5b6fe294 --- /dev/null +++ b/src/pages/CardRegist/components/InputPassword/index.style.ts @@ -0,0 +1,12 @@ +import styled from '@emotion/styled'; + +export const InputPasswordListContainer = styled.div` + display: flex; + gap: 10px; +`; + +export const InputPasswordItemContainer = styled.div` + width: 50px; + display: flex; + gap: 5px; +`; diff --git a/src/pages/CardRegist/components/InputPassword/index.tsx b/src/pages/CardRegist/components/InputPassword/index.tsx new file mode 100644 index 00000000..8f92db6b --- /dev/null +++ b/src/pages/CardRegist/components/InputPassword/index.tsx @@ -0,0 +1,95 @@ +import { MouseEvent, useRef, useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; + +import * as S from './index.style'; +import KeypadModal from './KeypadModal'; +import ReadonlyPassword from './ReadonlyPassword'; +import TitleText from '../TitleText'; + +import { + Information, + InformationBody, + InformationHeader, + Input, + InputWrapper, +} from '~/components'; +import { useModal } from '~/hooks'; + +const InputPassword = () => { + const [index, setIndex] = useState(0); + const { control } = useFormContext(); + const { isOpen, open, close } = useModal(false); + const inputRefArray = useRef<(HTMLInputElement | null)[]>([null, null]); + + const handleClickKeypad = (value: string) => { + if (inputRefArray.current[index]) { + inputRefArray.current[index].value = value; + setIndex(index + 1); + } + if (index === 1) { + close(); + } + }; + + const handleClickInput = (event: MouseEvent) => { + if (!(event.target instanceof HTMLElement)) return; + const { target } = event; + const $container = target.closest('[data-index]'); + + if (!($container instanceof HTMLElement)) return; + if ($container.dataset.index === undefined) return; + + const index = $container.dataset.index; + setIndex(Number(index)); + open(); + }; + + return ( + + + + + + + {inputRefArray.current.map((_, index) => ( + + + value.length === 1, + }} + render={({ field: { value, onChange } }) => ( + { + if (element instanceof HTMLInputElement) { + inputRefArray.current[index] = element; + } + }} + onChange={onChange} + defaultValue={value} + type='password' + textAlign='center' + maxLength={1} + readOnly={true} + /> + )} + /> + + + ))} + + + + + + ); +}; + +export default InputPassword; diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index cc81d6d6..bbbd4b0f 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -15,14 +15,3 @@ export const FooterButtonContainer = styled.div` display: flex; justify-content: end; `; - -export const InputPasswordListContainer = styled.div` - display: flex; - gap: 10px; -`; - -export const InputPasswordItemContainer = styled.div` - width: 50px; - display: flex; - gap: 5px; -`; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index c0610469..ea8c519a 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -61,7 +61,7 @@ const CardRegist = () => { - {/* */} + From 4a530fbb938e56b16d4872d050fa0b7f27204926 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 13:36:56 +0900 Subject: [PATCH 107/307] =?UTF-8?q?style:=20=EB=8B=A4=EC=9D=8C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=B4=20=EC=9A=B0=EC=B8=A1=EC=97=90=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=ED=95=98=EB=8F=84=EB=A1=9D=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/index.style.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/CardRegist/index.style.ts b/src/pages/CardRegist/index.style.ts index bbbd4b0f..a812c91c 100644 --- a/src/pages/CardRegist/index.style.ts +++ b/src/pages/CardRegist/index.style.ts @@ -12,6 +12,7 @@ export const Form = styled.form` `; export const FooterButtonContainer = styled.div` + width: 100%; display: flex; - justify-content: end; + justify-content: flex-end; `; From 6db98c8ce5731a0658384e775cec5945fad59b52 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 14:30:56 +0900 Subject: [PATCH 108/307] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=EC=9D=B4=20?= =?UTF-8?q?=EC=95=88=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/InputPassword/index.tsx | 29 ++++++++----------- src/pages/CardRegist/index.tsx | 2 +- src/types/index.ts | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/pages/CardRegist/components/InputPassword/index.tsx b/src/pages/CardRegist/components/InputPassword/index.tsx index 8f92db6b..f5ae4cb7 100644 --- a/src/pages/CardRegist/components/InputPassword/index.tsx +++ b/src/pages/CardRegist/components/InputPassword/index.tsx @@ -1,4 +1,4 @@ -import { MouseEvent, useRef, useState } from 'react'; +import { MouseEvent, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import * as S from './index.style'; @@ -17,15 +17,13 @@ import { useModal } from '~/hooks'; const InputPassword = () => { const [index, setIndex] = useState(0); - const { control } = useFormContext(); + const { control, setValue, getFieldState, formState } = useFormContext(); const { isOpen, open, close } = useModal(false); - const inputRefArray = useRef<(HTMLInputElement | null)[]>([null, null]); + const { invalid } = getFieldState('password', formState); const handleClickKeypad = (value: string) => { - if (inputRefArray.current[index]) { - inputRefArray.current[index].value = value; - setIndex(index + 1); - } + setValue(`password.${index}`, value, { shouldValidate: true }); + setIndex(index + 1); if (index === 1) { close(); } @@ -51,25 +49,22 @@ const InputPassword = () => { - {inputRefArray.current.map((_, index) => ( + {[...new Array(2).fill(null)].map((_, index) => ( - + value.length === 1, + validate: (value) => + value !== undefined && value.length === 1, }} - render={({ field: { value, onChange } }) => ( + render={({ field: { value, onChange, ref } }) => ( { - if (element instanceof HTMLInputElement) { - inputRefArray.current[index] = element; - } - }} + ref={ref} + value={value} onChange={onChange} - defaultValue={value} type='password' textAlign='center' maxLength={1} diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index ea8c519a..aaa983f4 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -66,7 +66,7 @@ const CardRegist = () => { - {Object.values(formState.errors).length === 0 && ( + {formState.isValid && ( + )} From 1184fd744a72b9367ffd6de7a850f9598baf0e9a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 14:40:20 +0900 Subject: [PATCH 110/307] =?UTF-8?q?style:=20Payment=20=EC=BB=A8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=84=88=EC=97=90=20=EB=84=88=EB=B9=84=EA=B0=92=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Payment/index.style.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Payment/index.style.ts b/src/pages/Payment/index.style.ts index fcad8fa0..cb92c58c 100644 --- a/src/pages/Payment/index.style.ts +++ b/src/pages/Payment/index.style.ts @@ -5,6 +5,7 @@ export const Form = styled.form` `; export const InformationList = styled.div` + width: 100%; display: flex; flex-direction: column; gap: 20px; From 6bf6eee1578d31a8e232916fbb9c4728e1132310 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 16:32:28 +0900 Subject: [PATCH 111/307] =?UTF-8?q?chore:=20Storybook=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 7 +- .gitignore | 2 + .storybook/main.ts | 19 + .storybook/preview.jsx | 13 + package-lock.json | 8021 +++++++++++++++++++++++++++++++++++----- package.json | 16 +- 6 files changed, 7210 insertions(+), 868 deletions(-) create mode 100644 .storybook/main.ts create mode 100644 .storybook/preview.jsx diff --git a/.eslintrc.cjs b/.eslintrc.cjs index df32f161..21440708 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,12 +1,7 @@ module.exports = { root: true, env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - 'plugin:prettier/recommended', - ], + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:prettier/recommended', 'plugin:storybook/recommended'], ignorePatterns: ['dist', '.eslintrc.cjs'], parser: '@typescript-eslint/parser', plugins: ['react-refresh', 'import'], diff --git a/.gitignore b/.gitignore index a547bf36..bc6d3062 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? + +*storybook.log \ No newline at end of file diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 00000000..60baf8d0 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,19 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@storybook/addon-onboarding', + '@storybook/addon-links', + '@storybook/addon-essentials', + '@chromatic-com/storybook', + '@storybook/addon-interactions', + '@storybook/addon-themes', + '@storybook/themes' + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, +}; +export default config; diff --git a/.storybook/preview.jsx b/.storybook/preview.jsx new file mode 100644 index 00000000..456c69d8 --- /dev/null +++ b/.storybook/preview.jsx @@ -0,0 +1,13 @@ +import { withThemeFromJSXProvider } from '@storybook/addon-themes'; +import { ThemeProvider } from '@emotion/react'; +import theme from '../src/styles/theme'; + +export const decorators = [ + withThemeFromJSXProvider({ + themes: { + default: theme, + }, + defaultTheme: 'default', + Provider: ThemeProvider, + }), +]; diff --git a/package-lock.json b/package-lock.json index 714c49b4..31ac01a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,19 @@ "slick-carousel": "^1.8.1" }, "devDependencies": { + "@chromatic-com/storybook": "^1.6.1", "@emotion/eslint-plugin": "^11.11.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@storybook/addon-essentials": "^8.2.6", + "@storybook/addon-interactions": "^8.2.6", + "@storybook/addon-links": "^8.2.6", + "@storybook/addon-onboarding": "^8.2.6", + "@storybook/addon-themes": "^8.2.6", + "@storybook/blocks": "^8.2.6", + "@storybook/react": "^8.2.6", + "@storybook/react-vite": "^8.2.6", + "@storybook/test": "^8.2.6", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", @@ -43,8 +53,10 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-storybook": "^0.8.0", "jsdom": "^24.1.0", "prettier": "^3.3.3", + "storybook": "^8.2.6", "typescript": "^5.2.2", "vite": "^5.3.4", "vitest": "^2.0.2" @@ -82,6 +94,72 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.24.10", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", @@ -97,6 +175,145 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", + "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", @@ -134,6 +351,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", @@ -147,6 +377,106 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", @@ -177,6 +507,43 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/highlight": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", @@ -275,1145 +642,3800 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/template": { + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/eslint-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/eslint-plugin/-/eslint-plugin-11.11.0.tgz", - "integrity": "sha512-jCOYqU/0Sqm+g+6D7QuIlG99q8YAF0T7BP98zQF/MPZKfbcm46z5mizXn0YlhZ9AYZfNtZ1DeODXdncYxZzR4Q==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "6 || 7 || 8" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", - "dev": true + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@emotion/memoize": "^0.8.1" + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "dev": true + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", - "dev": true + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emotion/styled": { - "version": "11.11.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", - "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "dev": true + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, "peerDependencies": { - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", - "dev": true + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", - "dev": true + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", + "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", + "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-flow": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=12.22" + "node": ">=6.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, - "optional": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", - "dev": true + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@reduxjs/toolkit": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", - "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@remix-run/router": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", - "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz", + "integrity": "sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==", "dev": true, - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", + "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", + "dev": true + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@chromatic-com/storybook": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-1.6.1.tgz", + "integrity": "sha512-x1x1NB3j4xpfeSWKr96emc+7ZvfsvH+/WVb3XCjkB24PPbT8VZXb3mJSAQMrSzuQ8+eQE9kDogYHH9Fj3tb/Cw==", + "dev": true, + "dependencies": { + "chromatic": "^11.4.0", + "filesize": "^10.0.12", + "jsonfile": "^6.1.0", + "react-confetti": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0", + "yarn": ">=1.22.18" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/eslint-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/eslint-plugin/-/eslint-plugin-11.11.0.tgz", + "integrity": "sha512-jCOYqU/0Sqm+g+6D7QuIlG99q8YAF0T7BP98zQF/MPZKfbcm46z5mizXn0YlhZ9AYZfNtZ1DeODXdncYxZzR4Q==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": "6 || 7 || 8" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "dev": true + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "dev": true + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dev": true, + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", + "dev": true + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "dev": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", + "dev": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.1.tgz", + "integrity": "sha512-pdoMZ9QaPnVlSM+SdU/wgg0nyD/8wQ7y90ttO2CMCyrrm7RxveYIJ5eNfjPaoMFqW41LZra7QO9j+xV4Y18Glw==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "glob-promise": "^4.2.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "dev": true, + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", + "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", + "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, "os": [ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/addon-actions": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.6.tgz", + "integrity": "sha512-iCsf3V28/jJ95w2zd8aSvR4denoA2UYV3fpNCTGOURqICyKOG3cyVxvqKp8Hhcwn7trNOsK+HlL6q5gpv56ViA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.6.tgz", + "integrity": "sha512-61NFowA6EmCw+Eyzp0U4fat9MlPDdnT7aoDyzqSImLwWLITY9IvmWuTeo7XKJZN3fe22z1r7cZseKdYrtaHcKw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.6.tgz", + "integrity": "sha512-EHUwHy+oZZv3pXzN7fuXWrS/meHFjqcELY3RBvOyEkGf21agl6co6R1tnf6d5N5QoYAGfIbDO7dkauSL2RfNAw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.6.tgz", + "integrity": "sha512-qe7hxntaezqjKdU9QS+Q9NFL6i/uNdBxdvOnCKgPhBAY/zY6yhk5t3sOvonynPK5nkaNAowfSNPIzNxAXlJ1sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.2.6", + "@storybook/csf-plugin": "8.2.6", + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "8.2.6", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "fs-extra": "^11.1.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.6.tgz", + "integrity": "sha512-diGjGZcZNov+RCAVQBTm8JKP2kUtMRuJIQFBeXdPWpu6hYBk6lw1FlAf2GywWGCvdny1pJT90hfoD33qUMNuDg==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.2.6", + "@storybook/addon-backgrounds": "8.2.6", + "@storybook/addon-controls": "8.2.6", + "@storybook/addon-docs": "8.2.6", + "@storybook/addon-highlight": "8.2.6", + "@storybook/addon-measure": "8.2.6", + "@storybook/addon-outline": "8.2.6", + "@storybook/addon-toolbars": "8.2.6", + "@storybook/addon-viewport": "8.2.6", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.6.tgz", + "integrity": "sha512-03cV9USsfP3bS4wYV06DYcIaGPfoheQe53Q0Jr1B2yJUVyIPKvmO2nGjLBsqzeL3Wl7vSfLQn0/dUdxCcbqLsw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.6.tgz", + "integrity": "sha512-YXpHf8jWPz9HJV+Fw4GaunaCWeE6uqF24aLXdAd8xuhN1UfWJeNV6AwAvFQ0hTLqvmz0yMhX/5JXDKeKESoYDA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.2.6", + "@storybook/test": "8.2.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-links": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.6.tgz", + "integrity": "sha512-CUuU3nk8wyZ3bljCmOG/OCKazan+bPuNbCph8N763zyzdEx5M/CbBxV9d3pi3zjYpix7txlqrl2/YdMCejfyFw==", + "dev": true, + "dependencies": { + "@storybook/csf": "0.1.11", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-measure": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.6.tgz", + "integrity": "sha512-neI8YeSOAtOmzasLxo6O8ZLr2ebMaD7XVF+kYatl5+SpyuwwvUGcP9NkKe5S+mB8V2zxFUIsXS74XrhmQhRoaQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-onboarding": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.2.6.tgz", + "integrity": "sha512-udON3COEbi0f8A8+kdQxER6zueVMW2J4ES7ZrYyk7Z6LzzgAhfxmhdFTqEgY08jBEhuyskA2bA656GWk7X01EQ==", + "dev": true, + "dependencies": { + "react-confetti": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.6.tgz", + "integrity": "sha512-uAlPtqDWlq7MQQ4zJT80qdjbSdLF/zsvtPhidX6h9cjLKNPWAv79xJQ14AJHaMv+Hzy5xKnM4wdEhgPbzKabQg==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-themes": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.2.6.tgz", + "integrity": "sha512-N1qFD9aam1zpiMltjBOMFKr2/LkaZbvNPEpkFmpTkC21Qon5WxZsj84+ajSh4dMru01wZfGxDe/XqlIfwsoglw==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.6.tgz", + "integrity": "sha512-0JmRirMpxHS6VZzBk0kY871xWTpkk3TN4S1sxoFf5fcnCfVTHDjEJ5Ws/QWru1RJlIZHuJKRdQIA6Vuq5X+KfQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.6.tgz", + "integrity": "sha512-IAxH9H8tVFzSmZhKf5E+EALiAdkp19RzGqP/rWluD8LH7oW5HumQE/4oN0ZhVMy1RxYsCKFYjWyAp7AuxeMRSw==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/blocks": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.6.tgz", + "integrity": "sha512-nMlZJjVTyfOJ6xwORptsNuS1AZZlDbJUVXc2R8uukGd5GIXxxCdrPk4NvUsjfQslMT9LhYuFld3z62FATsM2rw==", + "dev": true, + "dependencies": { + "@storybook/csf": "0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.5", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.4.5", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-vite": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.6.tgz", + "integrity": "sha512-3PrsPZAedpQUbzRBEl23Fi1zG5bkQD76JsygVwmfiSm4Est4K8kW2AIB2ht9cIfKXh3mfQkyQlxXKHeQEHeQwQ==", + "dev": true, + "dependencies": { + "@storybook/csf-plugin": "8.2.6", + "@types/find-cache-dir": "^3.2.1", + "browser-assert": "^1.2.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@preact/preset-vite": "*", + "storybook": "^8.2.6", + "typescript": ">= 4.3.x", + "vite": "^4.0.0 || ^5.0.0", + "vite-plugin-glimmerx": "*" + }, + "peerDependenciesMeta": { + "@preact/preset-vite": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vite-plugin-glimmerx": { + "optional": true + } + } + }, + "node_modules/@storybook/codemod": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.6.tgz", + "integrity": "sha512-+mFJ6R+JhJLpU7VPDlXU5Yn6nqIBq745GaEosnIiFOdNo3jaxJ58wq/sGhbQvoCHPUxMA+sDQvR7pS62YFoLRQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/core": "8.2.6", + "@storybook/csf": "0.1.11", + "@types/cross-spawn": "^6.0.2", + "cross-spawn": "^7.0.3", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "lodash": "^4.17.21", + "prettier": "^3.1.1", + "recast": "^0.23.5", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/codemod/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/codemod/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/components": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.6.tgz", + "integrity": "sha512-H8ckH1AnLkHtMtvJ3J8LxnmDtHxkJ7NJacGctHMRrsBIvdKTVwlT4su5nAVVJlan/PrEou+jESfw+OjjBYE5PA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/core": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.6.tgz", + "integrity": "sha512-XY71g3AcpD6IiER9k9Lt+vlUMYfPIYgWekd7e0Ggzz2gJkPuLunKEdQccLGDSHf5OFAobHhrTJc7ZsvWhmDMag==", + "dev": true, + "dependencies": { + "@storybook/csf": "0.1.11", + "@types/express": "^4.17.21", + "@types/node": "^18.0.0", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "process": "^0.11.10", + "recast": "^0.23.5", + "util": "^0.12.4", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core/node_modules/@types/node": { + "version": "18.19.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", + "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/csf": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", + "dev": true, + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.6.tgz", + "integrity": "sha512-USn7E/bMQYVqvFBuW6d9rKoSuCImjk0BAmc/0wIOuMQ/yQNp2Xze0m8eVkNHUIUDokyx0TXDjRjwq10Xxk16ag==", + "dev": true, + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/csf/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true + }, + "node_modules/@storybook/icons": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.9.tgz", + "integrity": "sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.6.tgz", + "integrity": "sha512-RxtpcMTUSq8/wPM6cR6EXVrPEiNuRbC71cIFVFZagOFYvnnOKwSPV+GOLPK0wxMbGB4c5/+Xe8ADefmZTvxOsA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^1.3.1", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/instrumenter/node_modules/@vitest/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/instrumenter/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/instrumenter/node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/@storybook/instrumenter/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@storybook/instrumenter/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/@storybook/manager-api": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.6.tgz", + "integrity": "sha512-uv36h/b5RhlajWtEg4cVPBYV8gZs6juux0nIE+6G9i7vt8Ild6gM9tW1KNabgZcaHFiyWJYCNWxJZoKjgUmXDg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", - "cpu": [ - "arm" - ], + "node_modules/@storybook/preview-api": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.6.tgz", + "integrity": "sha512-5vTj2ndX5ng4nDntZYe+r8UwLjCIGFymhq5/r2adAvRKL+Bo4zQDWGO7bhvGJk16do2THb2JvPz49ComW9LLZw==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/react": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.2.6.tgz", + "integrity": "sha512-awJlzfiAMrf8l9AgiLhjXEJ+HvS3VKPxNNQaRwBELGq/vigjJe656tMrhvg4OIlJXtlS+6XPshd2knLwjIWNLw==", + "dev": true, + "dependencies": { + "@storybook/components": "^8.2.6", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "^8.2.6", + "@storybook/preview-api": "^8.2.6", + "@storybook/react-dom-shim": "8.2.6", + "@storybook/theming": "^8.2.6", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^18.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", - "cpu": [ - "arm" - ], + "node_modules/@storybook/react-dom-shim": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.6.tgz", + "integrity": "sha512-B+x8UAEQPDp1yhN3tMh09NvSL38QNfJB7PAyLgKrfE7xIAzvewq+RLW2DfGkoZCy+Zr7QSHm1p7NOgud8+sQCg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/react-vite": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.2.6.tgz", + "integrity": "sha512-BpbteaIzsJZL1QN3iR7uuslrPfdtbZYXPhcU9awpfl5pW5MOQThuvl7728mwT8V7KdANeikJPgsnlETOb/afDA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.1", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "8.2.6", + "@storybook/react": "8.2.6", + "find-up": "^5.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6", + "vite": "^4.0.0 || ^5.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/react-vite/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/react-vite/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/react/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "18.19.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", + "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/react/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@storybook/react/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/test": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.6.tgz", + "integrity": "sha512-nTzNxReBcMRlX1+8PNU/MuA9ArFbeQhfZXMBIwJJoHOhnNe1knYpyn1++xINxAHKOh0BBhQ0NIMoKdcGmW3V6w==", + "dev": true, + "dependencies": { + "@storybook/csf": "0.1.11", + "@storybook/instrumenter": "8.2.6", + "@testing-library/dom": "10.1.0", + "@testing-library/jest-dom": "6.4.5", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "1.6.0", + "@vitest/spy": "1.6.0", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/test/node_modules/@testing-library/dom": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/test/node_modules/@testing-library/jest-dom": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz", + "integrity": "sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.3.2", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@storybook/test/node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/test/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@storybook/test/node_modules/@vitest/expect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/spy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@storybook/test/node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", - "cpu": [ - "riscv64" - ], + "node_modules/@storybook/test/node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "*" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", - "cpu": [ - "s390x" - ], + "node_modules/@storybook/test/node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/test/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/test/node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/test/node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "get-func-name": "^2.0.1" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", - "cpu": [ - "ia32" - ], + "node_modules/@storybook/test/node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "*" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/test/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/@storybook/test/node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@storybook/theming": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.6.tgz", + "integrity": "sha512-ICnYuLIVsYifVCMQljdHgrp+5vAquNybHxDGWiPeOxBicotwHF8rLhTckD2CdVQbMp0jk6r6jetvjXbFJ2MbvQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" + } }, "node_modules/@swc/core": { "version": "1.6.13", @@ -1754,12 +4776,148 @@ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true + }, + "node_modules/@types/emscripten": { + "version": "1.39.13", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", + "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", + "dev": true + }, + "node_modules/@types/escodegen": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz", + "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", + "dev": true + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/find-cache-dir": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", + "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", @@ -1776,12 +4934,48 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "node_modules/@types/node": { "version": "20.14.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", @@ -1803,6 +4997,18 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "devOptional": true }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", @@ -1873,11 +5079,56 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", @@ -2210,6 +5461,57 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@yarnpkg/fslib": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", + "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", + "dev": true, + "dependencies": { + "@yarnpkg/libzip": "^2.3.0", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/@yarnpkg/fslib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@yarnpkg/libzip": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", + "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", + "dev": true, + "dependencies": { + "@types/emscripten": "^1.39.6", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/@yarnpkg/libzip/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -2231,6 +5533,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -2283,6 +5594,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2314,6 +5638,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", @@ -2430,6 +5760,18 @@ "node": ">=12" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2451,6 +5793,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -2466,12 +5817,154 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2493,6 +5986,83 @@ "node": ">=8" } }, + "node_modules/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2530,6 +6100,26 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chai": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", @@ -2552,30 +6142,166 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromatic": { + "version": "11.5.6", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.5.6.tgz", + "integrity": "sha512-ycX/hlZLs69BltwwBNsEXr+As6x5/0rlwp6W/CiHMZ3tpm7dmkd+hQCsb8JGHb1h49W3qPOKQ/Lh9evqcJ1yeQ==", + "dev": true, + "bin": { + "chroma": "dist/bin.js", + "chromatic": "dist/bin.js", + "chromatic-cli": "dist/bin.js" + }, + "peerDependencies": { + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" + }, + "peerDependenciesMeta": { + "@chromatic-com/cypress": { + "optional": true + }, + "@chromatic-com/playwright": { + "optional": true + } + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">= 16" + "node": ">=0.10.0" } }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2606,18 +6332,97 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -2648,6 +6453,33 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -2780,6 +6612,18 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2814,6 +6658,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2823,6 +6673,15 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2832,6 +6691,34 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2868,12 +6755,33 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.1.tgz", + "integrity": "sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w==", + "dev": true + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/enquire.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", @@ -2891,6 +6799,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2981,6 +6901,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -3071,6 +6997,33 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3083,6 +7036,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", @@ -3279,55 +7263,204 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz", + "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-storybook": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", + "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { + "typescript": { "optional": true } } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz", - "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==", + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "peerDependencies": { - "eslint": ">=7" + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" } }, "node_modules/eslint-scope": { @@ -3397,6 +7530,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -3448,6 +7594,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -3471,6 +7626,63 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3532,6 +7744,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", + "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", + "dev": true, + "dependencies": { + "walk-up-path": "^3.0.1" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -3550,6 +7771,15 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filesize": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.4.tgz", + "integrity": "sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg==", + "dev": true, + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3562,6 +7792,80 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -3604,6 +7908,15 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/flow-parser": { + "version": "0.241.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.241.0.tgz", + "integrity": "sha512-82yKXpz7iWknWFsognZUf5a6mBQLnVrYoYSU9Nbu7FTOpKlu3v9ehpiI9mYXuaIO3J0ojX1b83M/InXvld9HUw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3643,6 +7956,71 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3699,6 +8077,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -3756,6 +8143,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/giget": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3789,6 +8201,25 @@ "node": ">=10.13.0" } }, + "node_modules/glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3874,6 +8305,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3961,6 +8398,45 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", + "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -3982,18 +8458,46 @@ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "dependencies": { - "whatwg-encoding": "^3.1.1" + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=18" + "node": ">= 0.8" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -4041,6 +8545,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -4124,6 +8648,43 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -4158,6 +8719,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -4249,6 +8822,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4261,6 +8849,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -4306,6 +8903,15 @@ "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4400,6 +9006,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4424,6 +9042,15 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -4512,6 +9139,45 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jscodeshift": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, "node_modules/jsdom": { "version": "24.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", @@ -4608,6 +9274,27 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4617,6 +9304,33 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4668,6 +9382,22 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4738,6 +9468,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true + }, + "node_modules/markdown-to-jsx": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.7.tgz", + "integrity": "sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4753,6 +9525,15 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -4766,6 +9547,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4841,6 +9634,55 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -4880,6 +9722,76 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-dir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-dir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -4913,6 +9825,35 @@ "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, + "node_modules/nypm": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.9.tgz", + "integrity": "sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -5001,6 +9942,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5042,6 +10001,29 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5072,6 +10054,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -5120,6 +10111,15 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5169,6 +10169,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5211,6 +10217,111 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -5310,6 +10421,58 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -5325,6 +10488,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -5351,6 +10529,42 @@ } ] }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -5362,6 +10576,76 @@ "node": ">=0.10.0" } }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-confetti": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", + "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", + "dev": true, + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-docgen": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", + "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "dev": true, + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -5374,6 +10658,27 @@ "react": "^18.3.1" } }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "dev": true, + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true + }, "node_modules/react-hook-form": { "version": "7.52.1", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.1.tgz", @@ -5463,6 +10768,57 @@ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -5489,12 +10845,39 @@ "redux": "^5.0.0" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -5513,6 +10896,88 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -5555,6 +11020,49 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5663,6 +11171,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -5718,6 +11246,66 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5750,6 +11338,24 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5821,6 +11427,12 @@ "node": ">= 10" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5856,18 +11468,261 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, + "node_modules/storybook": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.6.tgz", + "integrity": "sha512-8j30wDxQmkcqI0fWcSYFsUCjErsY1yTWbTW+yjbwM8DyW18Cud6CwbFRCxjFsH+2M0CjP6Pqs/m1PGI0vcQscQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/codemod": "8.2.6", + "@storybook/core": "8.2.6", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "fd-package-json": "^1.2.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "giget": "^1.0.0", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^3.1.1", + "prompts": "^2.4.0", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^3.1.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/storybook/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/storybook/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/storybook/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/storybook/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/storybook/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/storybook/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", @@ -6127,6 +11982,105 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/telejson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + } + }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "dev": true, + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -6167,6 +12121,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true + }, "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", @@ -6221,6 +12181,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -6269,6 +12238,15 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6287,6 +12265,33 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6299,6 +12304,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6311,6 +12325,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -6397,6 +12424,12 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6418,6 +12451,115 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -6427,6 +12569,60 @@ "node": ">= 4.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.0.tgz", + "integrity": "sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==", + "dev": true, + "dependencies": { + "acorn": "^8.12.1", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6454,6 +12650,56 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", @@ -6607,6 +12853,21 @@ "node": ">=18" } }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -6616,6 +12877,21 @@ "node": ">=12" } }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -6825,6 +13101,23 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -6861,6 +13154,12 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/package.json b/package.json index f3f72175..f392fd1c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "tsc": "tsc --noEmit", "test": "vitest", "test:ui": "vitest --ui", - "preview": "vite preview" + "preview": "vite preview", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "dependencies": { "@reduxjs/toolkit": "^2.0.1", @@ -29,9 +31,19 @@ "slick-carousel": "^1.8.1" }, "devDependencies": { + "@chromatic-com/storybook": "^1.6.1", "@emotion/eslint-plugin": "^11.11.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@storybook/addon-essentials": "^8.2.6", + "@storybook/addon-interactions": "^8.2.6", + "@storybook/addon-links": "^8.2.6", + "@storybook/addon-onboarding": "^8.2.6", + "@storybook/addon-themes": "^8.2.6", + "@storybook/blocks": "^8.2.6", + "@storybook/react": "^8.2.6", + "@storybook/react-vite": "^8.2.6", + "@storybook/test": "^8.2.6", "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", @@ -52,8 +64,10 @@ "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", + "eslint-plugin-storybook": "^0.8.0", "jsdom": "^24.1.0", "prettier": "^3.3.3", + "storybook": "^8.2.6", "typescript": "^5.2.2", "vite": "^5.3.4", "vitest": "^2.0.2" From 3445101aee643d6cae844ddfb501a63f6ba6a301 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 16:32:54 +0900 Subject: [PATCH 112/307] =?UTF-8?q?feat:=20Button=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=8A=A4=ED=86=A0=EB=A6=AC=EB=B6=81=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/Button.stories.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/stories/Button.stories.tsx diff --git a/src/stories/Button.stories.tsx b/src/stories/Button.stories.tsx new file mode 100644 index 00000000..fd4085f9 --- /dev/null +++ b/src/stories/Button.stories.tsx @@ -0,0 +1,17 @@ +import { ThemeProvider } from '@emotion/react'; +import { Button } from '~/components'; +import { ButtonProps } from '~/components/Button'; +import theme from '~/styles/theme'; + +export default { + title: 'components/Button', + component: Button, +}; + +export const Default = (args: ButtonProps) => { + return ( + + + + ); +}; From 9abe19628abed0d9c3a3267f4b008e3e2f348709 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 16:33:31 +0900 Subject: [PATCH 113/307] =?UTF-8?q?refactoring:=20Button=20props=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - invalid -> disabled --- src/components/Button/index.style.ts | 4 ++++ src/components/Button/index.tsx | 8 ++++---- src/pages/Payment/index.tsx | 5 ++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/components/Button/index.style.ts b/src/components/Button/index.style.ts index efd402ba..40ecde6a 100644 --- a/src/components/Button/index.style.ts +++ b/src/components/Button/index.style.ts @@ -26,6 +26,10 @@ export const Button = styled.button` cursor: pointer; + &:disabled { + cursor: not-allowed; + } + &:hover { filter: brightness(0.9); } diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index ecd67e99..c618ba08 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -1,16 +1,16 @@ import { PropsWithChildren } from 'react'; import * as S from './index.style'; -interface ButtonProps extends PropsWithChildren { +export interface ButtonProps extends PropsWithChildren { onClick?: () => void; type?: 'button' | 'reset' | 'submit'; - invalid?: boolean; + disabled?: boolean; } const Button = ({ onClick, type = 'button', - invalid = false, + disabled = false, children, }: ButtonProps) => { const handleClickButton = () => { @@ -18,7 +18,7 @@ const Button = ({ }; return ( - + {children} ); diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index 0bc932a1..b4580b02 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -33,7 +33,10 @@ const Payment = () => { - From 20b47a01ddd93571d02f6986340aec7055cb2788 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 17:09:20 +0900 Subject: [PATCH 114/307] =?UTF-8?q?refactoring:=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=84=EC=B9=AD=20=EC=A0=81=EC=9A=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.tsx | 4 ++-- src/components/CardSlider/index.tsx | 6 +++--- src/components/CompanySelection/index.tsx | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 41f33d9b..8d5a7351 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -4,7 +4,7 @@ import GoogleIcon from '../GoogleIcon'; import { cardCompany } from '~/constants'; import { DefaultCard } from '~/types'; -interface CardProps extends Partial { +export interface CardProps extends Partial { size?: 'small' | 'big'; onClick?: (card?: DefaultCard) => void; } @@ -21,7 +21,7 @@ const Card = ({ onClick, }: CardProps) => { const clickable = onClick ? true : false; - const encryptedNumbers = numbers.map((number, index) => { + const encryptedNumbers = Array.from(numbers).map((number, index) => { if (typeof number === 'string') { return index < 2 ? number : '●'.repeat(number.length); } diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 9b16e99a..216c9887 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -5,12 +5,12 @@ import Slider from 'react-slick'; import 'slick-carousel/slick/slick.css'; import 'slick-carousel/slick/slick-theme.css'; import * as S from './index.style'; -import { MyCard } from '../../types'; +import { RegisteredCard } from '~/types'; import Card from '../Card'; interface CardSliderProps { - cards: MyCard[]; - onChange?: (value: MyCard) => void; + cards: RegisteredCard[]; + onChange?: (value: RegisteredCard) => void; } const CardSlider = ({ cards, onChange }: CardSliderProps) => { diff --git a/src/components/CompanySelection/index.tsx b/src/components/CompanySelection/index.tsx index 97787677..e0cee6fb 100644 --- a/src/components/CompanySelection/index.tsx +++ b/src/components/CompanySelection/index.tsx @@ -1,8 +1,8 @@ import { MouseEvent } from 'react'; import * as S from './index.style'; -import { cardCompany } from '../../constants'; -import { CardCompany } from '../../types'; +import { cardCompany } from '~/constants'; +import { CardCompany } from '~/types'; function isCardCompany(key: string): key is keyof typeof cardCompany { return key in cardCompany; From 421b430b3b69767aa98dd9fe74f31d0154916cbd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 17:09:42 +0900 Subject: [PATCH 115/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=97=90=20none=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/constants/index.ts b/src/constants/index.ts index 59bf36fb..519ebb9e 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,4 +1,5 @@ export const cardCompany = Object.freeze({ + none: 'none', suyeon: '수연카드', sejin: '세진카드', chanwook: '찬욱카드', From a133cf2518cd938e59c7af6c560c0bf87135288f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 17:10:45 +0900 Subject: [PATCH 116/307] =?UTF-8?q?feat:=20Card=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20storybook=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/Card.stories.tsx | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/stories/Card.stories.tsx diff --git a/src/stories/Card.stories.tsx b/src/stories/Card.stories.tsx new file mode 100644 index 00000000..84dce49c --- /dev/null +++ b/src/stories/Card.stories.tsx @@ -0,0 +1,45 @@ +import { ThemeProvider } from '@emotion/react'; +import theme from '~/styles/theme'; +import { Card } from '~/components'; +import { CardProps } from '~/components/Card'; +import { cardCompany } from '~/constants'; + +export default { + title: 'components/Card', + component: Card, + argTypes: { + company: { + control: 'inline-radio', + options: [...Object.keys(cardCompany)], + }, + numbers: { + control: { + type: 'array', + }, + }, + endDate: { + control: 'object', + }, + cardUser: { + control: 'text', + }, + }, + args: { + size: 'small', + company: 'suyeon', + numbers: ['1234', '5678', '9101', '1121'], + endDate: { + month: '12', + day: '21', + }, + cardUser: '수연', + }, +}; + +export const Default = (args: CardProps) => { + return ( + + + + ); +}; From c002b9c988b6bf4efd2df31d72f85aa00af918ce Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 17:10:55 +0900 Subject: [PATCH 117/307] =?UTF-8?q?feat:=20Input=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20storybook=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/Input.stories.tsx | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/stories/Input.stories.tsx diff --git a/src/stories/Input.stories.tsx b/src/stories/Input.stories.tsx new file mode 100644 index 00000000..b876decc --- /dev/null +++ b/src/stories/Input.stories.tsx @@ -0,0 +1,42 @@ +import { ThemeProvider } from '@emotion/react'; +import theme from '~/styles/theme'; +import { Input } from '~/components'; +import { InputProps } from '~/components/Input'; + +export default { + title: 'components/Input', + component: Input, + argTypes: { + type: { + control: 'inline-radio', + options: ['text', 'password'], + }, + placeholder: { + control: 'text', + }, + value: { + control: 'text', + }, + onlyNumber: { + control: 'boolean', + }, + textAlign: { + control: 'inline-radio', + options: ['left', 'center'], + }, + }, + args: { + type: 'text', + placeholder: 'placeholder', + value: '', + onChange: () => {}, + }, +}; + +export const Defailt = (args: InputProps) => { + return ( + + + + ); +}; From 2bd79c1eae4d5c4f93ba396b959e923c38910fc2 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 26 Jul 2024 17:17:28 +0900 Subject: [PATCH 118/307] =?UTF-8?q?feat:=20InputWrapper=20storybook=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 --- src/components/InputWrapper/index.tsx | 2 +- src/stories/InputWrapper.stories.tsx | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/stories/InputWrapper.stories.tsx diff --git a/src/components/InputWrapper/index.tsx b/src/components/InputWrapper/index.tsx index 7c5bd631..afc0b086 100644 --- a/src/components/InputWrapper/index.tsx +++ b/src/components/InputWrapper/index.tsx @@ -2,7 +2,7 @@ import { ComponentProps, PropsWithChildren } from 'react'; import * as S from './index.style'; -interface InputWrapperProps extends ComponentProps<'div'> { +export interface InputWrapperProps extends ComponentProps<'div'> { type?: 'fill' | 'flushed'; isInvalidation?: boolean; } diff --git a/src/stories/InputWrapper.stories.tsx b/src/stories/InputWrapper.stories.tsx new file mode 100644 index 00000000..9cf6d1a0 --- /dev/null +++ b/src/stories/InputWrapper.stories.tsx @@ -0,0 +1,26 @@ +import { ThemeProvider } from '@emotion/react'; +import theme from '~/styles/theme'; +import { InputWrapper } from '~/components'; +import { InputWrapperProps } from '~/components/InputWrapper'; + +export default { + title: 'components/InputWrapper', + component: InputWrapper, + argTypes: { + type: { + control: 'inline-radio', + options: ['flushed', 'fill'], + }, + isInvalidation: { + control: 'boolean', + }, + }, +}; + +export const Defailt = (args: InputWrapperProps) => { + return ( + + + + ); +}; From f9d67dbba604f6b19dd28b4d2898363d7dc8c8fc Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 14:52:07 +0900 Subject: [PATCH 119/307] =?UTF-8?q?refactoring:=20InputWrapper=EC=97=90=20?= =?UTF-8?q?import-order=20ESLint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/InputWrapper.stories.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stories/InputWrapper.stories.tsx b/src/stories/InputWrapper.stories.tsx index 9cf6d1a0..64d3af89 100644 --- a/src/stories/InputWrapper.stories.tsx +++ b/src/stories/InputWrapper.stories.tsx @@ -1,7 +1,8 @@ import { ThemeProvider } from '@emotion/react'; -import theme from '~/styles/theme'; + import { InputWrapper } from '~/components'; import { InputWrapperProps } from '~/components/InputWrapper'; +import theme from '~/styles/theme'; export default { title: 'components/InputWrapper', From c78abd5e44b5221c3ccb4c0bf446aa9a1f1ea957 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 14:52:23 +0900 Subject: [PATCH 120/307] =?UTF-8?q?feat:=20Keypad=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20storybook=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Keypad/index.tsx | 2 +- src/stories/Keypad.stories.tsx | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/stories/Keypad.stories.tsx diff --git a/src/components/Keypad/index.tsx b/src/components/Keypad/index.tsx index c9defff7..c8eb321e 100644 --- a/src/components/Keypad/index.tsx +++ b/src/components/Keypad/index.tsx @@ -4,7 +4,7 @@ import * as S from './index.style'; import { KeypadNumbers } from '~/types'; -interface KeypadProps { +export interface KeypadProps { numbers?: KeypadNumbers; onClick?: (value: string) => void; } diff --git a/src/stories/Keypad.stories.tsx b/src/stories/Keypad.stories.tsx new file mode 100644 index 00000000..a6a77208 --- /dev/null +++ b/src/stories/Keypad.stories.tsx @@ -0,0 +1,26 @@ +import { ThemeProvider } from '@emotion/react'; + +import { Keypad } from '~/components'; +import { KeypadProps } from '~/components'; +import theme from '~/styles/theme'; + +export default { + title: 'components/Keypad', + component: Keypad, + argTypes: { + numbers: { + type: 'array', + }, + }, + args: { + numbers: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], + }, +}; + +export const Default = (args: KeypadProps) => { + return ( + + + + ); +}; From 8ce365c42f4d69dd532c9442e17dbf1761cf35c8 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 14:56:49 +0900 Subject: [PATCH 121/307] =?UTF-8?q?feat:=20CompanySelection=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20storybook=EC=97=90=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CompanySelection/index.tsx | 3 ++- src/stories/CompanySelection.stories.tsx | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/stories/CompanySelection.stories.tsx diff --git a/src/components/CompanySelection/index.tsx b/src/components/CompanySelection/index.tsx index e0cee6fb..e6904438 100644 --- a/src/components/CompanySelection/index.tsx +++ b/src/components/CompanySelection/index.tsx @@ -1,6 +1,7 @@ import { MouseEvent } from 'react'; import * as S from './index.style'; + import { cardCompany } from '~/constants'; import { CardCompany } from '~/types'; @@ -8,7 +9,7 @@ function isCardCompany(key: string): key is keyof typeof cardCompany { return key in cardCompany; } -interface CompanySelectionProps { +export interface CompanySelectionProps { onClick?: (company: CardCompany) => void; } diff --git a/src/stories/CompanySelection.stories.tsx b/src/stories/CompanySelection.stories.tsx new file mode 100644 index 00000000..31900962 --- /dev/null +++ b/src/stories/CompanySelection.stories.tsx @@ -0,0 +1,18 @@ +import { ThemeProvider } from '@emotion/react'; + +import { CompanySelection } from '~/components'; +import { CompanySelectionProps } from '~/components/CompanySelection'; +import theme from '~/styles/theme'; + +export default { + name: 'components/CompanySelection', + component: CompanySelection, +}; + +export const Default = (args: CompanySelectionProps) => { + return ( + + + + ); +}; From 0ca34d386f48631dbdca3ae53f3904dce9859ef5 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 14:59:16 +0900 Subject: [PATCH 122/307] =?UTF-8?q?refactoring:=20Button=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=B6=81=20import-order=20ESLint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/Button.stories.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/stories/Button.stories.tsx b/src/stories/Button.stories.tsx index fd4085f9..97cc2fd0 100644 --- a/src/stories/Button.stories.tsx +++ b/src/stories/Button.stories.tsx @@ -1,4 +1,5 @@ import { ThemeProvider } from '@emotion/react'; + import { Button } from '~/components'; import { ButtonProps } from '~/components/Button'; import theme from '~/styles/theme'; From 7d6ec9fc3147b8a89d87931b7a04031123280c5f Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 14:59:48 +0900 Subject: [PATCH 123/307] =?UTF-8?q?fix:=20components=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20CompanySelection=EC=9D=B4=20=EB=82=98=ED=83=80?= =?UTF-8?q?=EB=82=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=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 - prop을 name에서 title로 수정 --- src/stories/CompanySelection.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stories/CompanySelection.stories.tsx b/src/stories/CompanySelection.stories.tsx index 31900962..dd6ff0c7 100644 --- a/src/stories/CompanySelection.stories.tsx +++ b/src/stories/CompanySelection.stories.tsx @@ -5,7 +5,7 @@ import { CompanySelectionProps } from '~/components/CompanySelection'; import theme from '~/styles/theme'; export default { - name: 'components/CompanySelection', + title: 'components/CompanySelection', component: CompanySelection, }; From 007249c0ec00aa7df7f7ba65b0a498718c0b3d3e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:00:10 +0900 Subject: [PATCH 124/307] =?UTF-8?q?feat:=20DeemBackground=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=B6=81=EC=97=90=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DeemBackground/index.tsx | 2 +- src/stories/DeemBackground.stories.tsx | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/stories/DeemBackground.stories.tsx diff --git a/src/components/DeemBackground/index.tsx b/src/components/DeemBackground/index.tsx index 95234fc0..7941a8a0 100644 --- a/src/components/DeemBackground/index.tsx +++ b/src/components/DeemBackground/index.tsx @@ -2,7 +2,7 @@ import { MouseEvent, PropsWithChildren } from 'react'; import * as S from './index.style'; -interface DeemBackgroundProps { +export interface DeemBackgroundProps { onClose?: () => void; } diff --git a/src/stories/DeemBackground.stories.tsx b/src/stories/DeemBackground.stories.tsx new file mode 100644 index 00000000..3eacb2ec --- /dev/null +++ b/src/stories/DeemBackground.stories.tsx @@ -0,0 +1,18 @@ +import { ThemeProvider } from '@emotion/react'; + +import { DeemBackground } from '~/components'; +import { DeemBackgroundProps } from '~/components/DeemBackground'; +import theme from '~/styles/theme'; + +export default { + title: 'components/DeemBackground', + component: DeemBackground, +}; + +export const Default = (args: DeemBackgroundProps) => { + return ( + + + + ); +}; From 2ad1fd78ba6271bf83c8d49d1bc6823d5940e8c9 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:13:45 +0900 Subject: [PATCH 125/307] =?UTF-8?q?refacotoring:=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Card 컴포넌트 -> CreditCard 컴포넌트 --- src/components/Card/index.style.ts | 85 ++--------------- src/components/Card/index.tsx | 71 ++------------ src/components/CardSlider/index.tsx | 7 +- src/components/CreditCard/index.style.ts | 93 +++++++++++++++++++ src/components/CreditCard/index.tsx | 68 ++++++++++++++ src/components/index.ts | 2 +- src/pages/CardAlias/index.tsx | 4 +- src/pages/CardList/index.tsx | 6 +- src/pages/CardRegist/index.tsx | 4 +- .../components/CardSelection/index.tsx | 4 +- ...ard.stories.tsx => CreditCard.stories.tsx} | 15 +-- 11 files changed, 199 insertions(+), 160 deletions(-) create mode 100644 src/components/CreditCard/index.style.ts create mode 100644 src/components/CreditCard/index.tsx rename src/stories/{Card.stories.tsx => CreditCard.stories.tsx} (73%) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 4ba19ed9..6cc9e9b1 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -1,93 +1,24 @@ import styled from '@emotion/styled'; -import { CardCompany } from '~/types'; - -interface CardProps { - size: 'small' | 'big'; - company: CardCompany; - clickable: boolean; -} - -interface CardChipProps { - size: 'small' | 'big'; -} - -export const Container = styled.div` - display: flex; - align-items: center; - justify-content: center; - - margin: 10px 0; -`; +export const Card = styled.div` + width: 100%; + padding: 10px 20px; -export const Card = styled.div` display: flex; flex-direction: column; - align-items: center; - justify-content: center; - gap: 5px; - - width: ${({ size }) => (size === 'small' ? 208 : 290)}px; - height: ${({ size }) => (size === 'small' ? 130 : 180)}px; - font-size: ${({ size }) => (size === 'small' ? 12 : 16)}px; - - background: ${({ theme, company }) => - company === 'none' ? theme.color.blackAlpha30 : theme.cardColor[company]}; - box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; - - user-select: ${({ company }) => (company === 'none' ? 'none' : 'auto')}; - border-radius: 5px; - padding: 10px 20px; - - cursor: ${({ clickable }) => (clickable ? 'pointer' : 'default')}; + flex-wrap: wrap; `; -export const CardTop = styled.div` +export const CardHeader = styled.div` width: 100%; - height: 100%; - display: flex; - align-items: center; -`; - -export const CardChip = styled.div` - width: ${({ size }) => (size === 'small' ? 40 : 55.04)}px; - height: ${({ size }) => (size === 'small' ? 26 : 35.77)}px; - left: 20px; - top: 40px; - - background: ${({ theme }) => theme.color.darkYellow}; - border-radius: 4px; -`; - -export const CardMiddle = styled.div` - width: 100%; - height: 100%; + font-size: 20px; display: flex; flex-direction: column; - gap: 5px; `; -export const CardBottom = styled.div` +export const CardBody = styled.div` width: 100%; - height: 100%; - - display: flex; - justify-content: space-between; + padding: 10px 5px; `; - -export const CardNumberList = styled.div` - display: flex; - justify-content: space-around; -`; - -export const CardNumberItem = styled.div` - min-width: 30px; - flex-grow: 1; - text-align: center; -`; - -export const CardBottomLeft = styled.div``; - -export const CardBottomRight = styled.div``; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 8d5a7351..814caf41 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -1,68 +1,13 @@ -import * as S from './index.style'; -import GoogleIcon from '../GoogleIcon'; - -import { cardCompany } from '~/constants'; -import { DefaultCard } from '~/types'; +import { PropsWithChildren } from 'react'; -export interface CardProps extends Partial { - size?: 'small' | 'big'; - onClick?: (card?: DefaultCard) => void; -} +import * as S from './index.style'; -const Card = ({ - size = 'small', - company = 'none', - numbers = ['', '', '', ''], - endDate = { - month: 'MM', - day: 'YY', - }, - cardUser = undefined, - onClick, -}: CardProps) => { - const clickable = onClick ? true : false; - const encryptedNumbers = Array.from(numbers).map((number, index) => { - if (typeof number === 'string') { - return index < 2 ? number : '●'.repeat(number.length); - } - return number; - }); - const handleClickCard = () => { - onClick && onClick(); - }; +interface InformationProps extends PropsWithChildren {} - return ( - - - {company === 'none' ? ( - - ) : ( - <> - {cardCompany[company]} - - - - {encryptedNumbers.map((number, index) => ( - {number} - ))} - - - - {cardUser} - - {endDate.month}/{endDate.day} - - - - )} - - - ); +const Information = ({ children }: InformationProps) => { + return {children}; }; -export default Card; +export default Information; +export { default as InformationHeader } from './InformationHeader'; +export { default as InformationBody } from './InformationBody'; diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index 216c9887..caa055ff 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -5,8 +5,9 @@ import Slider from 'react-slick'; import 'slick-carousel/slick/slick.css'; import 'slick-carousel/slick/slick-theme.css'; import * as S from './index.style'; +import CreditCard from '../CreditCard'; + import { RegisteredCard } from '~/types'; -import Card from '../Card'; interface CardSliderProps { cards: RegisteredCard[]; @@ -38,11 +39,11 @@ const CardSlider = ({ cards, onChange }: CardSliderProps) => { {cards.map((card) => ( - + ))} - + diff --git a/src/components/CreditCard/index.style.ts b/src/components/CreditCard/index.style.ts new file mode 100644 index 00000000..f89f9e94 --- /dev/null +++ b/src/components/CreditCard/index.style.ts @@ -0,0 +1,93 @@ +import styled from '@emotion/styled'; + +import { CardCompany } from '~/types'; + +interface CreditCardProps { + size: 'small' | 'big'; + company: CardCompany; + clickable: boolean; +} + +interface CardChipProps { + size: 'small' | 'big'; +} + +export const Container = styled.div` + display: flex; + align-items: center; + justify-content: center; + + margin: 10px 0; +`; + +export const CreditCard = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + + width: ${({ size }) => (size === 'small' ? 208 : 290)}px; + height: ${({ size }) => (size === 'small' ? 130 : 180)}px; + font-size: ${({ size }) => (size === 'small' ? 12 : 16)}px; + + background: ${({ theme, company }) => + company === 'none' ? theme.color.blackAlpha30 : theme.cardColor[company]}; + box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; + + user-select: ${({ company }) => (company === 'none' ? 'none' : 'auto')}; + border-radius: 5px; + padding: 10px 20px; + + cursor: ${({ clickable }) => (clickable ? 'pointer' : 'default')}; +`; + +export const CardTop = styled.div` + width: 100%; + height: 100%; + + display: flex; + align-items: center; +`; + +export const CardChip = styled.div` + width: ${({ size }) => (size === 'small' ? 40 : 55.04)}px; + height: ${({ size }) => (size === 'small' ? 26 : 35.77)}px; + left: 20px; + top: 40px; + + background: ${({ theme }) => theme.color.darkYellow}; + border-radius: 4px; +`; + +export const CardMiddle = styled.div` + width: 100%; + height: 100%; + + display: flex; + flex-direction: column; + gap: 5px; +`; + +export const CardBottom = styled.div` + width: 100%; + height: 100%; + + display: flex; + justify-content: space-between; +`; + +export const CardNumberList = styled.div` + display: flex; + justify-content: space-around; +`; + +export const CardNumberItem = styled.div` + min-width: 30px; + flex-grow: 1; + text-align: center; +`; + +export const CardBottomLeft = styled.div``; + +export const CardBottomRight = styled.div``; diff --git a/src/components/CreditCard/index.tsx b/src/components/CreditCard/index.tsx new file mode 100644 index 00000000..8a12cc82 --- /dev/null +++ b/src/components/CreditCard/index.tsx @@ -0,0 +1,68 @@ +import * as S from './index.style'; +import GoogleIcon from '../GoogleIcon'; + +import { cardCompany } from '~/constants'; +import { DefaultCard } from '~/types'; + +export interface CreditCardProps extends Partial { + size?: 'small' | 'big'; + onClick?: (card?: DefaultCard) => void; +} + +const CreditCard = ({ + size = 'small', + company = 'none', + numbers = ['', '', '', ''], + endDate = { + month: 'MM', + day: 'YY', + }, + cardUser = undefined, + onClick, +}: CreditCardProps) => { + const clickable = onClick ? true : false; + const encryptedNumbers = Array.from(numbers).map((number, index) => { + if (typeof number === 'string') { + return index < 2 ? number : '●'.repeat(number.length); + } + return number; + }); + const handleClickCard = () => { + onClick && onClick(); + }; + + return ( + + + {company === 'none' ? ( + + ) : ( + <> + {cardCompany[company]} + + + + {encryptedNumbers.map((number, index) => ( + {number} + ))} + + + + {cardUser} + + {endDate.month}/{endDate.day} + + + + )} + + + ); +}; + +export default CreditCard; diff --git a/src/components/index.ts b/src/components/index.ts index d9f70e85..7dded59d 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,7 +1,7 @@ export { default as Button } from './Button'; export { default as Modal } from './Modal'; export { default as Information } from './Information'; -export { default as Card } from './Card'; +export { default as CreditCard } from './CreditCard'; export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 4d558603..529c1b59 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -6,7 +6,7 @@ import { useNavigate, useParams } from 'react-router-dom'; import * as S from './index.style'; import { Button, - Card, + CreditCard, Input, InputWrapper, ModalBody, @@ -39,7 +39,7 @@ const CardAlias = () => { 카드등록이 완료되었습니다. - + { {cards.length > 0 ? ( cards.map((card) => ( - + {card.cardAlias} @@ -69,7 +69,7 @@ const CardList = () => { 아직 보유중인 카드가 없어요. )} - + ); diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index da297833..0ac39db3 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -16,7 +16,7 @@ import { ModalBody, ModalFooter, ModalHeader, - Card, + CreditCard, Button, PrevIcon, } from '~/components'; @@ -54,7 +54,7 @@ const CardRegist = () => { - { }} render={({ field: { onChange } }) => cards.length === 0 ? ( - + ) : ( ) diff --git a/src/stories/Card.stories.tsx b/src/stories/CreditCard.stories.tsx similarity index 73% rename from src/stories/Card.stories.tsx rename to src/stories/CreditCard.stories.tsx index 84dce49c..4c7e448a 100644 --- a/src/stories/Card.stories.tsx +++ b/src/stories/CreditCard.stories.tsx @@ -1,12 +1,13 @@ import { ThemeProvider } from '@emotion/react'; -import theme from '~/styles/theme'; -import { Card } from '~/components'; -import { CardProps } from '~/components/Card'; + +import { CreditCard } from '~/components'; +import { CreditCardProps } from '~/components/CreditCard'; import { cardCompany } from '~/constants'; +import theme from '~/styles/theme'; export default { - title: 'components/Card', - component: Card, + title: 'components/CreditCard', + component: CreditCard, argTypes: { company: { control: 'inline-radio', @@ -36,10 +37,10 @@ export default { }, }; -export const Default = (args: CardProps) => { +export const Default = (args: CreditCardProps) => { return ( - + ); }; From c6e7855b2f34e02eae129283f3549f389369f39a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:19:29 +0900 Subject: [PATCH 126/307] =?UTF-8?q?refactoring:=20Modal=EA=B3=BC=20Infroma?= =?UTF-8?q?tion=EB=B3=91=ED=95=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/CardBody.tsx | 11 ++++ .../ModalFooter.tsx => Card/CardFooter.tsx} | 3 +- src/components/Card/CardHeader.tsx | 11 ++++ src/components/Card/index.style.ts | 11 ++++ src/components/Card/index.tsx | 13 ++-- .../Information/InformationBody.tsx | 10 ---- .../Information/InformationHeader.tsx | 10 ---- src/components/Information/index.style.ts | 24 -------- src/components/Information/index.tsx | 13 ---- src/components/Modal/ModalBody.tsx | 10 ---- src/components/Modal/ModalHeader.tsx | 10 ---- src/components/Modal/index.style.ts | 59 ------------------- src/components/Modal/index.tsx | 31 ---------- src/components/index.ts | 6 +- src/pages/CardAlias/index.tsx | 20 +++---- src/pages/CardList/index.tsx | 12 ++-- src/pages/CardRegist/index.tsx | 18 +++--- 17 files changed, 69 insertions(+), 203 deletions(-) create mode 100644 src/components/Card/CardBody.tsx rename src/components/{Modal/ModalFooter.tsx => Card/CardFooter.tsx} (81%) create mode 100644 src/components/Card/CardHeader.tsx delete mode 100644 src/components/Information/InformationBody.tsx delete mode 100644 src/components/Information/InformationHeader.tsx delete mode 100644 src/components/Information/index.style.ts delete mode 100644 src/components/Information/index.tsx delete mode 100644 src/components/Modal/ModalBody.tsx delete mode 100644 src/components/Modal/ModalHeader.tsx delete mode 100644 src/components/Modal/index.style.ts delete mode 100644 src/components/Modal/index.tsx diff --git a/src/components/Card/CardBody.tsx b/src/components/Card/CardBody.tsx new file mode 100644 index 00000000..4cf5d95c --- /dev/null +++ b/src/components/Card/CardBody.tsx @@ -0,0 +1,11 @@ +import { PropsWithChildren } from 'react'; + +import * as S from './index.style'; + +interface CardBody extends PropsWithChildren {} + +const CardBody = ({ children }: CardBody) => { + return {children}; +}; + +export default CardBody; diff --git a/src/components/Modal/ModalFooter.tsx b/src/components/Card/CardFooter.tsx similarity index 81% rename from src/components/Modal/ModalFooter.tsx rename to src/components/Card/CardFooter.tsx index 1887bd38..816f8949 100644 --- a/src/components/Modal/ModalFooter.tsx +++ b/src/components/Card/CardFooter.tsx @@ -1,10 +1,11 @@ import { PropsWithChildren } from 'react'; + import * as S from './index.style'; interface ModalFooterProps extends PropsWithChildren {} const ModalFooter = ({ children }: ModalFooterProps) => { - return {children}; + return {children}; }; export default ModalFooter; diff --git a/src/components/Card/CardHeader.tsx b/src/components/Card/CardHeader.tsx new file mode 100644 index 00000000..12162454 --- /dev/null +++ b/src/components/Card/CardHeader.tsx @@ -0,0 +1,11 @@ +import { PropsWithChildren } from 'react'; + +import * as S from './index.style'; + +export interface CardHeaderProps extends PropsWithChildren {} + +const CardHeader = ({ children }: CardHeaderProps) => { + return {children}; +}; + +export default CardHeader; diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 6cc9e9b1..453de283 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -21,4 +21,15 @@ export const CardHeader = styled.div` export const CardBody = styled.div` width: 100%; padding: 10px 5px; + + display: flex; + flex-direction: column; +`; + +export const CardFooter = styled.div` + width: 100%; + padding: 10px 5px; + + display: flex; + flex-direction: column; `; diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx index 814caf41..956f1a83 100644 --- a/src/components/Card/index.tsx +++ b/src/components/Card/index.tsx @@ -2,12 +2,13 @@ import { PropsWithChildren } from 'react'; import * as S from './index.style'; -interface InformationProps extends PropsWithChildren {} +export interface CardProps extends PropsWithChildren {} -const Information = ({ children }: InformationProps) => { - return {children}; +const Card = ({ children }: CardProps) => { + return {children}; }; -export default Information; -export { default as InformationHeader } from './InformationHeader'; -export { default as InformationBody } from './InformationBody'; +export default Card; +export { default as CardHeader } from './CardHeader'; +export { default as CardBody } from './CardBody'; +export { default as CardFooter } from './CardFooter'; diff --git a/src/components/Information/InformationBody.tsx b/src/components/Information/InformationBody.tsx deleted file mode 100644 index 710b97c0..00000000 --- a/src/components/Information/InformationBody.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { PropsWithChildren } from 'react'; -import * as S from './index.style'; - -interface InformationBody extends PropsWithChildren {} - -const InformationBody = ({ children }: InformationBody) => { - return {children}; -}; - -export default InformationBody; diff --git a/src/components/Information/InformationHeader.tsx b/src/components/Information/InformationHeader.tsx deleted file mode 100644 index ea6800d9..00000000 --- a/src/components/Information/InformationHeader.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { PropsWithChildren } from 'react'; -import * as S from './index.style'; - -export interface InformationHeaderProps extends PropsWithChildren {} - -const InformationHeader = ({ children }: InformationHeaderProps) => { - return {children}; -}; - -export default InformationHeader; diff --git a/src/components/Information/index.style.ts b/src/components/Information/index.style.ts deleted file mode 100644 index 402ac2c0..00000000 --- a/src/components/Information/index.style.ts +++ /dev/null @@ -1,24 +0,0 @@ -import styled from '@emotion/styled'; - -export const Information = styled.div` - width: 100%; - padding: 10px 20px; - - display: flex; - flex-direction: column; - flex-wrap: wrap; -`; - -export const InformationHeader = styled.div` - width: 100%; - - font-size: 20px; - - display: flex; - flex-direction: column; -`; - -export const InformationBody = styled.div` - width: 100%; - padding: 10px 5px; -`; diff --git a/src/components/Information/index.tsx b/src/components/Information/index.tsx deleted file mode 100644 index 814caf41..00000000 --- a/src/components/Information/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { PropsWithChildren } from 'react'; - -import * as S from './index.style'; - -interface InformationProps extends PropsWithChildren {} - -const Information = ({ children }: InformationProps) => { - return {children}; -}; - -export default Information; -export { default as InformationHeader } from './InformationHeader'; -export { default as InformationBody } from './InformationBody'; diff --git a/src/components/Modal/ModalBody.tsx b/src/components/Modal/ModalBody.tsx deleted file mode 100644 index 423dffa6..00000000 --- a/src/components/Modal/ModalBody.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { PropsWithChildren } from 'react'; -import * as S from './index.style'; - -interface ModalBodyProps extends PropsWithChildren {} - -const ModalBody = ({ children }: ModalBodyProps) => { - return {children}; -}; - -export default ModalBody; diff --git a/src/components/Modal/ModalHeader.tsx b/src/components/Modal/ModalHeader.tsx deleted file mode 100644 index 89ea5410..00000000 --- a/src/components/Modal/ModalHeader.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { PropsWithChildren } from 'react'; -import * as S from './index.style'; - -interface ModalHeaderProps extends PropsWithChildren {} - -const ModalHeader = ({ children }: ModalHeaderProps) => { - return {children}; -}; - -export default ModalHeader; diff --git a/src/components/Modal/index.style.ts b/src/components/Modal/index.style.ts deleted file mode 100644 index 38705b8d..00000000 --- a/src/components/Modal/index.style.ts +++ /dev/null @@ -1,59 +0,0 @@ -import styled from '@emotion/styled'; - -export const DeemBackground = styled.div` - position: absolute; - - width: 100vw; - height: 100vh; - - background-color: ${({ theme }) => theme.color.deemBackground}; - z-index: 999; - - display: flex; - justify-content: center; - align-items: center; -`; - -export const Modal = styled.div` - min-width: 400px; - min-height: 250px; - max-height: 100vh; - overflow-y: scroll; - position: relative; - - display: flex; - flex-direction: column; - align-items: center; - flex-wrap: wrap; - - background-color: ${({ theme }) => theme.color.white}; - z-index: 10; -`; - -export const ModalHeader = styled.header` - width: 100%; - height: 70px; - padding: 10px; - - display: flex; - flex-direction: column; -`; - -export const ModalBody = styled.div` - width: 100%; - padding: 10px; - - display: flex; - flex-direction: column; - flex-wrap: wrap; - flex-grow: 1; -`; - -export const ModalFooter = styled.footer` - width: 100%; - padding: 20px; - - bottom: 0px; - - display: flex; -`; diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx deleted file mode 100644 index 21741ff6..00000000 --- a/src/components/Modal/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { PropsWithChildren } from 'react'; -import * as S from './index.style'; -import { createPortal } from 'react-dom'; - -interface ModalProps extends PropsWithChildren { - isOpen: boolean; - onClose?: () => void; -} - -const Modal = ({ isOpen, onClose, children }: ModalProps) => { - const $rootModal = document.getElementById('root-modal'); - const handleClickBackground = () => { - onClose && onClose(); - }; - - return ( - $rootModal && - isOpen && - createPortal( - - {children} - , - $rootModal, - ) - ); -}; - -export default Modal; -export { default as ModalHeader } from './ModalHeader'; -export { default as ModalBody } from './ModalBody'; -export { default as ModalFooter } from './ModalFooter'; diff --git a/src/components/index.ts b/src/components/index.ts index 7dded59d..e47d50ac 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,6 +1,5 @@ export { default as Button } from './Button'; -export { default as Modal } from './Modal'; -export { default as Information } from './Information'; +export { default as Card } from './Card'; export { default as CreditCard } from './CreditCard'; export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; @@ -10,6 +9,5 @@ export { default as CompanySelection } from './CompanySelection'; export { default as PrevIcon } from './PrevIcon'; export { default as GoogleIcon } from './GoogleIcon'; export { default as DeemBackground } from './DeemBackground'; -export * from './Modal'; -export * from './Information'; +export * from './Card'; export * from './Keypad'; diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 529c1b59..5c7e4ff9 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -1,18 +1,18 @@ import { useRef } from 'react'; -import { useSelector } from 'react-redux'; -import { useDispatch } from 'react-redux'; +import { useSelector, useDispatch } from 'react-redux'; import { useNavigate, useParams } from 'react-router-dom'; import * as S from './index.style'; + import { Button, CreditCard, Input, InputWrapper, - ModalBody, - ModalFooter, -} from '../../components'; -import { addCardName, CardState, RootState } from '../../store'; + CardBody, + CardFooter, +} from '~/components'; +import { addCardName, CardState, RootState } from '~/store'; const CardAlias = () => { const navigate = useNavigate(); @@ -33,7 +33,7 @@ const CardAlias = () => { return ( <> - + @@ -51,12 +51,12 @@ const CardAlias = () => { - - + + - + ); }; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 7ef33f23..03badad2 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -7,8 +7,8 @@ import * as S from './index.style'; import { Button, CreditCard, - ModalBody, - ModalHeader, + CardBody, + CardHeader, PrevIcon, } from '../../components'; import { removeCard, RootState } from '../../store'; @@ -49,13 +49,13 @@ const CardList = () => { return ( <> - + navigate('/payment')} /> 보유 카드 - - + + {cards.length > 0 ? ( cards.map((card) => ( @@ -70,7 +70,7 @@ const CardList = () => { )} - + ); }; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 0ac39db3..26ae2ef4 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -13,9 +13,9 @@ import { import * as S from './index.style'; import { - ModalBody, - ModalFooter, - ModalHeader, + CardBody, + CardFooter, + CardHeader, CreditCard, Button, PrevIcon, @@ -47,13 +47,13 @@ const CardRegist = () => { return ( <> - + navigate('/card-list')} /> 카드 추가 - - + + { - - + + {formState.isValid && ( )} - + ); }; From b2c08acb03b0f5ec7a93f316d2acec142c184920 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:20:26 +0900 Subject: [PATCH 127/307] =?UTF-8?q?style:=20Card=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=B0=B0=EA=B2=BD=EC=83=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.style.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 453de283..4bc5f357 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -7,6 +7,8 @@ export const Card = styled.div` display: flex; flex-direction: column; flex-wrap: wrap; + + background-color: ${({ theme }) => theme.color.white}; `; export const CardHeader = styled.div` @@ -16,6 +18,8 @@ export const CardHeader = styled.div` display: flex; flex-direction: column; + + background-color: ${({ theme }) => theme.color.white}; `; export const CardBody = styled.div` @@ -24,6 +28,8 @@ export const CardBody = styled.div` display: flex; flex-direction: column; + + background-color: ${({ theme }) => theme.color.white}; `; export const CardFooter = styled.div` @@ -32,4 +38,6 @@ export const CardFooter = styled.div` display: flex; flex-direction: column; + + background-color: ${({ theme }) => theme.color.white}; `; From 83a0fac21dc88f223ed61646f837cf20e8b5352c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:20:38 +0900 Subject: [PATCH 128/307] =?UTF-8?q?feat:=20Card=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=8A=A4=ED=86=A0=EB=A6=AC=EB=B6=81=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/Card.stories.tsx | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/stories/Card.stories.tsx diff --git a/src/stories/Card.stories.tsx b/src/stories/Card.stories.tsx new file mode 100644 index 00000000..d14a99c0 --- /dev/null +++ b/src/stories/Card.stories.tsx @@ -0,0 +1,36 @@ +import { ThemeProvider } from '@emotion/react'; + +import { DeemBackground, Card } from '~/components'; +import { CardBody, CardFooter, CardHeader, CardProps } from '~/components/Card'; +import theme from '~/styles/theme'; + +export default { + title: 'components/Card', + component: Card, +}; + +export const Default = (args: CardProps) => { + return ( + + + Header + Body + Footer + + + ); +}; + +export const WithDeemBackground = (args: CardProps) => { + return ( + + + + Header + Body + Footer + + + + ); +}; From 17889d97a434ed7daa8835a6837e1dc48b9a4211 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:26:05 +0900 Subject: [PATCH 129/307] =?UTF-8?q?refactoring:=20PrevIcon=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GoogleIcon 컴포넌트와 병합하기 --- src/components/GoogleIcon/index.tsx | 4 +++- src/components/PrevIcon/index.tsx | 17 ----------------- src/components/index.ts | 1 - src/pages/CardList/index.tsx | 16 ++++++++++------ src/pages/CardRegist/index.tsx | 8 ++++++-- 5 files changed, 19 insertions(+), 27 deletions(-) delete mode 100644 src/components/PrevIcon/index.tsx diff --git a/src/components/GoogleIcon/index.tsx b/src/components/GoogleIcon/index.tsx index 11b58d7e..8beda4df 100644 --- a/src/components/GoogleIcon/index.tsx +++ b/src/components/GoogleIcon/index.tsx @@ -1,6 +1,8 @@ +import { ComponentProps } from 'react'; + import { googleIcon } from '~/constants'; -interface GoogleIconProps { +interface GoogleIconProps extends ComponentProps<'span'> { name: keyof typeof googleIcon; } diff --git a/src/components/PrevIcon/index.tsx b/src/components/PrevIcon/index.tsx deleted file mode 100644 index 7bd58f6e..00000000 --- a/src/components/PrevIcon/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -interface PrevIconProps { - onClick?: () => void; -} - -const PrevIcon = ({ onClick }: PrevIconProps) => { - const handleClick = () => { - onClick && onClick(); - }; - - return ( - - arrow_back - - ); -}; - -export default PrevIcon; diff --git a/src/components/index.ts b/src/components/index.ts index e47d50ac..21c7d92e 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -6,7 +6,6 @@ export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; export { default as CardSlider } from './CardSlider'; export { default as CompanySelection } from './CompanySelection'; -export { default as PrevIcon } from './PrevIcon'; export { default as GoogleIcon } from './GoogleIcon'; export { default as DeemBackground } from './DeemBackground'; export * from './Card'; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 03badad2..24bd97cc 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -1,23 +1,27 @@ import { MouseEvent } from 'react'; -import { useSelector } from 'react-redux'; -import { useDispatch } from 'react-redux'; +import { useSelector, useDispatch } from 'react-redux'; import { useNavigate } from 'react-router-dom'; import * as S from './index.style'; + import { Button, CreditCard, CardBody, CardHeader, - PrevIcon, -} from '../../components'; -import { removeCard, RootState } from '../../store'; + GoogleIcon, +} from '~/components'; +import { removeCard, RootState } from '~/store'; const CardList = () => { const cards = useSelector((state: RootState) => state.cards); const navigate = useNavigate(); const dispatch = useDispatch(); + const handleClickBackButton = () => { + navigate('/payment'); + }; + const handleClickRemoveButton = (id: string) => { dispatch(removeCard({ id })); }; @@ -51,7 +55,7 @@ const CardList = () => { <> - navigate('/payment')} /> + 보유 카드 diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 26ae2ef4..552dfa68 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -18,7 +18,7 @@ import { CardHeader, CreditCard, Button, - PrevIcon, + GoogleIcon, } from '~/components'; import { useModal } from '~/hooks'; import { addCard } from '~/store'; @@ -38,6 +38,10 @@ const CardRegist = () => { open(); }; + const handleClickBackButton = () => { + navigate('/card-list'); + }; + const handleClickConfirmButton = () => { const id = generateID(); @@ -49,7 +53,7 @@ const CardRegist = () => { <> - navigate('/card-list')} /> + 카드 추가 From ef6f007064ee6619441a265dd7d4ae3171573eee Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:33:55 +0900 Subject: [PATCH 130/307] =?UTF-8?q?feat:=20=EC=8A=A4=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=EB=B6=81=20preview-head=20=EC=84=A4=EC=A0=95=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pretendard 폰트 링크 추가 - google Icon 링크 추가 --- .storybook/preview-head.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .storybook/preview-head.html diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 00000000..1489f983 --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,10 @@ + + From ed75d848d54ef0b0a005034d0354f28199da46ae Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 15:34:26 +0900 Subject: [PATCH 131/307] =?UTF-8?q?feat:=20GoogleIcon=20=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=B6=81=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GoogleIcon/index.tsx | 2 +- src/stories/GoogleIcon.stories.tsx | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/stories/GoogleIcon.stories.tsx diff --git a/src/components/GoogleIcon/index.tsx b/src/components/GoogleIcon/index.tsx index 8beda4df..50eb2205 100644 --- a/src/components/GoogleIcon/index.tsx +++ b/src/components/GoogleIcon/index.tsx @@ -2,7 +2,7 @@ import { ComponentProps } from 'react'; import { googleIcon } from '~/constants'; -interface GoogleIconProps extends ComponentProps<'span'> { +export interface GoogleIconProps extends ComponentProps<'span'> { name: keyof typeof googleIcon; } diff --git a/src/stories/GoogleIcon.stories.tsx b/src/stories/GoogleIcon.stories.tsx new file mode 100644 index 00000000..125304d7 --- /dev/null +++ b/src/stories/GoogleIcon.stories.tsx @@ -0,0 +1,28 @@ +import { ThemeProvider } from '@emotion/react'; + +import { GoogleIcon } from '~/components'; +import { GoogleIconProps } from '~/components/GoogleIcon'; +import { googleIcon } from '~/constants'; +import theme from '~/styles/theme'; + +export default { + title: 'components/GoogleIcon', + component: GoogleIcon, + argTypes: { + name: { + control: 'inline-radio', + options: [...Object.keys(googleIcon)], + }, + }, + args: { + name: 'add', + }, +}; + +export const Default = (args: GoogleIconProps) => { + return ( + + + + ); +}; From 0dc3a849e9cd74be3c544ab62e560f5dc7e88618 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:33:50 +0900 Subject: [PATCH 132/307] =?UTF-8?q?fix:=20HomePage=20=EC=97=90=EB=9F=AC=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 - 분리한 Deembackground 와 Card 컴포넌트 코드를 반영하지 않아서 생긴 문제 수정 --- src/pages/Home/index.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index aa57adb3..9dc45008 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -2,12 +2,12 @@ import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; -import { Button, Modal } from '~/components'; +import { Button, Card, DeemBackground } from '~/components'; import { useModal } from '~/hooks'; const Home = () => { const navigate = useNavigate(); - const { isOpen, open } = useModal(); + const { isOpen, open } = useModal(false); const handleClickOpenButton = () => { open(); @@ -19,11 +19,15 @@ const Home = () => { - - - - - + {isOpen && ( + + + + + + + + )}
); }; From 045a71312c79e38ae9569b273ddb160bf3b4524d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:34:33 +0900 Subject: [PATCH 133/307] =?UTF-8?q?fix:=20Payment=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modal 컴포넌트가 Card 컴포넌트와 병합되어 발생한 문제 수정 --- .../components/CardSelection/index.tsx | 19 ++++++---------- .../components/PaymentAmount/index.tsx | 14 ++++++------ .../components/TermAgreement/index.style.ts | 4 ++-- .../components/TermAgreement/index.tsx | 22 +++++++++---------- src/pages/Payment/index.tsx | 12 +++++----- 5 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/pages/Payment/components/CardSelection/index.tsx b/src/pages/Payment/components/CardSelection/index.tsx index 505f5e14..2669c851 100644 --- a/src/pages/Payment/components/CardSelection/index.tsx +++ b/src/pages/Payment/components/CardSelection/index.tsx @@ -5,12 +5,7 @@ import { useNavigate } from 'react-router-dom'; import TitleText from '../TitleText'; import { CardSlider } from '~/components'; -import { - CreditCard, - Information, - InformationBody, - InformationHeader, -} from '~/components'; +import { CreditCard, Card, CardBody, CardHeader } from '~/components'; import { RootState } from '~/store'; const PayCardInfomation = () => { @@ -23,11 +18,11 @@ const PayCardInfomation = () => { }; return ( - - + + - - + + { ) } /> - - + +
); }; diff --git a/src/pages/Payment/components/PaymentAmount/index.tsx b/src/pages/Payment/components/PaymentAmount/index.tsx index 66ea130b..6e24ce84 100644 --- a/src/pages/Payment/components/PaymentAmount/index.tsx +++ b/src/pages/Payment/components/PaymentAmount/index.tsx @@ -1,7 +1,7 @@ import * as S from './index.style'; import TitleText from '../TitleText'; -import { Information, InformationBody, InformationHeader } from '~/components'; +import { Card, CardBody, CardHeader } from '~/components'; interface PaymentAmountProps { amount: string; @@ -9,17 +9,17 @@ interface PaymentAmountProps { const PaymentAmount = ({ amount }: PaymentAmountProps) => { return ( - - + + - - + +
총 결제 금액
{amount}원
-
-
+ +
); }; diff --git a/src/pages/Payment/components/TermAgreement/index.style.ts b/src/pages/Payment/components/TermAgreement/index.style.ts index 075bb99d..958a6a1a 100644 --- a/src/pages/Payment/components/TermAgreement/index.style.ts +++ b/src/pages/Payment/components/TermAgreement/index.style.ts @@ -1,13 +1,13 @@ import styled from '@emotion/styled'; -export const TermInformationTop = styled.div` +export const TermCardTop = styled.div` display: flex; gap: 10px; font-size: 14px; `; -export const TermInformationBottom = styled.div` +export const TermCardBottom = styled.div` display: flex; justify-content: space-between; diff --git a/src/pages/Payment/components/TermAgreement/index.tsx b/src/pages/Payment/components/TermAgreement/index.tsx index 544cdf2c..2731c16f 100644 --- a/src/pages/Payment/components/TermAgreement/index.tsx +++ b/src/pages/Payment/components/TermAgreement/index.tsx @@ -3,23 +3,23 @@ import { useFormContext } from 'react-hook-form'; import * as S from './index.style'; import TitleText from '../TitleText'; -import { Information, InformationBody, InformationHeader } from '~/components'; +import { Card, CardBody, CardHeader } from '~/components'; const TermAgreement = () => { const { register } = useFormContext(); return ( - - + + - - - + + +
거래정보 제공 동의:
NEXTSTEP
상세보기
-
- + +
주문 내용을 확인하였으며 정보 제공 등에 동의합니다.
{ validate: (value) => value === true, })} /> -
-
-
+ + +
); }; diff --git a/src/pages/Payment/index.tsx b/src/pages/Payment/index.tsx index b4580b02..f1903174 100644 --- a/src/pages/Payment/index.tsx +++ b/src/pages/Payment/index.tsx @@ -3,7 +3,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { PaymentAmount, CardSelection, TermAgreement } from './components'; import * as S from './index.style'; -import { ModalHeader, ModalBody, Button, ModalFooter } from '~/components'; +import { CardHeader, CardBody, Button, CardFooter } from '~/components'; const Payment = () => { const methods = useForm({ @@ -18,17 +18,17 @@ const Payment = () => { return ( <> - Pay 결제 + Pay 결제 - + - - + + - + From 0c0aa5443317d086bc2906c3861b9c5f0f5d7631 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:37:25 +0900 Subject: [PATCH 134/307] =?UTF-8?q?refactoring:=20CreditCard=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=EC=8B=9C=ED=82=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CreditCard/index.style.ts | 4 +-- src/components/CreditCard/index.tsx | 40 ++++++++++-------------- src/constants/index.ts | 1 - src/types/index.ts | 2 +- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/components/CreditCard/index.style.ts b/src/components/CreditCard/index.style.ts index f89f9e94..023caa33 100644 --- a/src/components/CreditCard/index.style.ts +++ b/src/components/CreditCard/index.style.ts @@ -4,7 +4,7 @@ import { CardCompany } from '~/types'; interface CreditCardProps { size: 'small' | 'big'; - company: CardCompany; + company?: CardCompany; clickable: boolean; } @@ -32,7 +32,7 @@ export const CreditCard = styled.div` font-size: ${({ size }) => (size === 'small' ? 12 : 16)}px; background: ${({ theme, company }) => - company === 'none' ? theme.color.blackAlpha30 : theme.cardColor[company]}; + company ? theme.cardColor[company] : theme.cardColor.none}; box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; user-select: ${({ company }) => (company === 'none' ? 'none' : 'auto')}; diff --git a/src/components/CreditCard/index.tsx b/src/components/CreditCard/index.tsx index 8a12cc82..02089f88 100644 --- a/src/components/CreditCard/index.tsx +++ b/src/components/CreditCard/index.tsx @@ -1,5 +1,4 @@ import * as S from './index.style'; -import GoogleIcon from '../GoogleIcon'; import { cardCompany } from '~/constants'; import { DefaultCard } from '~/types'; @@ -11,7 +10,7 @@ export interface CreditCardProps extends Partial { const CreditCard = ({ size = 'small', - company = 'none', + company, numbers = ['', '', '', ''], endDate = { month: 'MM', @@ -27,6 +26,7 @@ const CreditCard = ({ } return number; }); + const handleClickCard = () => { onClick && onClick(); }; @@ -39,27 +39,21 @@ const CreditCard = ({ size={size} company={company} > - {company === 'none' ? ( - - ) : ( - <> - {cardCompany[company]} - - - - {encryptedNumbers.map((number, index) => ( - {number} - ))} - - - - {cardUser} - - {endDate.month}/{endDate.day} - - - - )} + {company && cardCompany[company]} + + + + {encryptedNumbers.map((number, index) => ( + {number} + ))} + + + + {cardUser} + + {endDate.month}/{endDate.day} + + ); diff --git a/src/constants/index.ts b/src/constants/index.ts index 519ebb9e..59bf36fb 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,5 +1,4 @@ export const cardCompany = Object.freeze({ - none: 'none', suyeon: '수연카드', sejin: '세진카드', chanwook: '찬욱카드', diff --git a/src/types/index.ts b/src/types/index.ts index 4c3bb31c..1dbe9ee4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,6 +1,6 @@ import { cardCompany } from '../constants'; -export type CardCompany = keyof typeof cardCompany | 'none'; +export type CardCompany = keyof typeof cardCompany; export type CardNumber = [string, string, string, string]; From 66c5f2ee55e502ecd2afbe4d87b81888607f0e36 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:37:49 +0900 Subject: [PATCH 135/307] =?UTF-8?q?feat:=20AddCreditCard=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AddCreditCard/index.style.ts | 25 +++++++++++++++++++++ src/components/AddCreditCard/index.tsx | 24 ++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/components/AddCreditCard/index.style.ts create mode 100644 src/components/AddCreditCard/index.tsx diff --git a/src/components/AddCreditCard/index.style.ts b/src/components/AddCreditCard/index.style.ts new file mode 100644 index 00000000..3b6c4c4b --- /dev/null +++ b/src/components/AddCreditCard/index.style.ts @@ -0,0 +1,25 @@ +import styled from '@emotion/styled'; + +export const Container = styled.div` + display: flex; + align-items: center; + justify-content: center; + + margin: 10px 0; +`; + +export const CreditCard = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + + width: 208px; + height: 130px; + background-color: ${({ theme }) => theme.color.grayBackground}; + + border-radius: 5px; + padding: 10px 20px; + cursor: pointer; +`; diff --git a/src/components/AddCreditCard/index.tsx b/src/components/AddCreditCard/index.tsx new file mode 100644 index 00000000..ceefd9b3 --- /dev/null +++ b/src/components/AddCreditCard/index.tsx @@ -0,0 +1,24 @@ +import { PropsWithChildren } from 'react'; + +import * as S from './index.style'; +import GoogleIcon from '../GoogleIcon'; + +interface AddCreditCardProps extends PropsWithChildren { + onClick?: () => void; +} + +const AddCreditCard = ({ onClick }: AddCreditCardProps) => { + const handleClickCard = () => { + onClick && onClick(); + }; + + return ( + + + + + + ); +}; + +export default AddCreditCard; From 63ed3ff0ee6bcd28203bf657b19b0af237f3b2a3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:39:10 +0900 Subject: [PATCH 136/307] =?UTF-8?q?fix:=20CardRegist=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Information 컴포넌트가 Card 컴포넌트로 이름이 변경되며 생긴 문제 수정 --- src/components/CardSlider/index.tsx | 2 +- .../components/InputCardNumbers/index.tsx | 19 +++++++----------- .../components/InputCardUser/index.tsx | 20 +++++++------------ .../components/InputEndDate/index.tsx | 20 +++++++------------ .../components/InputPassword/index.tsx | 20 +++++++------------ 5 files changed, 29 insertions(+), 52 deletions(-) diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx index caa055ff..86c2f6da 100644 --- a/src/components/CardSlider/index.tsx +++ b/src/components/CardSlider/index.tsx @@ -9,7 +9,7 @@ import CreditCard from '../CreditCard'; import { RegisteredCard } from '~/types'; -interface CardSliderProps { +export interface CardSliderProps { cards: RegisteredCard[]; onChange?: (value: RegisteredCard) => void; } diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.tsx b/src/pages/CardRegist/components/InputCardNumbers/index.tsx index 27c80e85..40a009e2 100644 --- a/src/pages/CardRegist/components/InputCardNumbers/index.tsx +++ b/src/pages/CardRegist/components/InputCardNumbers/index.tsx @@ -4,12 +4,7 @@ import { Controller, useFormContext } from 'react-hook-form'; import * as S from './index.style'; import TitleText from '../TitleText'; -import { - Information, - InformationBody, - InformationHeader, - InputWrapper, -} from '~/components'; +import { Card, CardBody, CardHeader, InputWrapper } from '~/components'; import { Input } from '~/components'; const InputCardNumbers = () => { @@ -23,11 +18,11 @@ const InputCardNumbers = () => { const { invalid } = getFieldState('numbers', formState); return ( - - + + - - + + {inputRefArray.current.map((_, index) => ( @@ -60,8 +55,8 @@ const InputCardNumbers = () => { ))} - - + + ); }; diff --git a/src/pages/CardRegist/components/InputCardUser/index.tsx b/src/pages/CardRegist/components/InputCardUser/index.tsx index ffc9ca50..e7785183 100644 --- a/src/pages/CardRegist/components/InputCardUser/index.tsx +++ b/src/pages/CardRegist/components/InputCardUser/index.tsx @@ -2,23 +2,17 @@ import { Controller, useFormContext } from 'react-hook-form'; import TitleText from '../TitleText'; -import { - Information, - InformationBody, - InformationHeader, - Input, - InputWrapper, -} from '~/components'; +import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; const InputCardUser = () => { const { control } = useFormContext(); return ( - - + + - - + + { )} /> - - + + ); }; diff --git a/src/pages/CardRegist/components/InputEndDate/index.tsx b/src/pages/CardRegist/components/InputEndDate/index.tsx index d3658764..fa4532ed 100644 --- a/src/pages/CardRegist/components/InputEndDate/index.tsx +++ b/src/pages/CardRegist/components/InputEndDate/index.tsx @@ -4,13 +4,7 @@ import { Controller, useFormContext } from 'react-hook-form'; import * as S from './index.style'; import TitleText from '../TitleText'; -import { - Information, - InformationBody, - InformationHeader, - InputWrapper, - Input, -} from '~/components'; +import { Card, CardBody, CardHeader, InputWrapper, Input } from '~/components'; const InputEndDate = () => { const { control, getFieldState, formState } = useFormContext(); @@ -18,11 +12,11 @@ const InputEndDate = () => { const { invalid } = getFieldState('endDate', formState); return ( - - + + - - + + { /> - - + + ); }; diff --git a/src/pages/CardRegist/components/InputPassword/index.tsx b/src/pages/CardRegist/components/InputPassword/index.tsx index f5ae4cb7..b072c29a 100644 --- a/src/pages/CardRegist/components/InputPassword/index.tsx +++ b/src/pages/CardRegist/components/InputPassword/index.tsx @@ -6,13 +6,7 @@ import KeypadModal from './KeypadModal'; import ReadonlyPassword from './ReadonlyPassword'; import TitleText from '../TitleText'; -import { - Information, - InformationBody, - InformationHeader, - Input, - InputWrapper, -} from '~/components'; +import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; import { useModal } from '~/hooks'; const InputPassword = () => { @@ -43,11 +37,11 @@ const InputPassword = () => { }; return ( - - + + - - + + {[...new Array(2).fill(null)].map((_, index) => ( @@ -82,8 +76,8 @@ const InputPassword = () => { close={close} /> - - + + ); }; From b8d087e42cea1ad2bea6ed6f9893a66751d0095a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 16:44:30 +0900 Subject: [PATCH 137/307] =?UTF-8?q?fix:=20CardRegist=20=EC=98=A4=EB=A5=98?= =?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 - information 컴포넌트를 Card 컴포넌트로 수정하지 않아 발생한 오류 수정 --- .../components/InputSecurityCode/index.tsx | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/pages/CardRegist/components/InputSecurityCode/index.tsx b/src/pages/CardRegist/components/InputSecurityCode/index.tsx index d691feb6..6013af0b 100644 --- a/src/pages/CardRegist/components/InputSecurityCode/index.tsx +++ b/src/pages/CardRegist/components/InputSecurityCode/index.tsx @@ -3,24 +3,18 @@ import { Controller, useFormContext } from 'react-hook-form'; import * as S from './index.style'; import TitleText from '../TitleText'; -import { - Information, - InformationBody, - InformationHeader, - Input, - InputWrapper, -} from '~/components'; +import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; const InputSecurityCode = () => { const { control, getFieldState, formState } = useFormContext(); const { invalid } = getFieldState('securityCode', formState); return ( - - + + - - + + { /> - - + + ); }; From f4a780e3ff2ccdb75625eb00eccc3ff8450d2a7d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 17:21:29 +0900 Subject: [PATCH 138/307] =?UTF-8?q?fix:=20HomePage=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EC=9D=B4=20=EC=96=B4=EA=B8=8B=EB=82=98=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - S.ContentContainer 빠트린 것 추가하기 - Card 를 Modal 로 이름 바꿔사용하기 --- src/pages/Home/index.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index 9dc45008..d6329774 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -2,7 +2,7 @@ import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; -import { Button, Card, DeemBackground } from '~/components'; +import { Button, Card as Modal, DeemBackground } from '~/components'; import { useModal } from '~/hooks'; const Home = () => { @@ -21,11 +21,13 @@ const Home = () => { {isOpen && ( - + - + + + - + )} From e8aab2820fd5b1d0452fbad371f40c2b108dc33a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 17:26:04 +0900 Subject: [PATCH 139/307] =?UTF-8?q?style:=20CardList=20=EB=AA=A8=EB=8B=AC?= =?UTF-8?q?=EC=9D=98=20=EB=86=92=EC=9D=B4=EA=B0=80=20=EC=9E=91=EC=9D=80=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modal의 크기가 컨테이너의 높이에 맞게 증가할 수 있도록 변경 - ContentContainer의 배경색을 흰색으로 지정 --- src/components/Card/index.style.ts | 2 ++ src/pages/Home/index.style.ts | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 4bc5f357..6c3e5fac 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -7,6 +7,7 @@ export const Card = styled.div` display: flex; flex-direction: column; flex-wrap: wrap; + flex-grow: 1; background-color: ${({ theme }) => theme.color.white}; `; @@ -28,6 +29,7 @@ export const CardBody = styled.div` display: flex; flex-direction: column; + flex-grow: 1; background-color: ${({ theme }) => theme.color.white}; `; diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts index 6b9b77fb..b5d15347 100644 --- a/src/pages/Home/index.style.ts +++ b/src/pages/Home/index.style.ts @@ -9,16 +9,22 @@ export const Container = styled.div` export const ButtonLabel = styled.div` width: 100px; height: 50px; + display: flex; justify-content: center; align-items: center; + font-size: 16px; `; export const ContentContainer = styled.div` width: 400px; height: 700px; + background-color: ${({ theme }) => theme.color.white}; + + overflow-x: hidden; overflow-y: scroll; + display: flex; flex-direction: column; `; From 205891a21cff4584c6ffd1cd9d2458fc94daf2d4 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 17:27:38 +0900 Subject: [PATCH 140/307] =?UTF-8?q?fix:=20CardRegist=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존의 CreditCard 컴포넌트 대신AddCreditCard 컴포넌트를 사용하도록 변경 --- src/pages/CardList/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 24bd97cc..4f90d039 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -11,6 +11,7 @@ import { CardHeader, GoogleIcon, } from '~/components'; +import AddCreditCard from '~/components/AddCreditCard'; import { removeCard, RootState } from '~/store'; const CardList = () => { @@ -73,7 +74,7 @@ const CardList = () => { 아직 보유중인 카드가 없어요. )} - + ); From 571b94afaf49032dca7dd3e8f423aece0933b990 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 17:55:26 +0900 Subject: [PATCH 141/307] =?UTF-8?q?fix:=20CardRegist=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=8A=A4=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 - Keypad 모달과 CompanySelection 모달의 bottom 적용 위치가 다른 문제 수정 - ContentContainer가 두번 들어간 문제 수정 - Card가 부모 컨테이너의 크기를 넘을 경우 overflow-y 속성을 지정해서 부모의 크기를 따르도록 수정 --- src/components/Card/index.style.ts | 2 +- src/components/Keypad/index.style.ts | 5 +---- src/components/Keypad/index.tsx | 4 ++-- .../CardRegist/components/InputPassword/KeypadModal.tsx | 6 +++++- .../CardRegist/components/InputPassword/index.style.ts | 7 +++++++ src/pages/Home/index.style.ts | 2 +- src/pages/Home/index.tsx | 8 +++----- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 6c3e5fac..15858a39 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -2,11 +2,11 @@ import styled from '@emotion/styled'; export const Card = styled.div` width: 100%; + overflow-y: scroll; padding: 10px 20px; display: flex; flex-direction: column; - flex-wrap: wrap; flex-grow: 1; background-color: ${({ theme }) => theme.color.white}; diff --git a/src/components/Keypad/index.style.ts b/src/components/Keypad/index.style.ts index 6474b8e1..a575ad8e 100644 --- a/src/components/Keypad/index.style.ts +++ b/src/components/Keypad/index.style.ts @@ -4,11 +4,8 @@ interface KeypadItemProps { order: number; } -export const KeypadContainer = styled.div` +export const KeypadList = styled.div` width: 100%; - position: absolute; - left: 0px; - bottom: 0px; background-color: ${({ theme }) => theme.color.white}; z-index: 3; diff --git a/src/components/Keypad/index.tsx b/src/components/Keypad/index.tsx index c8eb321e..fa561719 100644 --- a/src/components/Keypad/index.tsx +++ b/src/components/Keypad/index.tsx @@ -24,7 +24,7 @@ const Keypad = ({ }; return ( - + {numbers.map((number, index) => ( - + ); }; diff --git a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx index 3bd8cf2f..aa6269c7 100644 --- a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx +++ b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx @@ -1,3 +1,5 @@ +import * as S from './index.style'; + import { DeemBackground, Keypad } from '~/components'; import { KeypadNumbers } from '~/types'; import suffle from '~/utils/suffle'; @@ -14,7 +16,9 @@ const KeypadModal = ({ isOpen, close, onSelect }: KeypadModalProps) => { return ( isOpen && ( - + + + ) ); diff --git a/src/pages/CardRegist/components/InputPassword/index.style.ts b/src/pages/CardRegist/components/InputPassword/index.style.ts index 5b6fe294..bd3d2025 100644 --- a/src/pages/CardRegist/components/InputPassword/index.style.ts +++ b/src/pages/CardRegist/components/InputPassword/index.style.ts @@ -10,3 +10,10 @@ export const InputPasswordItemContainer = styled.div` display: flex; gap: 5px; `; + +export const KeypadContainer = styled.div` + width: 100%; + position: absolute; + bottom: 0; + left: 0; +`; diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts index b5d15347..7bc32d99 100644 --- a/src/pages/Home/index.style.ts +++ b/src/pages/Home/index.style.ts @@ -23,8 +23,8 @@ export const ContentContainer = styled.div` background-color: ${({ theme }) => theme.color.white}; overflow-x: hidden; - overflow-y: scroll; display: flex; flex-direction: column; + position: relative; `; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index d6329774..b7e079ac 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -22,11 +22,9 @@ const Home = () => { {isOpen && ( - - - - - + + + )} From 609f822d05adc6395b8513b3a062ee0222069131 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 18:03:40 +0900 Subject: [PATCH 142/307] =?UTF-8?q?fix:=20=EC=95=84=EC=9D=B4=EC=BD=98=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20click=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EB=8F=99=EC=9E=91=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - span element의 property를 제대로 전달해줌으로써 해결 --- src/components/GoogleIcon/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/GoogleIcon/index.tsx b/src/components/GoogleIcon/index.tsx index 50eb2205..c2599370 100644 --- a/src/components/GoogleIcon/index.tsx +++ b/src/components/GoogleIcon/index.tsx @@ -6,8 +6,12 @@ export interface GoogleIconProps extends ComponentProps<'span'> { name: keyof typeof googleIcon; } -const GoogleIcon = ({ name }: GoogleIconProps) => { - return {googleIcon[name]}; +const GoogleIcon = ({ name, ...props }: GoogleIconProps) => { + return ( + + {googleIcon[name]} + + ); }; export default GoogleIcon; From bbadf02762bfb70385dcd2d1cb9fbebf216a7b4c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 18:30:05 +0900 Subject: [PATCH 143/307] =?UTF-8?q?refactoring:=20Slide=EC=99=80=20Card=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Card/index.style.ts | 1 - src/components/CardSlider/index.style.ts | 11 ---- src/components/CardSlider/index.tsx | 53 ------------------- src/components/Slide/index.style.ts | 5 ++ src/components/Slide/index.tsx | 34 ++++++++++++ src/components/index.ts | 2 +- .../components/CardSelection/index.style.ts | 3 ++ .../components/CardSelection/index.tsx | 29 ++++++++-- 8 files changed, 67 insertions(+), 71 deletions(-) delete mode 100644 src/components/CardSlider/index.style.ts delete mode 100644 src/components/CardSlider/index.tsx create mode 100644 src/components/Slide/index.style.ts create mode 100644 src/components/Slide/index.tsx create mode 100644 src/pages/Payment/components/CardSelection/index.style.ts diff --git a/src/components/Card/index.style.ts b/src/components/Card/index.style.ts index 15858a39..a5ad33b8 100644 --- a/src/components/Card/index.style.ts +++ b/src/components/Card/index.style.ts @@ -2,7 +2,6 @@ import styled from '@emotion/styled'; export const Card = styled.div` width: 100%; - overflow-y: scroll; padding: 10px 20px; display: flex; diff --git a/src/components/CardSlider/index.style.ts b/src/components/CardSlider/index.style.ts deleted file mode 100644 index 60ef32de..00000000 --- a/src/components/CardSlider/index.style.ts +++ /dev/null @@ -1,11 +0,0 @@ -import styled from '@emotion/styled'; - -export const SlideWrapper = styled.div` - max-width: 400px; -`; - -export const ItemWrapper = styled.div``; - -export const LastItemWrapper = styled.div` - cursor: pointer; -`; diff --git a/src/components/CardSlider/index.tsx b/src/components/CardSlider/index.tsx deleted file mode 100644 index 86c2f6da..00000000 --- a/src/components/CardSlider/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; -import Slider from 'react-slick'; - -import 'slick-carousel/slick/slick.css'; -import 'slick-carousel/slick/slick-theme.css'; -import * as S from './index.style'; -import CreditCard from '../CreditCard'; - -import { RegisteredCard } from '~/types'; - -export interface CardSliderProps { - cards: RegisteredCard[]; - onChange?: (value: RegisteredCard) => void; -} - -const CardSlider = ({ cards, onChange }: CardSliderProps) => { - const navigate = useNavigate(); - const settings = { - centerMode: true, - dots: true, - speed: 500, - slidesToShow: 1, - slidesToScroll: 1, - afterChange: (index: number) => { - onChange && onChange(cards[index]); - }, - }; - const handleClickAddCard = () => { - navigate('/card-list'); - }; - - useEffect(() => { - onChange && onChange(cards[0]); - }, [onChange, cards]); - - return ( - - - {cards.map((card) => ( - - - - ))} - - - - - - ); -}; - -export default CardSlider; diff --git a/src/components/Slide/index.style.ts b/src/components/Slide/index.style.ts new file mode 100644 index 00000000..2bf8322c --- /dev/null +++ b/src/components/Slide/index.style.ts @@ -0,0 +1,5 @@ +import styled from '@emotion/styled'; + +export const SlideWrapper = styled.div` + max-width: 400px; +`; diff --git a/src/components/Slide/index.tsx b/src/components/Slide/index.tsx new file mode 100644 index 00000000..9199f3b1 --- /dev/null +++ b/src/components/Slide/index.tsx @@ -0,0 +1,34 @@ +import { PropsWithChildren, useEffect } from 'react'; +import Slider from 'react-slick'; + +import 'slick-carousel/slick/slick.css'; +import 'slick-carousel/slick/slick-theme.css'; +import * as S from './index.style'; + +export interface SlideProps extends PropsWithChildren { + onChange?: (index: number) => void; +} + +const Slide = ({ onChange, children }: SlideProps) => { + const settings = { + dots: true, + speed: 500, + slidesToShow: 1, + slidesToScroll: 1, + afterChange: (index: number) => { + onChange && onChange(index); + }, + }; + + useEffect(() => { + onChange && onChange(0); + }, [onChange]); + + return ( + + {children} + + ); +}; + +export default Slide; diff --git a/src/components/index.ts b/src/components/index.ts index 21c7d92e..506ccc17 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -4,7 +4,7 @@ export { default as CreditCard } from './CreditCard'; export { default as InputWrapper } from './InputWrapper'; export { default as Input } from './Input'; export { default as Keypad } from './Keypad'; -export { default as CardSlider } from './CardSlider'; +export { default as Slide } from './Slide'; export { default as CompanySelection } from './CompanySelection'; export { default as GoogleIcon } from './GoogleIcon'; export { default as DeemBackground } from './DeemBackground'; diff --git a/src/pages/Payment/components/CardSelection/index.style.ts b/src/pages/Payment/components/CardSelection/index.style.ts new file mode 100644 index 00000000..5989c9ac --- /dev/null +++ b/src/pages/Payment/components/CardSelection/index.style.ts @@ -0,0 +1,3 @@ +import styled from '@emotion/styled'; + +export const CardItemContainer = styled.div``; diff --git a/src/pages/Payment/components/CardSelection/index.tsx b/src/pages/Payment/components/CardSelection/index.tsx index 2669c851..87fa5e68 100644 --- a/src/pages/Payment/components/CardSelection/index.tsx +++ b/src/pages/Payment/components/CardSelection/index.tsx @@ -1,22 +1,32 @@ +import { useCallback } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { useSelector } from 'react-redux'; import { useNavigate } from 'react-router-dom'; +import * as S from './index.style'; import TitleText from '../TitleText'; -import { CardSlider } from '~/components'; +import { Slide } from '~/components'; import { CreditCard, Card, CardBody, CardHeader } from '~/components'; +import AddCreditCard from '~/components/AddCreditCard'; import { RootState } from '~/store'; const PayCardInfomation = () => { const navigate = useNavigate(); const cards = useSelector((state: RootState) => state.cards); - const { control } = useFormContext(); + const { control, setValue } = useFormContext(); const clickEmptyCard = () => { navigate('/card-list'); }; + const handleChangeSlide = useCallback( + (index: number) => { + setValue('card', cards[index], { shouldValidate: true }); + }, + [setValue, cards], + ); + return ( @@ -31,11 +41,20 @@ const PayCardInfomation = () => { required: true, validate: (value) => value !== undefined, }} - render={({ field: { onChange } }) => + render={() => cards.length === 0 ? ( - + ) : ( - + + {cards.map((card) => ( + + + + ))} + + + + ) } /> From b60aa5528531b2f507e41c6aaff680d18dc17c56 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 20:20:29 +0900 Subject: [PATCH 144/307] =?UTF-8?q?fix:=20=ED=95=84=EC=9A=94=ED=95=9C=20Ca?= =?UTF-8?q?rd=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=97=90=EB=A7=8C=20o?= =?UTF-8?q?verflow=20=EC=A0=81=EC=9A=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Card 전체에 overflow를 함으로써 생기는 문제 해결 --- src/pages/Home/index.style.ts | 8 +++++++- src/pages/Home/index.tsx | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts index 7bc32d99..049a2ec1 100644 --- a/src/pages/Home/index.style.ts +++ b/src/pages/Home/index.style.ts @@ -1,5 +1,7 @@ import styled from '@emotion/styled'; +import { Card } from '~/components/Card/index.style'; + export const Container = styled.div` display: flex; flex-direction: column; @@ -22,9 +24,13 @@ export const ContentContainer = styled.div` height: 700px; background-color: ${({ theme }) => theme.color.white}; - overflow-x: hidden; + overflow: hidden; display: flex; flex-direction: column; position: relative; `; + +export const Modal = styled(Card)` + overflow-y: scroll; +`; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index b7e079ac..2ffe0f06 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -2,7 +2,7 @@ import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; -import { Button, Card as Modal, DeemBackground } from '~/components'; +import { Button, DeemBackground } from '~/components'; import { useModal } from '~/hooks'; const Home = () => { @@ -22,9 +22,9 @@ const Home = () => { {isOpen && ( - + - + )} From b3e15662166c40e7b84d658bc844d5cae723c1c7 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 20:22:42 +0900 Subject: [PATCH 145/307] =?UTF-8?q?feat:=20Slide=20=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=B6=81=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/CreditCard.stories.tsx | 2 +- src/stories/Slide.stories.tsx | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/stories/Slide.stories.tsx diff --git a/src/stories/CreditCard.stories.tsx b/src/stories/CreditCard.stories.tsx index 4c7e448a..b941390a 100644 --- a/src/stories/CreditCard.stories.tsx +++ b/src/stories/CreditCard.stories.tsx @@ -11,7 +11,7 @@ export default { argTypes: { company: { control: 'inline-radio', - options: [...Object.keys(cardCompany)], + options: [...Object.keys(cardCompany), undefined], }, numbers: { control: { diff --git a/src/stories/Slide.stories.tsx b/src/stories/Slide.stories.tsx new file mode 100644 index 00000000..b002c44f --- /dev/null +++ b/src/stories/Slide.stories.tsx @@ -0,0 +1,22 @@ +import { ThemeProvider } from '@emotion/react'; + +import { Slide } from '~/components'; +import { SlideProps } from '~/components/Slide'; +import theme from '~/styles/theme'; + +export default { + title: 'components/Slide', + component: Slide, +}; + +export const Default = (args: SlideProps) => { + return ( + + +
1
+
2
+
3
+
+
+ ); +}; From 60d3dbde91a9f7bbd4591545b4dd79a8b2a1f3fd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 20:24:38 +0900 Subject: [PATCH 146/307] =?UTF-8?q?refactoring:=20AddCreditCard=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=82=B4=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EA=B8=B0=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/index.ts | 1 + src/pages/CardList/index.tsx | 2 +- src/pages/Payment/components/CardSelection/index.tsx | 9 +++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/index.ts b/src/components/index.ts index 506ccc17..ad339872 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -8,5 +8,6 @@ export { default as Slide } from './Slide'; export { default as CompanySelection } from './CompanySelection'; export { default as GoogleIcon } from './GoogleIcon'; export { default as DeemBackground } from './DeemBackground'; +export { default as AddCreditCard } from './AddCreditCard'; export * from './Card'; export * from './Keypad'; diff --git a/src/pages/CardList/index.tsx b/src/pages/CardList/index.tsx index 4f90d039..21c94f6b 100644 --- a/src/pages/CardList/index.tsx +++ b/src/pages/CardList/index.tsx @@ -10,8 +10,8 @@ import { CardBody, CardHeader, GoogleIcon, + AddCreditCard, } from '~/components'; -import AddCreditCard from '~/components/AddCreditCard'; import { removeCard, RootState } from '~/store'; const CardList = () => { diff --git a/src/pages/Payment/components/CardSelection/index.tsx b/src/pages/Payment/components/CardSelection/index.tsx index 87fa5e68..dd089a7d 100644 --- a/src/pages/Payment/components/CardSelection/index.tsx +++ b/src/pages/Payment/components/CardSelection/index.tsx @@ -7,8 +7,13 @@ import * as S from './index.style'; import TitleText from '../TitleText'; import { Slide } from '~/components'; -import { CreditCard, Card, CardBody, CardHeader } from '~/components'; -import AddCreditCard from '~/components/AddCreditCard'; +import { + CreditCard, + Card, + CardBody, + CardHeader, + AddCreditCard, +} from '~/components'; import { RootState } from '~/store'; const PayCardInfomation = () => { From 703e496402a545c7e6daee77a24a242f5d1e3be5 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 29 Jul 2024 20:26:23 +0900 Subject: [PATCH 147/307] =?UTF-8?q?feat:=20AddCreditCard=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=8A=A4=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=EB=B6=81=EC=97=90=20=EB=93=B1=EB=A1=9D=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AddCreditCard/index.tsx | 2 +- src/stories/AddCreditCard.stories.tsx | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/stories/AddCreditCard.stories.tsx diff --git a/src/components/AddCreditCard/index.tsx b/src/components/AddCreditCard/index.tsx index ceefd9b3..ee7cce8a 100644 --- a/src/components/AddCreditCard/index.tsx +++ b/src/components/AddCreditCard/index.tsx @@ -3,7 +3,7 @@ import { PropsWithChildren } from 'react'; import * as S from './index.style'; import GoogleIcon from '../GoogleIcon'; -interface AddCreditCardProps extends PropsWithChildren { +export interface AddCreditCardProps extends PropsWithChildren { onClick?: () => void; } diff --git a/src/stories/AddCreditCard.stories.tsx b/src/stories/AddCreditCard.stories.tsx new file mode 100644 index 00000000..3e88c9bf --- /dev/null +++ b/src/stories/AddCreditCard.stories.tsx @@ -0,0 +1,18 @@ +import { ThemeProvider } from '@emotion/react'; + +import AddCreditCard from '~/components/AddCreditCard'; +import { AddCreditCardProps } from '~/components/AddCreditCard'; +import theme from '~/styles/theme'; + +export default { + title: 'components/AddCreditCard', + component: AddCreditCard, +}; + +export const Default = (args: AddCreditCardProps) => { + return ( + + + + ); +}; From 1b428e3fbd9d31ec1e004d41b2f6db70a7d80af0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:43:51 +0900 Subject: [PATCH 148/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=82=AC=EC=9D=B4=EC=97=90=20'-'=20=EA=B8=B0?= =?UTF-8?q?=ED=98=B8=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InputCardNumbers/index.style.ts | 2 + .../components/InputCardNumbers/index.tsx | 55 ++++++++++--------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.style.ts b/src/pages/CardRegist/components/InputCardNumbers/index.style.ts index c294c2f5..d2b0294e 100644 --- a/src/pages/CardRegist/components/InputCardNumbers/index.style.ts +++ b/src/pages/CardRegist/components/InputCardNumbers/index.style.ts @@ -3,3 +3,5 @@ import styled from '@emotion/styled'; export const InputNumbersContainer = styled.div` width: 100%; `; + +export const Divider = styled.div``; diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.tsx b/src/pages/CardRegist/components/InputCardNumbers/index.tsx index 40a009e2..744a7163 100644 --- a/src/pages/CardRegist/components/InputCardNumbers/index.tsx +++ b/src/pages/CardRegist/components/InputCardNumbers/index.tsx @@ -26,32 +26,35 @@ const InputCardNumbers = () => { {inputRefArray.current.map((_, index) => ( - value.length === 4, - required: true, - }} - render={({ field: { onChange } }) => ( - { - if (element instanceof HTMLInputElement) { - inputRefArray.current[index] = element; - } - }} - type={index < 2 ? 'text' : 'password'} - onChange={onChange} - maxLength={4} - onComplete={() => { - inputRefArray.current[index + 1]?.focus(); - }} - /> - )} - /> + <> + value.length === 4, + required: true, + }} + render={({ field: { onChange } }) => ( + { + if (element instanceof HTMLInputElement) { + inputRefArray.current[index] = element; + } + }} + type={index < 2 ? 'text' : 'password'} + onChange={onChange} + maxLength={4} + onComplete={() => { + inputRefArray.current[index + 1]?.focus(); + }} + /> + )} + /> + {index < 3 && - } + ))} From b1ea499b5be0b52d63841db4b18dff142d390987 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:45:09 +0900 Subject: [PATCH 149/307] =?UTF-8?q?faat:=20=EB=A7=8C=EB=A3=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=98=20=EC=B5=9C=EC=86=8C=20=EB=82=A0=EC=9D=84=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/components/InputEndDate/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/CardRegist/components/InputEndDate/index.tsx b/src/pages/CardRegist/components/InputEndDate/index.tsx index fa4532ed..7b85e0b3 100644 --- a/src/pages/CardRegist/components/InputEndDate/index.tsx +++ b/src/pages/CardRegist/components/InputEndDate/index.tsx @@ -21,7 +21,7 @@ const InputEndDate = () => { ( { ( (InputRefArray.current[1] = element)} From 25fd04cb29c86d6c7b979bbca50d91c0b40dcb9c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:46:11 +0900 Subject: [PATCH 150/307] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=98=20=EC=B5=9C=EB=8C=80=20=EA=B8=B8=EC=9D=B4?= =?UTF-8?q?=EB=A5=BC=2030=EC=9E=90=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 --- src/pages/CardRegist/components/InputCardUser/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/CardRegist/components/InputCardUser/index.tsx b/src/pages/CardRegist/components/InputCardUser/index.tsx index e7785183..75d518be 100644 --- a/src/pages/CardRegist/components/InputCardUser/index.tsx +++ b/src/pages/CardRegist/components/InputCardUser/index.tsx @@ -6,6 +6,7 @@ import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; const InputCardUser = () => { const { control } = useFormContext(); + const MAX_LENGTH = 30; return ( @@ -16,13 +17,13 @@ const InputCardUser = () => { ( )} /> From a55a21bce5b43b8321bd28ac084cd3c1f3813c1a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:52:50 +0900 Subject: [PATCH 151/307] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=20=EC=83=81=ED=83=9C=EB=A5=BC=20=EC=9C=84=EC=97=90=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/InputCardUser/index.style.ts | 12 ++++++++++++ .../CardRegist/components/InputCardUser/index.tsx | 10 ++++++++-- src/styles/color.ts | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/pages/CardRegist/components/InputCardUser/index.style.ts diff --git a/src/pages/CardRegist/components/InputCardUser/index.style.ts b/src/pages/CardRegist/components/InputCardUser/index.style.ts new file mode 100644 index 00000000..6609d699 --- /dev/null +++ b/src/pages/CardRegist/components/InputCardUser/index.style.ts @@ -0,0 +1,12 @@ +import styled from '@emotion/styled'; + +export const HeaderContainer = styled.div` + display: flex; + justify-content: space-between; + align-items: center; +`; + +export const InputLenghtStatus = styled.div` + font-size: 14px; + color: ${({ theme }) => theme.color.gray300}; +`; diff --git a/src/pages/CardRegist/components/InputCardUser/index.tsx b/src/pages/CardRegist/components/InputCardUser/index.tsx index 75d518be..bf342958 100644 --- a/src/pages/CardRegist/components/InputCardUser/index.tsx +++ b/src/pages/CardRegist/components/InputCardUser/index.tsx @@ -1,17 +1,23 @@ import { Controller, useFormContext } from 'react-hook-form'; +import * as S from './index.style'; import TitleText from '../TitleText'; import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; const InputCardUser = () => { - const { control } = useFormContext(); + const { control, getValues } = useFormContext(); const MAX_LENGTH = 30; return ( - + + + + ({getValues('cardUser').length}/{MAX_LENGTH}) + + diff --git a/src/styles/color.ts b/src/styles/color.ts index a494e241..ecdcdeab 100644 --- a/src/styles/color.ts +++ b/src/styles/color.ts @@ -1,6 +1,8 @@ const color = { white: '#ffffff', gray100: '#eeeeee', + gray200: '#e0e0e0', + gray300: '#bdbdbd', grayBackground: '#e5e5e5', deemBackground: '#00000030', mainGreen: '#04C09E', From af2352192b7c4278a5285059b6af1cec3e06fd49 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:54:07 +0900 Subject: [PATCH 152/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=B3=84?= =?UTF-8?q?=EC=B9=AD=20=EB=93=B1=EB=A1=9D=EC=8B=9C=20placeholder=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 --- src/pages/CardAlias/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 5c7e4ff9..7414d75a 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -44,7 +44,7 @@ const CardAlias = () => { From ad6de8e28bcb5f4cfd607c50a25b1d373f71e7a0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:55:39 +0900 Subject: [PATCH 153/307] =?UTF-8?q?feat:=20=EB=B3=84=EC=B9=AD=EC=9D=B4=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9C=BC=EB=A1=9C=20=EB=B3=84=EC=B9=AD=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardAlias/index.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 7414d75a..9fa0195a 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -12,6 +12,7 @@ import { CardBody, CardFooter, } from '~/components'; +import { cardCompany } from '~/constants'; import { addCardName, CardState, RootState } from '~/store'; const CardAlias = () => { @@ -27,8 +28,12 @@ const CardAlias = () => { const inputRef = useRef(null); const handleClickConfirmButton = () => { + const cardAlias = + inputRef.current?.value === '' + ? cardCompany[targetCard.company] + : inputRef.current?.value; navigate('/card-list'); - dispatch(addCardName({ id, cardAlias: inputRef.current?.value })); + dispatch(addCardName({ id, cardAlias })); }; return ( From 31135cfcb1e761e22a3032d97af38b61c9bbc234 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:56:06 +0900 Subject: [PATCH 154/307] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=B3=84?= =?UTF-8?q?=EC=B9=AD=20=EA=B8=B8=EC=9D=B4=2010=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardAlias/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/CardAlias/index.tsx b/src/pages/CardAlias/index.tsx index 9fa0195a..5ac3c78c 100644 --- a/src/pages/CardAlias/index.tsx +++ b/src/pages/CardAlias/index.tsx @@ -51,6 +51,7 @@ const CardAlias = () => { ref={inputRef} placeholder='카드 별칭(선택)' defaultValue={cardAlias} + maxLength={10} /> From eaa86ac422fafb7ff7d1b75185ba70b603ed45e0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:57:02 +0900 Subject: [PATCH 155/307] =?UTF-8?q?style:=20=EB=AA=A8=EB=8B=AC=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=ED=82=A4=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Home/index.style.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Home/index.style.ts b/src/pages/Home/index.style.ts index 049a2ec1..9ddc002b 100644 --- a/src/pages/Home/index.style.ts +++ b/src/pages/Home/index.style.ts @@ -20,8 +20,8 @@ export const ButtonLabel = styled.div` `; export const ContentContainer = styled.div` - width: 400px; - height: 700px; + width: 450px; + height: 750px; background-color: ${({ theme }) => theme.color.white}; overflow: hidden; From aac15b3f3df9722720a00b41d68d510a74e8711d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 13:58:52 +0900 Subject: [PATCH 156/307] =?UTF-8?q?style:=20Payments=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Footer=20=EC=99=80=20Body=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=20=EA=B0=84=EA=B2=A9=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Payment/index.style.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pages/Payment/index.style.ts b/src/pages/Payment/index.style.ts index cb92c58c..4417dc51 100644 --- a/src/pages/Payment/index.style.ts +++ b/src/pages/Payment/index.style.ts @@ -2,6 +2,11 @@ import styled from '@emotion/styled'; export const Form = styled.form` width: 100%; + flex-grow: 1; + + display: flex; + flex-direction: column; + justify-content: space-between; `; export const InformationList = styled.div` From 7b3d2c6af313da2477b2b08daeb98a079572b54a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 14:00:03 +0900 Subject: [PATCH 157/307] =?UTF-8?q?style:=20CardList=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20Header=20=ED=8F=B0=ED=8A=B8=20=ED=81=AC=EA=B8=B0=20?= =?UTF-8?q?=ED=82=A4=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardList/index.style.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/CardList/index.style.ts b/src/pages/CardList/index.style.ts index 5106cfff..c721e84f 100644 --- a/src/pages/CardList/index.style.ts +++ b/src/pages/CardList/index.style.ts @@ -3,7 +3,7 @@ import styled from '@emotion/styled'; export const HeaderText = styled.div` display: flex; align-items: center; - font-size: 16px; + font-size: 20px; `; export const NoneCardText = styled.div` From 8d7bef3902044069f9b23d5e8386aab0869c4eab Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 14:01:30 +0900 Subject: [PATCH 158/307] =?UTF-8?q?fix:=20cardUser=EC=9D=98=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=EA=B0=92=EC=9D=B4=20undefined=20=EC=97=AC=EC=84=9C=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=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 --- src/pages/CardRegist/components/InputCardUser/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/CardRegist/components/InputCardUser/index.tsx b/src/pages/CardRegist/components/InputCardUser/index.tsx index bf342958..353b6a97 100644 --- a/src/pages/CardRegist/components/InputCardUser/index.tsx +++ b/src/pages/CardRegist/components/InputCardUser/index.tsx @@ -7,6 +7,9 @@ import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; const InputCardUser = () => { const { control, getValues } = useFormContext(); + const currentInputLength = getValues('cardUser') + ? getValues('cardUser').length + : 0; const MAX_LENGTH = 30; return ( @@ -15,7 +18,7 @@ const InputCardUser = () => { - ({getValues('cardUser').length}/{MAX_LENGTH}) + ({currentInputLength}/{MAX_LENGTH})
From da9f8da9600f4c871f625e74a5826410cb831af2 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 16:04:07 +0900 Subject: [PATCH 159/307] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/App.test.tsx | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/__tests__/App.test.tsx diff --git a/src/__tests__/App.test.tsx b/src/__tests__/App.test.tsx deleted file mode 100644 index 2f26b6fc..00000000 --- a/src/__tests__/App.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import App from '../App.tsx'; -import { render } from '@testing-library/react'; - -describe('간단한 컴포넌트 테스트', () => { - test('App 컴포넌트가 가 렌더링 된다.', () => { - const { getByText } = render(); - - expect(getByText('1️⃣ 카드 추가')).toBeInTheDocument(); - expect(getByText('2️⃣ 카드 추가 - 카드사 선택')).toBeInTheDocument(); - expect(getByText('3️⃣ 카드 추가 - 입력 완료')).toBeInTheDocument(); - expect(getByText('4️⃣ 카드 추가 완료')).toBeInTheDocument(); - expect(getByText('5️⃣ 카드 목록')).toBeInTheDocument(); - }); -}); From db767ab284c54ef2f93ef66e60657e0ac41bd148 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 16:04:21 +0900 Subject: [PATCH 160/307] =?UTF-8?q?feat:=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/InputCardNumbers/index.tsx | 6 +- .../components/InputCardUser/index.tsx | 8 +- .../components/InputCompany/index.tsx | 7 +- .../components/InputEndDate/index.tsx | 12 +- .../components/InputPassword/index.tsx | 5 +- .../components/InputSecurityCode/index.tsx | 6 +- src/utils/cardRegistFormValidate.ts | 164 ++++++++++++++++++ src/utils/validateHelper.ts | 16 ++ 8 files changed, 212 insertions(+), 12 deletions(-) create mode 100644 src/utils/cardRegistFormValidate.ts create mode 100644 src/utils/validateHelper.ts diff --git a/src/pages/CardRegist/components/InputCardNumbers/index.tsx b/src/pages/CardRegist/components/InputCardNumbers/index.tsx index 744a7163..30b0289f 100644 --- a/src/pages/CardRegist/components/InputCardNumbers/index.tsx +++ b/src/pages/CardRegist/components/InputCardNumbers/index.tsx @@ -6,6 +6,8 @@ import TitleText from '../TitleText'; import { Card, CardBody, CardHeader, InputWrapper } from '~/components'; import { Input } from '~/components'; +import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; +import { validateHelper } from '~/utils/validateHelper'; const InputCardNumbers = () => { const { control, getFieldState, formState } = useFormContext(); @@ -32,8 +34,8 @@ const InputCardNumbers = () => { name={`numbers.${index}`} control={control} rules={{ - validate: (value) => value.length === 4, - required: true, + validate: (value) => + validateHelper(cardRegsitFormValidate.numbers, value), }} render={({ field: { onChange } }) => ( { const { control, getValues } = useFormContext(); const currentInputLength = getValues('cardUser') ? getValues('cardUser').length : 0; + const MAX_LENGTH = 30; return ( @@ -26,7 +29,10 @@ const InputCardUser = () => { + validateHelper(cardRegsitFormValidate.cardUser, value), + }} control={control} render={({ field: { onChange } }) => ( { name='company' control={control} rules={{ - required: true, - validate: (value) => value in cardCompany, + validate: (value) => + validateHelper(cardRegsitFormValidate.company, value), }} render={({ field: { onChange } }) => ( diff --git a/src/pages/CardRegist/components/InputEndDate/index.tsx b/src/pages/CardRegist/components/InputEndDate/index.tsx index 7b85e0b3..a721c6b6 100644 --- a/src/pages/CardRegist/components/InputEndDate/index.tsx +++ b/src/pages/CardRegist/components/InputEndDate/index.tsx @@ -5,6 +5,8 @@ import * as S from './index.style'; import TitleText from '../TitleText'; import { Card, CardBody, CardHeader, InputWrapper, Input } from '~/components'; +import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; +import { validateHelper } from '~/utils/validateHelper'; const InputEndDate = () => { const { control, getFieldState, formState } = useFormContext(); @@ -21,7 +23,10 @@ const InputEndDate = () => { + validateHelper(cardRegsitFormValidate.endDate.month, value), + }} control={control} render={({ field: { onChange } }) => ( { + validateHelper(cardRegsitFormValidate.endDate.day, value), + }} render={({ field: { onChange } }) => ( (InputRefArray.current[1] = element)} diff --git a/src/pages/CardRegist/components/InputPassword/index.tsx b/src/pages/CardRegist/components/InputPassword/index.tsx index b072c29a..a1158233 100644 --- a/src/pages/CardRegist/components/InputPassword/index.tsx +++ b/src/pages/CardRegist/components/InputPassword/index.tsx @@ -8,6 +8,8 @@ import TitleText from '../TitleText'; import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; import { useModal } from '~/hooks'; +import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; +import { validateHelper } from '~/utils/validateHelper'; const InputPassword = () => { const [index, setIndex] = useState(0); @@ -50,9 +52,8 @@ const InputPassword = () => { name={`password.${index}`} control={control} rules={{ - required: true, validate: (value) => - value !== undefined && value.length === 1, + validateHelper(cardRegsitFormValidate.password, value), }} render={({ field: { value, onChange, ref } }) => ( { const { control, getFieldState, formState } = useFormContext(); @@ -21,8 +23,8 @@ const InputSecurityCode = () => { name='securityCode' control={control} rules={{ - required: true, - validate: (value) => value.length === 3, + validate: (value) => + validateHelper(cardRegsitFormValidate.securityCode, value), }} render={({ field: { onChange } }) => ( { + return !isNaN(Number(value)); + }, + message: '카드번호는 숫자만 입력 가능합니다.', + }, + length: { + validate: (value: string) => { + return value.length === 4; + }, + message: '카드번호는 4자리로 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '카드번호를 입력해주세요.', + }, + }, + cardUser: { + type: { + validate: (value: string | undefined) => { + return typeof value === 'string'; + }, + message: '카드 사용자 이름은 문자로 입력해주세요.', + }, + length: { + validate: (value: string) => { + return value.length <= 30; + }, + message: '카드 사용자 이름은 30자 이하로 입력해주세요.', + }, + }, + company: { + type: { + validate: (value: string | undefined) => { + return typeof value === 'string'; + }, + message: '카드사는 문자로 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '카드사를 선택해주세요.', + }, + valueInCompany: { + validate: (value: string) => { + return value in cardCompany; + }, + message: '올바른 카드사가 아닙니다.', + }, + }, + endDate: { + month: { + type: { + validate: (value: string | undefined) => { + return !isNaN(Number(value)); + }, + message: '월은 숫자로 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '월을 입력해주세요.', + }, + length: { + validate: (value: string) => { + return value.length === 2; + }, + message: '월은 2자리로 입력해주세요.', + }, + min: { + validate: (value: string) => { + return Number(value) >= 1; + }, + message: '월은 1이상의 숫자로 입력해주세요.', + }, + max: { + validate: (value: string) => { + return Number(value) <= 12; + }, + message: '월은 12이하의 숫자로 입력해주세요.', + }, + }, + day: { + type: { + validate: (value: string | undefined) => { + return !isNaN(Number(value)); + }, + message: '일은 숫자로 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '일을 입력해주세요.', + }, + length: { + validate: (value: string) => { + return value.length === 2; + }, + message: '일은 2자리로 입력해주세요.', + }, + min: { + validate: (value: string) => { + return Number(value) >= 1; + }, + message: '일은 1이상의 숫자로 입력해주세요.', + }, + max: { + validate: (value: string) => { + return Number(value) <= 31; + }, + message: '일은 31이하의 숫자로 입력해주세요.', + }, + }, + }, + password: { + type: { + validate: (value: string | undefined) => { + return !isNaN(Number(value)); + }, + message: '비밀번호는 숫자로 입력해주세요.', + }, + length: { + validate: (value: string) => { + return value.length === 1; + }, + message: '비밀번호는 각자리당 하나의 숫자를 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '비밀번호를 입력해주세요.', + }, + }, + securityCode: { + type: { + validate: (value: string | undefined) => { + return !isNaN(Number(value)); + }, + message: '보안코드는 숫자로 입력해주세요.', + }, + length: { + validate: (value: string) => { + return value.length === 3; + }, + message: '보안코드는 3자리로 입력해주세요.', + }, + required: { + validate: (value: string) => { + return value.length > 0; + }, + message: '보안코드를 입력해주세요.', + }, + }, +}; diff --git a/src/utils/validateHelper.ts b/src/utils/validateHelper.ts new file mode 100644 index 00000000..73b3184d --- /dev/null +++ b/src/utils/validateHelper.ts @@ -0,0 +1,16 @@ +interface Validate { + validate: (value: string) => boolean; + message: string; +} + +export const validateHelper = ( + validate: Record, + value: string, +) => { + for (const key in validate) { + if (!validate[key].validate(value)) { + return validate[key].message; + } + } + return true; +}; From 3529b28ad2e36adf7acaeb7d3ec5beb735f8735b Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:35:52 +0900 Subject: [PATCH 161/307] =?UTF-8?q?feat:=20form=20=EC=A0=9C=EC=B6=9C=20?= =?UTF-8?q?=EC=A0=84=20=EC=A0=84=EC=B2=B4=20=EA=B0=92=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/CardRegist/index.tsx | 40 ++++++++++++++++++++++++++ src/store/index.ts | 1 - src/utils/cardRegistFormValidate.ts | 44 +++++++++++++++++++++++++---- src/utils/createValidator.ts | 25 ++++++++++++++++ src/utils/validateHelper.ts | 19 +++++++++++-- 5 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 src/utils/createValidator.ts diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 552dfa68..1cfc8799 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -23,7 +23,19 @@ import { import { useModal } from '~/hooks'; import { addCard } from '~/store'; import { CardForm } from '~/types'; +import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; import generateID from '~/utils/generateID'; +import { validateHelper } from '~/utils/validateHelper'; + +function isFormKey( + key: string, +): key is keyof typeof cardRegsitFormValidate.form { + return key in cardRegsitFormValidate.form; +} + +function isValueKey(key: string, value: CardForm): key is keyof CardForm { + return key in value; +} const CardRegist = () => { const dispatch = useDispatch(); @@ -31,6 +43,17 @@ const CardRegist = () => { const { isOpen, close, open } = useModal(true); const methods = useForm({ mode: 'onChange', + defaultValues: { + numbers: ['', '', '', ''], + endDate: { + month: '', + day: '', + }, + cardUser: '', + company: undefined, + securityCode: '', + password: ['', ''], + }, }); const { watch, formState, getValues } = methods; @@ -44,6 +67,23 @@ const CardRegist = () => { const handleClickConfirmButton = () => { const id = generateID(); + const formValues = getValues(); + + for (const key in formValues) { + if (!isFormKey(key)) continue; + if (!isValueKey(key, formValues)) continue; + const fieldValue = formValues[key]; + + const result = validateHelper( + cardRegsitFormValidate.form[key], + fieldValue, + ); + + if (result !== true) { + alert(result); + return; + } + } dispatch(addCard({ card: { ...getValues(), id } })); navigate(`/card-alias/${id}`); diff --git a/src/store/index.ts b/src/store/index.ts index d4d5d457..ac12309e 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -18,7 +18,6 @@ const cardSlice = createSlice({ reducers: { addCard: (state, actions) => { const { card } = actions.payload; - console.log(card); state.cards.push(card); }, removeCard: (state, actions) => { diff --git a/src/utils/cardRegistFormValidate.ts b/src/utils/cardRegistFormValidate.ts index ace08165..91c40f01 100644 --- a/src/utils/cardRegistFormValidate.ts +++ b/src/utils/cardRegistFormValidate.ts @@ -22,12 +22,6 @@ export const cardRegsitFormValidate = { }, }, cardUser: { - type: { - validate: (value: string | undefined) => { - return typeof value === 'string'; - }, - message: '카드 사용자 이름은 문자로 입력해주세요.', - }, length: { validate: (value: string) => { return value.length <= 30; @@ -161,4 +155,42 @@ export const cardRegsitFormValidate = { message: '보안코드를 입력해주세요.', }, }, + form: { + numbers: { + validate: (value: string[]) => { + return value.every((v) => v.length === 4); + }, + message: '카드번호를 정확히 입력해주세요.', + }, + cardUser: { + validate: (value: string) => { + return value.length <= 30; + }, + message: '카드 사용자 이름은 30자 이하여야합니다.', + }, + company: { + validate: (value: string) => { + return value in cardCompany; + }, + message: '카드사를 선택해주세요.', + }, + endDate: { + validate: (value: { month: string; day: string }) => { + return value.month.length === 2 && value.day.length === 2; + }, + message: '만료일을 정확히 입력해주세요.', + }, + password: { + validate: (value: string[]) => { + return value.every((v) => v.length === 1); + }, + message: '비밀번호를 정확히 입력해주세요.', + }, + securityCode: { + validate: (value: string) => { + return value.length === 3; + }, + message: '보안코드를 정확히 입력해주세요.', + }, + }, }; diff --git a/src/utils/createValidator.ts b/src/utils/createValidator.ts new file mode 100644 index 00000000..8d125a9d --- /dev/null +++ b/src/utils/createValidator.ts @@ -0,0 +1,25 @@ +const createValidator = (validation) => { + const validateKeyValue = (keyType, value) => { + Object.keys(validation[keyType]).forEach((validationKey) => { + const validate = validation[keyType][validationKey](value); + + if (validate !== true) { + throw new Error(validate); + } + }); + }; + + return (values) => { + Object.entries(values).map(([keyType, value]) => { + if (validation[keyType] === undefined) { + throw new Error( + `${keyType} 가 초기화 시 전달한 validation 내부에 존재하지 않습니다.`, + ); + } + + validateKeyValue(keyType, value); + }); + }; +}; + +export default createValidator; diff --git a/src/utils/validateHelper.ts b/src/utils/validateHelper.ts index 73b3184d..498a8ee6 100644 --- a/src/utils/validateHelper.ts +++ b/src/utils/validateHelper.ts @@ -1,12 +1,25 @@ interface Validate { - validate: (value: string) => boolean; + validate: (value: any) => boolean; message: string; } +function isValidateType( + validate: Record | Validate, +): validate is Validate { + return ( + typeof validate.validate === 'function' && + typeof validate.message === 'string' + ); +} + export const validateHelper = ( - validate: Record, - value: string, + validate: Record | Validate, + value: any, ) => { + if (isValidateType(validate)) { + return validate.validate(value) ? true : validate.message; + } + for (const key in validate) { if (!validate[key].validate(value)) { return validate[key].message; From 5087e7d92bc638cb75140edc565499a71600d31e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:36:12 +0900 Subject: [PATCH 162/307] =?UTF-8?q?chore:=20createValidator=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/createValidator.ts | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/utils/createValidator.ts diff --git a/src/utils/createValidator.ts b/src/utils/createValidator.ts deleted file mode 100644 index 8d125a9d..00000000 --- a/src/utils/createValidator.ts +++ /dev/null @@ -1,25 +0,0 @@ -const createValidator = (validation) => { - const validateKeyValue = (keyType, value) => { - Object.keys(validation[keyType]).forEach((validationKey) => { - const validate = validation[keyType][validationKey](value); - - if (validate !== true) { - throw new Error(validate); - } - }); - }; - - return (values) => { - Object.entries(values).map(([keyType, value]) => { - if (validation[keyType] === undefined) { - throw new Error( - `${keyType} 가 초기화 시 전달한 validation 내부에 존재하지 않습니다.`, - ); - } - - validateKeyValue(keyType, value); - }); - }; -}; - -export default createValidator; From 543a691dc11428937b78ba332e8f66bdb819d19e Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:41:01 +0900 Subject: [PATCH 163/307] =?UTF-8?q?feat:=20cardRegistFormValidate=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/cardRegistFormValidate.test.ts | 186 +++++++++++++++++++ src/__tests__/sum.test.ts | 11 -- src/utils/cardRegistFormValidate.ts | 4 +- 3 files changed, 188 insertions(+), 13 deletions(-) create mode 100644 src/__tests__/cardRegistFormValidate.test.ts delete mode 100644 src/__tests__/sum.test.ts diff --git a/src/__tests__/cardRegistFormValidate.test.ts b/src/__tests__/cardRegistFormValidate.test.ts new file mode 100644 index 00000000..3aa8c258 --- /dev/null +++ b/src/__tests__/cardRegistFormValidate.test.ts @@ -0,0 +1,186 @@ +import { describe, test, expect } from 'vitest'; + +import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; + +describe('카드 등록시 유효성 검사 로직.', () => { + test('카드 번호의 문자열은 4자리여야 한다.', () => { + const cardNumber = '1234'; + const result = cardRegsitFormValidate.numbers.length.validate(cardNumber); + expect(result).toBe(true); + }); + + test('카드는 숫자로만 이루어져야 한다.', () => { + const cardNumber = '1234'; + const result = cardRegsitFormValidate.numbers.type.validate(cardNumber); + expect(result).toBe(true); + }); + + test('카드번호는 필수로 입력되어야 한다.', () => { + const cardNumber = '1234'; + const result = cardRegsitFormValidate.numbers.required.validate(cardNumber); + expect(result).toBe(true); + }); + + test('카드 사용자 이름은 30자 이하로 입력되어야 한다.', () => { + const cardUser = '김철수'; + const result = cardRegsitFormValidate.cardUser.length.validate(cardUser); + expect(result).toBe(true); + }); + + test('카드사는 문자로만 이루어져야 한다.', () => { + const company = 'suyeon'; + const result = cardRegsitFormValidate.company.type.validate(company); + expect(result).toBe(true); + }); + + test('카드사는 필수로 입력되어야 한다.', () => { + const company = 'suyeon'; + const result = cardRegsitFormValidate.company.required.validate(company); + expect(result).toBe(true); + }); + + test('카드사는 cardCompany에 있는 값이어야 한다.', () => { + const company = 'suyeon'; + const result = + cardRegsitFormValidate.company.valueInCompany.validate(company); + expect(result).toBe(true); + }); + + test('카드 만료일의 월은 2자리여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.month.type.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 월은 필수로 입력되어야 한다.', () => { + const endDate = '12'; + const result = + cardRegsitFormValidate.endDate.month.required.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 월은 숫자로만 이루어져야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.month.type.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 월은 1이상의 숫자여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.month.min.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 월은 12이하의 숫자여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.month.max.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 일은 2자리여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.day.type.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 일은 필수로 입력되어야 한다.', () => { + const endDate = '12'; + const result = + cardRegsitFormValidate.endDate.day.required.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 일은 숫자로만 이루어져야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.day.type.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 일은 1이상의 숫자여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.day.min.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 만료일의 일은 31이하의 숫자여야 한다.', () => { + const endDate = '12'; + const result = cardRegsitFormValidate.endDate.day.max.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 비밀번호 한칸은 1자리씩 입력받아야 한다.', () => { + const password = '1'; + const result = cardRegsitFormValidate.password.length.validate(password); + expect(result).toBe(true); + }); + + test('카드 비밀번호 한칸은 숫자로만 입력받아야 한다.', () => { + const password = '1'; + const result = cardRegsitFormValidate.password.type.validate(password); + expect(result).toBe(true); + }); + + test('카드 비밀번호 한칸은 필수로 입력받아야 한다.', () => { + const password = '1'; + const result = cardRegsitFormValidate.password.required.validate(password); + expect(result).toBe(true); + }); + + test('보안코드는 숫자로 이루어져야 한다.', () => { + const securityCode = '123'; + const result = + cardRegsitFormValidate.securityCode.type.validate(securityCode); + expect(result).toBe(true); + }); + + test('보안코드는 3자리여야 한다.', () => { + const securityCode = '123'; + const result = + cardRegsitFormValidate.securityCode.length.validate(securityCode); + expect(result).toBe(true); + }); + + test('보안코드는 필수로 입력되어야 한다.', () => { + const securityCode = '123'; + const result = + cardRegsitFormValidate.securityCode.required.validate(securityCode); + expect(result).toBe(true); + }); + + test('카드 번호는 16자리여야 한다.', () => { + const cardNumber = ['1234', '1234', '1234', '1234']; + const result = cardRegsitFormValidate.form.numbers.validate(cardNumber); + expect(result).toBe(true); + }); + + test('카드 사용자 이름은 30자 이하로 입력되어야 한다.', () => { + const cardUser = '김철수'; + const result = cardRegsitFormValidate.form.cardUser.validate(cardUser); + expect(result).toBe(true); + }); + + test('카드사는 지정한 카드사 중 하나로 선택해야 한다.', () => { + const company = 'suyeon'; + const result = cardRegsitFormValidate.form.company.validate(company); + expect(result).toBe(true); + }); + + test('카드 만료일은 각각 2자리의 월, 일로 이루어져야 한다.', () => { + const endDate = { month: '12', day: '31' }; + const result = cardRegsitFormValidate.form.endDate.validate(endDate); + expect(result).toBe(true); + }); + + test('카드 비밀번호는 각자리당 하나의 숫자를 입력해야 한다.', () => { + const password = ['1', '2']; + const result = cardRegsitFormValidate.form.password.validate(password); + expect(result).toBe(true); + }); + + test('보안코드는 3자리의 숫자로 이루어져야 한다.', () => { + const securityCode = '123'; + const result = + cardRegsitFormValidate.form.securityCode.validate(securityCode); + expect(result).toBe(true); + }); +}); diff --git a/src/__tests__/sum.test.ts b/src/__tests__/sum.test.ts deleted file mode 100644 index 408a4d25..00000000 --- a/src/__tests__/sum.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { describe, test, expect } from 'vitest'; - -function sum(...args: number[]) { - return args.reduce((a, b) => a + b); -} - -describe('예제 테스트입니다.', () => { - test('sum > ', () => { - expect(sum(1, 2, 3, 4, 5)).toBe(15); - }); -}); diff --git a/src/utils/cardRegistFormValidate.ts b/src/utils/cardRegistFormValidate.ts index 91c40f01..3f0a0bf9 100644 --- a/src/utils/cardRegistFormValidate.ts +++ b/src/utils/cardRegistFormValidate.ts @@ -158,7 +158,7 @@ export const cardRegsitFormValidate = { form: { numbers: { validate: (value: string[]) => { - return value.every((v) => v.length === 4); + return value.length === 4 && value.every((v) => v.length === 4); }, message: '카드번호를 정확히 입력해주세요.', }, @@ -182,7 +182,7 @@ export const cardRegsitFormValidate = { }, password: { validate: (value: string[]) => { - return value.every((v) => v.length === 1); + return value.length === 2 && value.every((v) => v.length === 1); }, message: '비밀번호를 정확히 입력해주세요.', }, From 388c4ec0ad5675ad8ccbfb551f0ee0c468fc0415 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:43:07 +0900 Subject: [PATCH 164/307] =?UTF-8?q?feat:=20generateID=20=EC=9C=A0=ED=8B=B8?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- src/__tests__/generateID.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/__tests__/generateID.test.ts diff --git a/src/__tests__/generateID.test.ts b/src/__tests__/generateID.test.ts new file mode 100644 index 00000000..54b980fc --- /dev/null +++ b/src/__tests__/generateID.test.ts @@ -0,0 +1,15 @@ +import { describe, test, expect } from 'vitest'; + +import generateID from '~/utils/generateID'; + +describe('generateID 함수 테스트', () => { + test('generateID 함수는 7자리 문자열을 반환한다.', () => { + const id = generateID(); + expect(id.length).toBe(7); + }); + + test('generateID 함수는 문자열을 반환한다.', () => { + const id = generateID(); + expect(typeof id).toBe('string'); + }); +}); From 29432c0411b138748f0ce5200e3a0a227aa8c1a1 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:48:56 +0900 Subject: [PATCH 165/307] =?UTF-8?q?feat:=20suffle=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/suffle.test.ts | 24 ++++++++++++++++++++++++ src/utils/suffle.ts | 11 +++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/suffle.test.ts diff --git a/src/__tests__/suffle.test.ts b/src/__tests__/suffle.test.ts new file mode 100644 index 00000000..45f7c5a6 --- /dev/null +++ b/src/__tests__/suffle.test.ts @@ -0,0 +1,24 @@ +import { describe, test, expect } from 'vitest'; + +import suffle from '~/utils/suffle'; + +describe('suffle 함수 테스트', () => { + test('suffle 함수는 배열을 무작위로 섞어서 반환한다.', () => { + const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const result = suffle(arr); + expect(result).not.toBe(arr); + }); + + test('suffle 함수는 배열의 길이를 유지한다.', () => { + const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const result = suffle(arr); + expect(result.length).toBe(arr.length); + }); + + test('suffle 함수는 배열안에 들어있는 요소를 삭제하거나 추가하지 않는다.', () => { + const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const result = suffle(arr); + + expect(result.every((value) => arr.includes(value))).toBe(true); + }); +}); diff --git a/src/utils/suffle.ts b/src/utils/suffle.ts index 3a8fcd7d..1a5f2ccb 100644 --- a/src/utils/suffle.ts +++ b/src/utils/suffle.ts @@ -1,9 +1,12 @@ -const suffle = >(arr: T) => { - for (let i = arr.length - 1; i > 0; i--) { +const suffle = (arr: T) => { + const suffledArray = [...arr]; + + for (let i = suffledArray.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); - [arr[i], arr[j]] = [arr[j], arr[i]]; + + [suffledArray[i], suffledArray[j]] = [suffledArray[j], suffledArray[i]]; } - return arr; + return suffledArray; }; export default suffle; From 3f123c9e9544a5834a5cb6bfc42db3117e1b7701 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Tue, 30 Jul 2024 17:58:13 +0900 Subject: [PATCH 166/307] =?UTF-8?q?feat:=20useModal=20=ED=9B=85=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/useModal.test.ts | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/__tests__/useModal.test.ts diff --git a/src/__tests__/useModal.test.ts b/src/__tests__/useModal.test.ts new file mode 100644 index 00000000..561cbe8f --- /dev/null +++ b/src/__tests__/useModal.test.ts @@ -0,0 +1,56 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; + +import { useModal } from '~/hooks'; + +describe('useModal 훅 테스트', () => { + test('useModal 훅은 isOpen, setIsOpen, close, open 함수를 반환한다.', () => { + const { result } = renderHook(() => useModal()); + + expect(result.current).toHaveProperty('isOpen'); + expect(result.current).toHaveProperty('setIsOpen'); + expect(result.current).toHaveProperty('close'); + expect(result.current).toHaveProperty('open'); + }); + + test('useModal 훅은 isOpen의 기본값을 false로 가진다.', () => { + const { result } = renderHook(() => useModal()); + const { isOpen } = result.current; + + expect(isOpen).toBe(false); + }); + + test('useModal의 파라미터로 isOpen의 초기값을 전달할 수 있다.', () => { + const { result } = renderHook(() => useModal(true)); + const { isOpen } = result.current; + + expect(isOpen).toBe(true); + }); + + test('useModal의 open 함수를 호출하면 isOpen이 true로 변경된다.', () => { + const { result } = renderHook(() => useModal(false)); + + act(() => { + result.current.open(); + }); + expect(result.current.isOpen).toBe(true); + }); + + test('useModal의 close함수를 호출하면 isOpen이 false로 변경된다.', () => { + const { result } = renderHook(() => useModal(true)); + + act(() => { + result.current.close(); + }); + expect(result.current.isOpen).toBe(false); + }); + + test('useModal의 setIsOpen 함수를 호출하면 isOpen이 전달된 값으로 변경된다.', () => { + const { result } = renderHook(() => useModal()); + + act(() => { + result.current.setIsOpen(true); + }); + expect(result.current.isOpen).toBe(true); + }); +}); From 153bda1831e0aeb2007e83485a732d50a5783e58 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 2 Aug 2024 17:01:39 +0900 Subject: [PATCH 167/307] =?UTF-8?q?fix:=20CardColor=20=EC=97=90=EB=9F=AC?= =?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 - cardColor 에 none 프로퍼티가 없어서 난 오류 수정 --- src/components/CreditCard/index.style.ts | 1 - src/styles/cardColor.ts | 2 +- src/styles/emotion.d.ts | 5 ++--- src/styles/theme.ts | 3 ++- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/CreditCard/index.style.ts b/src/components/CreditCard/index.style.ts index 023caa33..be0cc974 100644 --- a/src/components/CreditCard/index.style.ts +++ b/src/components/CreditCard/index.style.ts @@ -35,7 +35,6 @@ export const CreditCard = styled.div` company ? theme.cardColor[company] : theme.cardColor.none}; box-shadow: 3px 3px 5px ${({ theme }) => theme.color.blackAlpha30}; - user-select: ${({ company }) => (company === 'none' ? 'none' : 'auto')}; border-radius: 5px; padding: 10px 20px; diff --git a/src/styles/cardColor.ts b/src/styles/cardColor.ts index f0933d6d..a40aa49c 100644 --- a/src/styles/cardColor.ts +++ b/src/styles/cardColor.ts @@ -1,6 +1,6 @@ import { CardCompany } from '../types'; -const cardColor: Record = { +const cardColor: Record & { none: string } = { none: '#94dacd', suyeon: '#E24141', sejin: '#547CE4', diff --git a/src/styles/emotion.d.ts b/src/styles/emotion.d.ts index 90fd1b77..0e012e8f 100644 --- a/src/styles/emotion.d.ts +++ b/src/styles/emotion.d.ts @@ -1,7 +1,6 @@ import '@emotion/react'; -import color from './color'; import cardColor from './cardColor'; -import { CardCompany } from '../types'; +import color from './color'; export type Color = typeof color; export type CardColor = typeof cardColor; @@ -12,7 +11,7 @@ declare module '@emotion/react' { [key in keyof Color]: string; }; cardColor: { - [key in CardCompany]: string; + [key in cardColor]: string; }; } } diff --git a/src/styles/theme.ts b/src/styles/theme.ts index dc21534d..7f31a2db 100644 --- a/src/styles/theme.ts +++ b/src/styles/theme.ts @@ -1,6 +1,7 @@ import { Theme } from '@emotion/react'; -import color from './color'; + import cardColor from './cardColor'; +import color from './color'; const theme: Theme = { color, From dbe336511b90461082197a5a847c4bf4fdd729fd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 2 Aug 2024 17:13:55 +0900 Subject: [PATCH 168/307] =?UTF-8?q?fix:=20suffle=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=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 - suffle이 특정 개수로 이뤄진 배열을 반환하지 않을 수도 있는 에러 수정 - 특정 개수를 받아 해당 개수만큼의 배열만을 생성하는 타입 생성 --- src/types/index.ts | 25 +++++++++---------------- src/utils/suffle.ts | 9 +++++++-- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/types/index.ts b/src/types/index.ts index 1dbe9ee4..5db3cc81 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,10 +2,6 @@ import { cardCompany } from '../constants'; export type CardCompany = keyof typeof cardCompany; -export type CardNumber = [string, string, string, string]; - -export type CardPassword = [string, string]; - export interface CardEndDate { month: string; day: string; @@ -28,15 +24,12 @@ export interface CardForm extends Omit { password: CardPassword; } -export type KeypadNumbers = [ - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, -]; +export type TupleOfLength = [T, ...T[]] & { + length: N; +}; + +export type CardNumber = TupleOfLength<4, string>; + +export type CardPassword = TupleOfLength<2, string>; + +export type KeypadNumbers = TupleOfLength<10, number>; diff --git a/src/utils/suffle.ts b/src/utils/suffle.ts index 1a5f2ccb..2db97457 100644 --- a/src/utils/suffle.ts +++ b/src/utils/suffle.ts @@ -1,4 +1,8 @@ -const suffle = (arr: T) => { +import { TupleOfLength } from '~/types'; + +const suffle = ( + arr: TupleOfLength, +): TupleOfLength => { const suffledArray = [...arr]; for (let i = suffledArray.length - 1; i > 0; i--) { @@ -6,7 +10,8 @@ const suffle = (arr: T) => { [suffledArray[i], suffledArray[j]] = [suffledArray[j], suffledArray[i]]; } - return suffledArray; + + return suffledArray as TupleOfLength; }; export default suffle; From c97834dbe3025f06021191bf7a06c8ed2bd39a47 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 2 Aug 2024 17:18:30 +0900 Subject: [PATCH 169/307] =?UTF-8?q?fix:=20suffle=EC=97=90=20=EC=A0=9C?= =?UTF-8?q?=EB=84=A4=EB=A6=AD=20=EC=A0=84=EB=8B=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CardRegist/components/InputPassword/KeypadModal.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx index aa6269c7..0980d4ae 100644 --- a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx +++ b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx @@ -17,7 +17,10 @@ const KeypadModal = ({ isOpen, close, onSelect }: KeypadModalProps) => { isOpen && ( - + (keypadNumbers)} + /> ) From da74096223f5b1bd58a6529b114eff780cf97a48 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 2 Aug 2024 17:27:31 +0900 Subject: [PATCH 170/307] =?UTF-8?q?fix:=20TypeError=20=ED=95=B4=EA=B2=B0?= =?UTF-8?q?=20-=20suffle=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20?= =?UTF-8?q?=ED=8A=9C=ED=94=8C=EC=9D=84=20=ED=95=A0=EB=8B=B9=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=82=98=ED=83=80=EB=82=98?= =?UTF-8?q?=EB=8A=94=20=ED=83=80=EC=9E=85=20=EC=97=90=EB=9F=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/InputPassword/KeypadModal.tsx | 5 +--- src/types/index.ts | 25 ++++++++++++------- src/utils/suffle.ts | 9 ++----- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx index 0980d4ae..aa6269c7 100644 --- a/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx +++ b/src/pages/CardRegist/components/InputPassword/KeypadModal.tsx @@ -17,10 +17,7 @@ const KeypadModal = ({ isOpen, close, onSelect }: KeypadModalProps) => { isOpen && ( - (keypadNumbers)} - /> + ) diff --git a/src/types/index.ts b/src/types/index.ts index 5db3cc81..1dbe9ee4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,6 +2,10 @@ import { cardCompany } from '../constants'; export type CardCompany = keyof typeof cardCompany; +export type CardNumber = [string, string, string, string]; + +export type CardPassword = [string, string]; + export interface CardEndDate { month: string; day: string; @@ -24,12 +28,15 @@ export interface CardForm extends Omit { password: CardPassword; } -export type TupleOfLength = [T, ...T[]] & { - length: N; -}; - -export type CardNumber = TupleOfLength<4, string>; - -export type CardPassword = TupleOfLength<2, string>; - -export type KeypadNumbers = TupleOfLength<10, number>; +export type KeypadNumbers = [ + number, + number, + number, + number, + number, + number, + number, + number, + number, + number, +]; diff --git a/src/utils/suffle.ts b/src/utils/suffle.ts index 2db97457..6564144a 100644 --- a/src/utils/suffle.ts +++ b/src/utils/suffle.ts @@ -1,8 +1,4 @@ -import { TupleOfLength } from '~/types'; - -const suffle = ( - arr: TupleOfLength, -): TupleOfLength => { +const suffle = (arr: T) => { const suffledArray = [...arr]; for (let i = suffledArray.length - 1; i > 0; i--) { @@ -10,8 +6,7 @@ const suffle = ( [suffledArray[i], suffledArray[j]] = [suffledArray[j], suffledArray[i]]; } - - return suffledArray as TupleOfLength; + return suffledArray as T; }; export default suffle; From 823bd2c2c37bb348738e941ac1050b0a66b6069b Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 15:56:45 +0900 Subject: [PATCH 171/307] =?UTF-8?q?refactoring:=20App.tsx=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EA=B3=BC=20=EA=B4=80=EB=A0=A8=ED=95=9C=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=9D=98=20=ED=8F=B4=EB=8D=94=20=EA=B5=AC=EC=A1=B0=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 --- src/app/App.tsx | 24 +++++++++++++ src/app/router/Router.tsx | 18 ++++++++++ src/app/router/index.ts | 1 + src/app/styles/color.ts | 26 ++++++++++++++ src/{ => app}/styles/emotion.d.ts | 3 +- src/app/styles/global.css | 13 +++++++ src/app/styles/index.ts | 1 + src/app/styles/theme.ts | 8 +++++ src/entities/Card/constants/constants.ts | 16 +++++++++ src/entities/Card/constants/index.ts | 1 + src/entities/Card/index.ts | 3 ++ src/entities/Card/model/index.ts | 3 ++ src/entities/Card/model/store.ts | 42 +++++++++++++++++++++++ src/entities/Card/types/index.ts | 1 + src/entities/Card/types/types.ts | 43 ++++++++++++++++++++++++ 15 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 src/app/App.tsx create mode 100644 src/app/router/Router.tsx create mode 100644 src/app/router/index.ts create mode 100644 src/app/styles/color.ts rename src/{ => app}/styles/emotion.d.ts (82%) create mode 100644 src/app/styles/global.css create mode 100644 src/app/styles/index.ts create mode 100644 src/app/styles/theme.ts create mode 100644 src/entities/Card/constants/constants.ts create mode 100644 src/entities/Card/constants/index.ts create mode 100644 src/entities/Card/index.ts create mode 100644 src/entities/Card/model/index.ts create mode 100644 src/entities/Card/model/store.ts create mode 100644 src/entities/Card/types/index.ts create mode 100644 src/entities/Card/types/types.ts diff --git a/src/app/App.tsx b/src/app/App.tsx new file mode 100644 index 00000000..300b85be --- /dev/null +++ b/src/app/App.tsx @@ -0,0 +1,24 @@ +import { ThemeProvider } from '@emotion/react'; +import { Provider } from 'react-redux'; +import { RouterProvider } from 'react-router-dom'; + +import { Router } from './router'; +import { theme } from './styles'; + +import { store } from '~/entities/Card'; +import './styles/global.css'; + +function App() { + return ( + <> + +
+ + + +
+ + ); +} + +export default App; diff --git a/src/app/router/Router.tsx b/src/app/router/Router.tsx new file mode 100644 index 00000000..dd5c425e --- /dev/null +++ b/src/app/router/Router.tsx @@ -0,0 +1,18 @@ +import { createBrowserRouter } from 'react-router-dom'; + +import { Home, Payment, CardList, CardRegist, CardAlias } from '~/pages'; + +const Router = createBrowserRouter([ + { + element: , + path: '/', + children: [ + { element: , path: '/Payment' }, + { element: , path: '/card-list' }, + { element: , path: '/card-regist' }, + { element: , path: '/card-alias/:id' }, + ], + }, +]); + +export default Router; diff --git a/src/app/router/index.ts b/src/app/router/index.ts new file mode 100644 index 00000000..70385796 --- /dev/null +++ b/src/app/router/index.ts @@ -0,0 +1 @@ +export { default as Router } from './Router'; diff --git a/src/app/styles/color.ts b/src/app/styles/color.ts new file mode 100644 index 00000000..363fc04a --- /dev/null +++ b/src/app/styles/color.ts @@ -0,0 +1,26 @@ +import { CardCompany } from '~/entities/Card'; + +export const color = { + white: '#ffffff', + gray100: '#eeeeee', + gray200: '#e0e0e0', + gray300: '#e5e5e5', + gray400: '#bdbdbd', + gray500: '#575757', + green500: '#04C09E', + blackAlpha: '#00000030', + yellow500: '#cbba64', + red500: '#E24141', +}; + +export const cardColor: Record & { NONE: string } = { + NONE: '#94dacd', + SUYEON: '#E24141', + SEJIN: '#547CE4', + CHANWOOK: '#73BC6D', + JONGGIL: '#DE59B9', + HYORI: '#04C09E4F', + HYESONG: '#E76E9A', + JINGYEONG: '#F37D3B', + GEONWOO: '#FBCD58', +}; diff --git a/src/styles/emotion.d.ts b/src/app/styles/emotion.d.ts similarity index 82% rename from src/styles/emotion.d.ts rename to src/app/styles/emotion.d.ts index 0e012e8f..76e1fac0 100644 --- a/src/styles/emotion.d.ts +++ b/src/app/styles/emotion.d.ts @@ -1,6 +1,5 @@ import '@emotion/react'; -import cardColor from './cardColor'; -import color from './color'; +import { color, cardColor } from './color'; export type Color = typeof color; export type CardColor = typeof cardColor; diff --git a/src/app/styles/global.css b/src/app/styles/global.css new file mode 100644 index 00000000..1b26b997 --- /dev/null +++ b/src/app/styles/global.css @@ -0,0 +1,13 @@ +* { + margin: 0px; + padding: 0px; + font-family: -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', + 'Pretendard Variable', Pretendard, Roboto, 'Noto Sans KR', 'Segoe UI', + 'Malgun Gothic', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + sans-serif; + box-sizing: border-box; +} + +#root-modal { + position: relative; +} diff --git a/src/app/styles/index.ts b/src/app/styles/index.ts new file mode 100644 index 00000000..3d69f36c --- /dev/null +++ b/src/app/styles/index.ts @@ -0,0 +1 @@ +export { theme } from './theme'; diff --git a/src/app/styles/theme.ts b/src/app/styles/theme.ts new file mode 100644 index 00000000..c8c35dce --- /dev/null +++ b/src/app/styles/theme.ts @@ -0,0 +1,8 @@ +import { Theme } from '@emotion/react'; + +import { color, cardColor } from './color'; + +export const theme: Theme = { + color, + cardColor, +}; diff --git a/src/entities/Card/constants/constants.ts b/src/entities/Card/constants/constants.ts new file mode 100644 index 00000000..e2fd0a07 --- /dev/null +++ b/src/entities/Card/constants/constants.ts @@ -0,0 +1,16 @@ +export const CARD_COMPANY = Object.freeze({ + SUYEON: '수연카드', + SEJIN: '세진카드', + CHANWOOK: '찬욱카드', + JONGGIL: '종길카드', + HYORI: '효리카드', + HYESONG: '혜성카드', + JINGYEONG: '진경카드', + GEONWOO: '건우카드', +}); + +// ! 이거 옮겨야함 +export const googleIcon = Object.freeze({ + arrowBack: 'arrow_back', + add: 'add', +}); diff --git a/src/entities/Card/constants/index.ts b/src/entities/Card/constants/index.ts new file mode 100644 index 00000000..c94f80f8 --- /dev/null +++ b/src/entities/Card/constants/index.ts @@ -0,0 +1 @@ +export * from './constants'; diff --git a/src/entities/Card/index.ts b/src/entities/Card/index.ts new file mode 100644 index 00000000..1934d069 --- /dev/null +++ b/src/entities/Card/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './model'; +export * from './constants'; diff --git a/src/entities/Card/model/index.ts b/src/entities/Card/model/index.ts new file mode 100644 index 00000000..dced6771 --- /dev/null +++ b/src/entities/Card/model/index.ts @@ -0,0 +1,3 @@ +export { store } from './store'; +export { cardAction } from './store'; +export type { RootState } from './store'; diff --git a/src/entities/Card/model/store.ts b/src/entities/Card/model/store.ts new file mode 100644 index 00000000..bdbe679e --- /dev/null +++ b/src/entities/Card/model/store.ts @@ -0,0 +1,42 @@ +import { configureStore, createSlice } from '@reduxjs/toolkit'; + +import { RegisteredCard } from '../types'; + +export type CardState = RegisteredCard; + +interface CardsState { + cards: CardState[]; +} + +const initialCard: CardsState = { + cards: [], +}; + +const cardSlice = createSlice({ + name: 'cards', + initialState: initialCard, + reducers: { + addCard: (state, actions) => { + const { card } = actions.payload; + state.cards.push(card); + }, + removeCard: (state, actions) => { + const { id } = actions.payload; + state.cards = state.cards.filter((card) => card.id !== id); + }, + addCardName: (state, actions) => { + const { id, cardAlias } = actions.payload; + const targetCard = state.cards.find((card) => card.id === id); + if (targetCard) { + targetCard.cardAlias = cardAlias; + } + }, + }, +}); + +export type RootState = ReturnType; +export const store = configureStore({ + reducer: cardSlice.reducer, +}); + +export const cardAction = cardSlice.actions; diff --git a/src/entities/Card/types/index.ts b/src/entities/Card/types/index.ts new file mode 100644 index 00000000..fcb073fe --- /dev/null +++ b/src/entities/Card/types/index.ts @@ -0,0 +1 @@ +export * from './types'; diff --git a/src/entities/Card/types/types.ts b/src/entities/Card/types/types.ts new file mode 100644 index 00000000..f6228dd0 --- /dev/null +++ b/src/entities/Card/types/types.ts @@ -0,0 +1,43 @@ +import { CARD_COMPANY } from '../constants'; + +export type CardCompany = keyof typeof CARD_COMPANY; + +export type CardNumber = [string, string, string, string]; + +export type CardPassword = [string, string]; + +export interface CardEndDate { + month: string; + day: string; +} + +export interface DefaultCard { + numbers: CardNumber; + endDate: CardEndDate; + cardUser?: string; + company: CardCompany; +} + +export interface RegisteredCard extends DefaultCard { + id: string; + cardAlias?: string; +} + +export interface CardForm extends Omit { + securityCode: string; + password: CardPassword; +} + +// ! 이거 옮겨야 함 +export type KeypadNumbers = [ + number, + number, + number, + number, + number, + number, + number, + number, + number, + number, +]; From 783f4e911c1663de895683eee82a402c9dd1e532 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 15:57:51 +0900 Subject: [PATCH 172/307] =?UTF-8?q?refactoring:=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EB=90=9C=20App=20=ED=8C=8C=EC=9D=BC=EB=A1=9C=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EA=B2=BD=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 --- src/App.tsx | 22 ---------------------- src/main.tsx | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 src/App.tsx diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index cb951809..00000000 --- a/src/App.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; -import { Provider } from 'react-redux'; -import { RouterProvider } from 'react-router-dom'; - -import router from '~/router/router'; -import store from '~/store'; -import theme from '~/styles/theme'; - -function App() { - return ( - <> - -
- - - -
- - ); -} - -export default App; diff --git a/src/main.tsx b/src/main.tsx index 4b036e69..e541f405 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,7 +1,7 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import App from './App.tsx'; +import App from './app/App'; import './styles/main.css'; createRoot(document.getElementById('root')!).render( From 42ffe735ef0e65b7b3eb67940caac579a72bc57d Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 16:46:39 +0900 Subject: [PATCH 173/307] =?UTF-8?q?chore:=20=EA=B8=B0=EC=A1=B4=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EB=B6=81=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stories/AddCreditCard.stories.tsx | 18 ---------- src/stories/Button.stories.tsx | 18 ---------- src/stories/Card.stories.tsx | 36 ------------------- src/stories/CompanySelection.stories.tsx | 18 ---------- src/stories/CreditCard.stories.tsx | 46 ------------------------ src/stories/DeemBackground.stories.tsx | 18 ---------- src/stories/GoogleIcon.stories.tsx | 28 --------------- src/stories/Input.stories.tsx | 42 ---------------------- src/stories/InputWrapper.stories.tsx | 27 -------------- src/stories/Keypad.stories.tsx | 26 -------------- src/stories/Slide.stories.tsx | 22 ------------ 11 files changed, 299 deletions(-) delete mode 100644 src/stories/AddCreditCard.stories.tsx delete mode 100644 src/stories/Button.stories.tsx delete mode 100644 src/stories/Card.stories.tsx delete mode 100644 src/stories/CompanySelection.stories.tsx delete mode 100644 src/stories/CreditCard.stories.tsx delete mode 100644 src/stories/DeemBackground.stories.tsx delete mode 100644 src/stories/GoogleIcon.stories.tsx delete mode 100644 src/stories/Input.stories.tsx delete mode 100644 src/stories/InputWrapper.stories.tsx delete mode 100644 src/stories/Keypad.stories.tsx delete mode 100644 src/stories/Slide.stories.tsx diff --git a/src/stories/AddCreditCard.stories.tsx b/src/stories/AddCreditCard.stories.tsx deleted file mode 100644 index 3e88c9bf..00000000 --- a/src/stories/AddCreditCard.stories.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import AddCreditCard from '~/components/AddCreditCard'; -import { AddCreditCardProps } from '~/components/AddCreditCard'; -import theme from '~/styles/theme'; - -export default { - title: 'components/AddCreditCard', - component: AddCreditCard, -}; - -export const Default = (args: AddCreditCardProps) => { - return ( - - - - ); -}; diff --git a/src/stories/Button.stories.tsx b/src/stories/Button.stories.tsx deleted file mode 100644 index 97cc2fd0..00000000 --- a/src/stories/Button.stories.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { Button } from '~/components'; -import { ButtonProps } from '~/components/Button'; -import theme from '~/styles/theme'; - -export default { - title: 'components/Button', - component: Button, -}; - -export const Default = (args: ButtonProps) => { - return ( - - - - ); -}; diff --git a/src/stories/Card.stories.tsx b/src/stories/Card.stories.tsx deleted file mode 100644 index d14a99c0..00000000 --- a/src/stories/Card.stories.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { DeemBackground, Card } from '~/components'; -import { CardBody, CardFooter, CardHeader, CardProps } from '~/components/Card'; -import theme from '~/styles/theme'; - -export default { - title: 'components/Card', - component: Card, -}; - -export const Default = (args: CardProps) => { - return ( - - - Header - Body - Footer - - - ); -}; - -export const WithDeemBackground = (args: CardProps) => { - return ( - - - - Header - Body - Footer - - - - ); -}; diff --git a/src/stories/CompanySelection.stories.tsx b/src/stories/CompanySelection.stories.tsx deleted file mode 100644 index dd6ff0c7..00000000 --- a/src/stories/CompanySelection.stories.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { CompanySelection } from '~/components'; -import { CompanySelectionProps } from '~/components/CompanySelection'; -import theme from '~/styles/theme'; - -export default { - title: 'components/CompanySelection', - component: CompanySelection, -}; - -export const Default = (args: CompanySelectionProps) => { - return ( - - - - ); -}; diff --git a/src/stories/CreditCard.stories.tsx b/src/stories/CreditCard.stories.tsx deleted file mode 100644 index b941390a..00000000 --- a/src/stories/CreditCard.stories.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { CreditCard } from '~/components'; -import { CreditCardProps } from '~/components/CreditCard'; -import { cardCompany } from '~/constants'; -import theme from '~/styles/theme'; - -export default { - title: 'components/CreditCard', - component: CreditCard, - argTypes: { - company: { - control: 'inline-radio', - options: [...Object.keys(cardCompany), undefined], - }, - numbers: { - control: { - type: 'array', - }, - }, - endDate: { - control: 'object', - }, - cardUser: { - control: 'text', - }, - }, - args: { - size: 'small', - company: 'suyeon', - numbers: ['1234', '5678', '9101', '1121'], - endDate: { - month: '12', - day: '21', - }, - cardUser: '수연', - }, -}; - -export const Default = (args: CreditCardProps) => { - return ( - - - - ); -}; diff --git a/src/stories/DeemBackground.stories.tsx b/src/stories/DeemBackground.stories.tsx deleted file mode 100644 index 3eacb2ec..00000000 --- a/src/stories/DeemBackground.stories.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { DeemBackground } from '~/components'; -import { DeemBackgroundProps } from '~/components/DeemBackground'; -import theme from '~/styles/theme'; - -export default { - title: 'components/DeemBackground', - component: DeemBackground, -}; - -export const Default = (args: DeemBackgroundProps) => { - return ( - - - - ); -}; diff --git a/src/stories/GoogleIcon.stories.tsx b/src/stories/GoogleIcon.stories.tsx deleted file mode 100644 index 125304d7..00000000 --- a/src/stories/GoogleIcon.stories.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { GoogleIcon } from '~/components'; -import { GoogleIconProps } from '~/components/GoogleIcon'; -import { googleIcon } from '~/constants'; -import theme from '~/styles/theme'; - -export default { - title: 'components/GoogleIcon', - component: GoogleIcon, - argTypes: { - name: { - control: 'inline-radio', - options: [...Object.keys(googleIcon)], - }, - }, - args: { - name: 'add', - }, -}; - -export const Default = (args: GoogleIconProps) => { - return ( - - - - ); -}; diff --git a/src/stories/Input.stories.tsx b/src/stories/Input.stories.tsx deleted file mode 100644 index b876decc..00000000 --- a/src/stories/Input.stories.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; -import theme from '~/styles/theme'; -import { Input } from '~/components'; -import { InputProps } from '~/components/Input'; - -export default { - title: 'components/Input', - component: Input, - argTypes: { - type: { - control: 'inline-radio', - options: ['text', 'password'], - }, - placeholder: { - control: 'text', - }, - value: { - control: 'text', - }, - onlyNumber: { - control: 'boolean', - }, - textAlign: { - control: 'inline-radio', - options: ['left', 'center'], - }, - }, - args: { - type: 'text', - placeholder: 'placeholder', - value: '', - onChange: () => {}, - }, -}; - -export const Defailt = (args: InputProps) => { - return ( - - - - ); -}; diff --git a/src/stories/InputWrapper.stories.tsx b/src/stories/InputWrapper.stories.tsx deleted file mode 100644 index 64d3af89..00000000 --- a/src/stories/InputWrapper.stories.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { InputWrapper } from '~/components'; -import { InputWrapperProps } from '~/components/InputWrapper'; -import theme from '~/styles/theme'; - -export default { - title: 'components/InputWrapper', - component: InputWrapper, - argTypes: { - type: { - control: 'inline-radio', - options: ['flushed', 'fill'], - }, - isInvalidation: { - control: 'boolean', - }, - }, -}; - -export const Defailt = (args: InputWrapperProps) => { - return ( - - - - ); -}; diff --git a/src/stories/Keypad.stories.tsx b/src/stories/Keypad.stories.tsx deleted file mode 100644 index a6a77208..00000000 --- a/src/stories/Keypad.stories.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { Keypad } from '~/components'; -import { KeypadProps } from '~/components'; -import theme from '~/styles/theme'; - -export default { - title: 'components/Keypad', - component: Keypad, - argTypes: { - numbers: { - type: 'array', - }, - }, - args: { - numbers: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'], - }, -}; - -export const Default = (args: KeypadProps) => { - return ( - - - - ); -}; diff --git a/src/stories/Slide.stories.tsx b/src/stories/Slide.stories.tsx deleted file mode 100644 index b002c44f..00000000 --- a/src/stories/Slide.stories.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ThemeProvider } from '@emotion/react'; - -import { Slide } from '~/components'; -import { SlideProps } from '~/components/Slide'; -import theme from '~/styles/theme'; - -export default { - title: 'components/Slide', - component: Slide, -}; - -export const Default = (args: SlideProps) => { - return ( - - -
1
-
2
-
3
-
-
- ); -}; From bf87a4efb384fe75305b330413bc78e98fb9abe3 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 16:48:47 +0900 Subject: [PATCH 174/307] =?UTF-8?q?feat:=20Button=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- src/components/Button/index.tsx | 1 + src/shared/ui/Button/Button.stories.tsx | 24 ++++++++++++++++++++++++ src/shared/ui/Button/Label.tsx | 19 +++++++++++++++++++ src/shared/ui/Button/Root.tsx | 25 +++++++++++++++++++++++++ src/shared/ui/Button/index.ts | 9 +++++++++ src/shared/ui/index.ts | 1 + 6 files changed, 79 insertions(+) create mode 100644 src/shared/ui/Button/Button.stories.tsx create mode 100644 src/shared/ui/Button/Label.tsx create mode 100644 src/shared/ui/Button/Root.tsx create mode 100644 src/shared/ui/Button/index.ts create mode 100644 src/shared/ui/index.ts diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index c618ba08..0c67915f 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -1,4 +1,5 @@ import { PropsWithChildren } from 'react'; + import * as S from './index.style'; export interface ButtonProps extends PropsWithChildren { diff --git a/src/shared/ui/Button/Button.stories.tsx b/src/shared/ui/Button/Button.stories.tsx new file mode 100644 index 00000000..0645c121 --- /dev/null +++ b/src/shared/ui/Button/Button.stories.tsx @@ -0,0 +1,24 @@ +import { Button } from './index'; +import { RootProps } from './index'; + +export default { + title: 'components/Button', + component: Button, + argTypes: { + children: { control: 'text' }, + style: { control: 'object' }, + props: { control: 'object' }, + }, + args: { + children: 'Button', + style: { backgroundColor: 'blue', color: 'white' }, + }, +}; + +export const Root = (args: RootProps) => { + return ( + + {args.children} + + ); +}; diff --git a/src/shared/ui/Button/Label.tsx b/src/shared/ui/Button/Label.tsx new file mode 100644 index 00000000..fc36b4be --- /dev/null +++ b/src/shared/ui/Button/Label.tsx @@ -0,0 +1,19 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface LabelProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Label = ({ + children, + style, + ...props +}: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Label; diff --git a/src/shared/ui/Button/Root.tsx b/src/shared/ui/Button/Root.tsx new file mode 100644 index 00000000..2249366a --- /dev/null +++ b/src/shared/ui/Button/Root.tsx @@ -0,0 +1,25 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface RootProps extends ComponentProps<'button'> { + style?: CSSProperties; +} + +const Root = ({ children, style, ...props }: PropsWithChildren) => { + return ( + + ); +}; + +export default Root; diff --git a/src/shared/ui/Button/index.ts b/src/shared/ui/Button/index.ts new file mode 100644 index 00000000..f98a49a0 --- /dev/null +++ b/src/shared/ui/Button/index.ts @@ -0,0 +1,9 @@ +import Label from './Label'; +import Root from './Root'; +export type { RootProps } from './Root'; +export type { LabelProps } from './Label'; + +export const Button = { + Root, + Label, +}; diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts new file mode 100644 index 00000000..fe9c53c5 --- /dev/null +++ b/src/shared/ui/index.ts @@ -0,0 +1 @@ +export { Button } from './Button'; From 581e31b0d3be36b2b757c10b70ff30a82b47ddea Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 16:51:45 +0900 Subject: [PATCH 175/307] =?UTF-8?q?refactoring:=20util=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20shared=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{ => shared}/utils/generateID.ts | 0 src/shared/utils/index.ts | 2 ++ src/{utils/suffle.ts => shared/utils/suffleArray.ts} | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/{ => shared}/utils/generateID.ts (100%) create mode 100644 src/shared/utils/index.ts rename src/{utils/suffle.ts => shared/utils/suffleArray.ts} (75%) diff --git a/src/utils/generateID.ts b/src/shared/utils/generateID.ts similarity index 100% rename from src/utils/generateID.ts rename to src/shared/utils/generateID.ts diff --git a/src/shared/utils/index.ts b/src/shared/utils/index.ts new file mode 100644 index 00000000..f033e791 --- /dev/null +++ b/src/shared/utils/index.ts @@ -0,0 +1,2 @@ +export { default as generateID } from './generateID'; +export { default as suffleArray } from './suffleArray'; diff --git a/src/utils/suffle.ts b/src/shared/utils/suffleArray.ts similarity index 75% rename from src/utils/suffle.ts rename to src/shared/utils/suffleArray.ts index 6564144a..c34620f2 100644 --- a/src/utils/suffle.ts +++ b/src/shared/utils/suffleArray.ts @@ -1,4 +1,4 @@ -const suffle = (arr: T) => { +const suffleArray = (arr: T) => { const suffledArray = [...arr]; for (let i = suffledArray.length - 1; i > 0; i--) { @@ -9,4 +9,4 @@ const suffle = (arr: T) => { return suffledArray as T; }; -export default suffle; +export default suffleArray; From 5a1dddd45fa0b888596209afc014acaebb92be01 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 17:23:43 +0900 Subject: [PATCH 176/307] =?UTF-8?q?feat:=20Card=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- src/shared/ui/Card/Body.tsx | 15 +++++++++++++++ src/shared/ui/Card/Card.stories.tsx | 21 +++++++++++++++++++++ src/shared/ui/Card/Footer.tsx | 25 +++++++++++++++++++++++++ src/shared/ui/Card/Header.tsx | 26 ++++++++++++++++++++++++++ src/shared/ui/Card/Root.tsx | 26 ++++++++++++++++++++++++++ src/shared/ui/Card/index.ts | 16 ++++++++++++++++ 6 files changed, 129 insertions(+) create mode 100644 src/shared/ui/Card/Body.tsx create mode 100644 src/shared/ui/Card/Card.stories.tsx create mode 100644 src/shared/ui/Card/Footer.tsx create mode 100644 src/shared/ui/Card/Header.tsx create mode 100644 src/shared/ui/Card/Root.tsx create mode 100644 src/shared/ui/Card/index.ts diff --git a/src/shared/ui/Card/Body.tsx b/src/shared/ui/Card/Body.tsx new file mode 100644 index 00000000..d1ddc8ef --- /dev/null +++ b/src/shared/ui/Card/Body.tsx @@ -0,0 +1,15 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface BodyProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Body = ({ children, style, ...props }: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Body; diff --git a/src/shared/ui/Card/Card.stories.tsx b/src/shared/ui/Card/Card.stories.tsx new file mode 100644 index 00000000..933ab67d --- /dev/null +++ b/src/shared/ui/Card/Card.stories.tsx @@ -0,0 +1,21 @@ +import { Card } from './index'; +import { RootProps } from './index'; + +export default { + title: 'components/Card', + component: Card, + argTypes: { + style: { control: 'object' }, + props: { control: 'object' }, + }, +}; + +export const Root = (args: RootProps) => { + return ( + + Header + Body + Footer + + ); +}; diff --git a/src/shared/ui/Card/Footer.tsx b/src/shared/ui/Card/Footer.tsx new file mode 100644 index 00000000..a0f8336a --- /dev/null +++ b/src/shared/ui/Card/Footer.tsx @@ -0,0 +1,25 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface FooterProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Footer = ({ + children, + style, + ...props +}: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Footer; diff --git a/src/shared/ui/Card/Header.tsx b/src/shared/ui/Card/Header.tsx new file mode 100644 index 00000000..01efd3f1 --- /dev/null +++ b/src/shared/ui/Card/Header.tsx @@ -0,0 +1,26 @@ +import { CSSProperties, ComponentProps, PropsWithChildren } from 'react'; + +export interface HeaderProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Header = ({ + children, + style, + ...props +}: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Header; diff --git a/src/shared/ui/Card/Root.tsx b/src/shared/ui/Card/Root.tsx new file mode 100644 index 00000000..2c7b83fa --- /dev/null +++ b/src/shared/ui/Card/Root.tsx @@ -0,0 +1,26 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface RootProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Root = ({ children, style, ...props }: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Root; diff --git a/src/shared/ui/Card/index.ts b/src/shared/ui/Card/index.ts new file mode 100644 index 00000000..8707ff96 --- /dev/null +++ b/src/shared/ui/Card/index.ts @@ -0,0 +1,16 @@ +import Body from './Body'; +import Footer from './Footer'; +import Header from './Header'; +import Root from './Root'; + +export type { RootProps } from './Root'; +export type { HeaderProps } from './Header'; +export type { BodyProps } from './Body'; +export type { FooterProps } from './Footer'; + +export const Card = { + Root, + Header, + Body, + Footer, +}; From d31c806ec9639a97f6eadb6ad4de7845e64c98b5 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Wed, 7 Aug 2024 17:53:16 +0900 Subject: [PATCH 177/307] =?UTF-8?q?feat:=20Field=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/preview-head.html | 1 + src/app/styles/global.css | 1 + src/shared/ui/Field/ErrorText.tsx | 19 +++++++++++++++++++ src/shared/ui/Field/Field.stories.tsx | 16 ++++++++++++++++ src/shared/ui/Field/Input.tsx | 22 ++++++++++++++++++++++ src/shared/ui/Field/Label.tsx | 24 ++++++++++++++++++++++++ src/shared/ui/Field/Root.tsx | 26 ++++++++++++++++++++++++++ src/shared/ui/Field/index.ts | 16 ++++++++++++++++ 8 files changed, 125 insertions(+) create mode 100644 src/shared/ui/Field/ErrorText.tsx create mode 100644 src/shared/ui/Field/Field.stories.tsx create mode 100644 src/shared/ui/Field/Input.tsx create mode 100644 src/shared/ui/Field/Label.tsx create mode 100644 src/shared/ui/Field/Root.tsx create mode 100644 src/shared/ui/Field/index.ts diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html index 1489f983..538f85dd 100644 --- a/.storybook/preview-head.html +++ b/.storybook/preview-head.html @@ -8,3 +8,4 @@ rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" /> + diff --git a/src/app/styles/global.css b/src/app/styles/global.css index 1b26b997..2dd4c9c9 100644 --- a/src/app/styles/global.css +++ b/src/app/styles/global.css @@ -6,6 +6,7 @@ 'Malgun Gothic', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif; box-sizing: border-box; + font-size: 16px; } #root-modal { diff --git a/src/shared/ui/Field/ErrorText.tsx b/src/shared/ui/Field/ErrorText.tsx new file mode 100644 index 00000000..29f491df --- /dev/null +++ b/src/shared/ui/Field/ErrorText.tsx @@ -0,0 +1,19 @@ +import { ComponentProps, CSSProperties } from 'react'; + +export interface ErrorTextProps extends ComponentProps<'p'> { + style?: CSSProperties; +} + +const ErrorText = ({ style, ...props }: ErrorTextProps) => { + return ( +

+ ); +}; + +export default ErrorText; diff --git a/src/shared/ui/Field/Field.stories.tsx b/src/shared/ui/Field/Field.stories.tsx new file mode 100644 index 00000000..396aa90f --- /dev/null +++ b/src/shared/ui/Field/Field.stories.tsx @@ -0,0 +1,16 @@ +import { Field } from './index'; +import { RootProps } from './index'; + +export default { + title: 'components/Field', + component: Field, +}; +export const Root = (args: RootProps) => { + return ( + + Label + + Error + + ); +}; diff --git a/src/shared/ui/Field/Input.tsx b/src/shared/ui/Field/Input.tsx new file mode 100644 index 00000000..c04bd4d0 --- /dev/null +++ b/src/shared/ui/Field/Input.tsx @@ -0,0 +1,22 @@ +import { ComponentProps, CSSProperties } from 'react'; + +export interface InputProps extends ComponentProps<'input'> { + style?: CSSProperties; +} + +const Input = ({ style, ...props }: InputProps) => { + return ( + + ); +}; + +export default Input; diff --git a/src/shared/ui/Field/Label.tsx b/src/shared/ui/Field/Label.tsx new file mode 100644 index 00000000..02fdd8fa --- /dev/null +++ b/src/shared/ui/Field/Label.tsx @@ -0,0 +1,24 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface LabelProps extends ComponentProps<'label'> { + style?: CSSProperties; +} + +const Label = ({ + children, + style, + ...props +}: PropsWithChildren) => { + return ( + + ); +}; + +export default Label; diff --git a/src/shared/ui/Field/Root.tsx b/src/shared/ui/Field/Root.tsx new file mode 100644 index 00000000..41fa6215 --- /dev/null +++ b/src/shared/ui/Field/Root.tsx @@ -0,0 +1,26 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface RootProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Root = ({ children, style, ...props }: PropsWithChildren) => { + return ( +

+ {children} +
+ ); +}; + +export default Root; diff --git a/src/shared/ui/Field/index.ts b/src/shared/ui/Field/index.ts new file mode 100644 index 00000000..f5a1ca5d --- /dev/null +++ b/src/shared/ui/Field/index.ts @@ -0,0 +1,16 @@ +import ErrorText from './ErrorText'; +import Input from './Input'; +import Label from './Label'; +import Root from './Root'; + +export type { RootProps } from './Root'; +export type { LabelProps } from './Label'; +export type { InputProps } from './Input'; +export type { ErrorTextProps } from './ErrorText'; + +export const Field = { + Root, + Label, + Input, + ErrorText, +}; From 7984e111ded0f248c29cf9b549c3cab310926a11 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 8 Aug 2024 18:36:56 +0900 Subject: [PATCH 178/307] =?UTF-8?q?refactoring:=20import=20=EB=AC=B8=20?= =?UTF-8?q?=ED=95=A9=EC=B9=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Field/Field.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/ui/Field/Field.stories.tsx b/src/shared/ui/Field/Field.stories.tsx index 396aa90f..10dfe211 100644 --- a/src/shared/ui/Field/Field.stories.tsx +++ b/src/shared/ui/Field/Field.stories.tsx @@ -1,10 +1,10 @@ -import { Field } from './index'; -import { RootProps } from './index'; +import { Field, RootProps } from './index'; export default { title: 'components/Field', component: Field, }; + export const Root = (args: RootProps) => { return ( From 51ebc3830ba94a7a8fd13e801028d4b03916f4e0 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Thu, 8 Aug 2024 18:37:46 +0900 Subject: [PATCH 179/307] =?UTF-8?q?feat:=20Input=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - maxLength일 경우 onComplete이벤트 실행하기 - state 기반으로 관리하기 - ref 를 prop으로 받을 수 있게 하기 --- src/shared/ui/Field/Input.stories.tsx | 38 +++++++++++++++ src/shared/ui/Field/Input.tsx | 70 +++++++++++++++++++++------ 2 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 src/shared/ui/Field/Input.stories.tsx diff --git a/src/shared/ui/Field/Input.stories.tsx b/src/shared/ui/Field/Input.stories.tsx new file mode 100644 index 00000000..859e1de1 --- /dev/null +++ b/src/shared/ui/Field/Input.stories.tsx @@ -0,0 +1,38 @@ +import { Field, InputProps } from './index'; + +export default { + title: 'components/Field/Input', + component: Field.Input, + argTypes: { + onlyNumber: { control: 'boolean' }, + onComplete: { action: 'onComplete' }, + style: { control: 'object' }, + props: { control: 'object' }, + }, + args: { + onlyNumber: false, + style: { + width: '300px', + }, + props: { + maxLength: 6, + }, + }, +}; + +export const Input = ({ + onlyNumber, + onComplete, + style, + ...args +}: InputProps) => { + const { props } = args as { props: InputProps }; + return ( + + ); +}; diff --git a/src/shared/ui/Field/Input.tsx b/src/shared/ui/Field/Input.tsx index c04bd4d0..3aa0a6b6 100644 --- a/src/shared/ui/Field/Input.tsx +++ b/src/shared/ui/Field/Input.tsx @@ -1,22 +1,62 @@ -import { ComponentProps, CSSProperties } from 'react'; +import { + ChangeEvent, + ComponentProps, + CSSProperties, + forwardRef, + useEffect, + useState, +} from 'react'; export interface InputProps extends ComponentProps<'input'> { + onComplete?: (event?: ChangeEvent) => void; + onlyNumber?: boolean; style?: CSSProperties; } -const Input = ({ style, ...props }: InputProps) => { - return ( - - ); -}; +const Input = forwardRef( + ({ style, onComplete, onlyNumber, ...props }, ref) => { + const [value, setValue] = useState(props.value); + + useEffect(() => { + setValue(props.value); + }, [props.value]); + + const handleChangeInput = (event: ChangeEvent) => { + const { onChange, maxLength } = props; + const { value } = event.target; + const maxLengthNumber = Number(maxLength); + + if (onlyNumber === true && isNaN(Number(value))) { + return; + } + if (isNaN(maxLengthNumber) === false) { + if (value.length === maxLengthNumber) { + onComplete && onComplete(event); + } + if (value.length > maxLengthNumber) { + return; + } + } + onChange && onChange(event); + setValue(event.target.value); + }; + + return ( + + ); + }, +); export default Input; From fc97805c631d1ee8925692c85a0c124b379cb946 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 15:23:57 +0900 Subject: [PATCH 180/307] =?UTF-8?q?feat:=20Keypad=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Keypad/Item.tsx | 24 +++++++++++++++ src/shared/ui/Keypad/Keypad.stories.tsx | 39 +++++++++++++++++++++++++ src/shared/ui/Keypad/Root.tsx | 31 ++++++++++++++++++++ src/shared/ui/Keypad/index.ts | 9 ++++++ 4 files changed, 103 insertions(+) create mode 100644 src/shared/ui/Keypad/Item.tsx create mode 100644 src/shared/ui/Keypad/Keypad.stories.tsx create mode 100644 src/shared/ui/Keypad/Root.tsx create mode 100644 src/shared/ui/Keypad/index.ts diff --git a/src/shared/ui/Keypad/Item.tsx b/src/shared/ui/Keypad/Item.tsx new file mode 100644 index 00000000..e2df8c10 --- /dev/null +++ b/src/shared/ui/Keypad/Item.tsx @@ -0,0 +1,24 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface ItemProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Item = ({ style, children, ...props }: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Item; diff --git a/src/shared/ui/Keypad/Keypad.stories.tsx b/src/shared/ui/Keypad/Keypad.stories.tsx new file mode 100644 index 00000000..00a72d19 --- /dev/null +++ b/src/shared/ui/Keypad/Keypad.stories.tsx @@ -0,0 +1,39 @@ +import { Keypad, RootProps } from './index'; + +export default { + title: 'components/Keypad', + component: Keypad.Root, + argTypes: { + row: { + control: { + type: 'number', + }, + }, + col: { + control: { + type: 'number', + }, + }, + }, + args: { + row: 4, + col: 3, + }, +}; + +export const Root = ({ row, col, ...props }: RootProps) => { + return ( + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + + ); +}; diff --git a/src/shared/ui/Keypad/Root.tsx b/src/shared/ui/Keypad/Root.tsx new file mode 100644 index 00000000..97fc4406 --- /dev/null +++ b/src/shared/ui/Keypad/Root.tsx @@ -0,0 +1,31 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface RootProps extends ComponentProps<'div'> { + style?: CSSProperties; + row?: number; + col?: number; +} + +const Root = ({ + style, + row, + col, + children, + ...props +}: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Root; diff --git a/src/shared/ui/Keypad/index.ts b/src/shared/ui/Keypad/index.ts new file mode 100644 index 00000000..91b81aa9 --- /dev/null +++ b/src/shared/ui/Keypad/index.ts @@ -0,0 +1,9 @@ +import Item from './Item'; +import Root from './Root'; + +export type { RootProps } from './Root'; +export type { ItemProps } from './Item'; +export const Keypad = { + Root, + Item, +}; From 9156792bafa5717a4f8e0b20dd33c6bc9f263fa1 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 15:56:36 +0900 Subject: [PATCH 181/307] =?UTF-8?q?refactoring:=20GoogleIcon=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EB=B6=84=EB=A6=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/constants/googleIcon.ts | 4 ++++ src/shared/constants/index.ts | 1 + src/shared/types/index.ts | 1 + src/shared/types/ui.ts | 3 +++ 4 files changed, 9 insertions(+) create mode 100644 src/shared/constants/googleIcon.ts create mode 100644 src/shared/constants/index.ts create mode 100644 src/shared/types/index.ts create mode 100644 src/shared/types/ui.ts diff --git a/src/shared/constants/googleIcon.ts b/src/shared/constants/googleIcon.ts new file mode 100644 index 00000000..f62a5f0c --- /dev/null +++ b/src/shared/constants/googleIcon.ts @@ -0,0 +1,4 @@ +export const googleIcon = Object.freeze({ + arrowBack: 'arrow_back', + add: 'add', +}); diff --git a/src/shared/constants/index.ts b/src/shared/constants/index.ts new file mode 100644 index 00000000..a7069510 --- /dev/null +++ b/src/shared/constants/index.ts @@ -0,0 +1 @@ +export { googleIcon } from './googleIcon'; diff --git a/src/shared/types/index.ts b/src/shared/types/index.ts new file mode 100644 index 00000000..27293d75 --- /dev/null +++ b/src/shared/types/index.ts @@ -0,0 +1 @@ +export type { GoogleIconName } from './ui'; diff --git a/src/shared/types/ui.ts b/src/shared/types/ui.ts new file mode 100644 index 00000000..67f09e5a --- /dev/null +++ b/src/shared/types/ui.ts @@ -0,0 +1,3 @@ +import { googleIcon } from '../constants'; + +export type GoogleIconName = keyof typeof googleIcon; From 37b28f57fa0df1e0190d7475a99764e71f25e6d8 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 15:56:47 +0900 Subject: [PATCH 182/307] =?UTF-8?q?feat:=20GoogleIcon=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/GoogleIcon/Google.stories.tsx | 21 +++++++++++++++++++++ src/shared/ui/GoogleIcon/Root.tsx | 18 ++++++++++++++++++ src/shared/ui/GoogleIcon/index.ts | 4 ++++ 3 files changed, 43 insertions(+) create mode 100644 src/shared/ui/GoogleIcon/Google.stories.tsx create mode 100644 src/shared/ui/GoogleIcon/Root.tsx create mode 100644 src/shared/ui/GoogleIcon/index.ts diff --git a/src/shared/ui/GoogleIcon/Google.stories.tsx b/src/shared/ui/GoogleIcon/Google.stories.tsx new file mode 100644 index 00000000..bf308eb9 --- /dev/null +++ b/src/shared/ui/GoogleIcon/Google.stories.tsx @@ -0,0 +1,21 @@ +import { GoogleIcon, GoogleIconProps } from './index'; + +import { googleIcon } from '~/shared/constants'; + +export default { + title: 'components/GoogleIcon', + component: GoogleIcon, + argTypes: { + name: { + control: 'inline-radio', + options: [...Object.values(googleIcon)], + }, + }, + args: { + name: 'arrow_back', + }, +}; + +export const Default = (args: GoogleIconProps) => { + return ; +}; diff --git a/src/shared/ui/GoogleIcon/Root.tsx b/src/shared/ui/GoogleIcon/Root.tsx new file mode 100644 index 00000000..b50ba1a2 --- /dev/null +++ b/src/shared/ui/GoogleIcon/Root.tsx @@ -0,0 +1,18 @@ +import { CSSProperties } from 'react'; + +import { GoogleIconName } from '~/shared/types'; + +export interface RootProps { + name: GoogleIconName; + style?: CSSProperties; +} + +const Root = ({ name, style }: RootProps) => { + return ( + + {name} + + ); +}; + +export default Root; diff --git a/src/shared/ui/GoogleIcon/index.ts b/src/shared/ui/GoogleIcon/index.ts new file mode 100644 index 00000000..fd4614d8 --- /dev/null +++ b/src/shared/ui/GoogleIcon/index.ts @@ -0,0 +1,4 @@ +import Root from './Root'; + +export type { RootProps as GoogleIconProps } from './Root'; +export const GoogleIcon = Root; From 997b53f4f805c26b3144e2cc0a89c7dd44e8fe77 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 16:30:08 +0900 Subject: [PATCH 183/307] =?UTF-8?q?feat:=20Box=20Layout=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/layout/Box/Box.stories.tsx | 25 +++++++++++++++++++++++++ src/shared/layout/Box/Box.tsx | 15 +++++++++++++++ src/shared/layout/Box/index.ts | 4 ++++ 3 files changed, 44 insertions(+) create mode 100644 src/shared/layout/Box/Box.stories.tsx create mode 100644 src/shared/layout/Box/Box.tsx create mode 100644 src/shared/layout/Box/index.ts diff --git a/src/shared/layout/Box/Box.stories.tsx b/src/shared/layout/Box/Box.stories.tsx new file mode 100644 index 00000000..c24d0caf --- /dev/null +++ b/src/shared/layout/Box/Box.stories.tsx @@ -0,0 +1,25 @@ +import { Box, BoxProps } from './index'; + +export default { + title: 'layouts/Box', + component: Box, + argTypes: { + style: { + control: 'object', + }, + props: { + control: 'object', + }, + }, + args: { + style: { + width: '100px', + height: '100px', + backgroundColor: '#eee', + }, + }, +}; + +export const Root = ({ ...props }: BoxProps) => { + return ; +}; diff --git a/src/shared/layout/Box/Box.tsx b/src/shared/layout/Box/Box.tsx new file mode 100644 index 00000000..2b9ef458 --- /dev/null +++ b/src/shared/layout/Box/Box.tsx @@ -0,0 +1,15 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +export interface BoxProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Box = ({ style, children, ...props }: PropsWithChildren) => { + return ( +
+ {children} +
+ ); +}; + +export default Box; diff --git a/src/shared/layout/Box/index.ts b/src/shared/layout/Box/index.ts new file mode 100644 index 00000000..5694f87a --- /dev/null +++ b/src/shared/layout/Box/index.ts @@ -0,0 +1,4 @@ +import Box from './Box'; + +export type { BoxProps } from './Box'; +export { Box }; From f7bc7b82250dfb7268c569f3befffddfd449c24a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 16:34:38 +0900 Subject: [PATCH 184/307] =?UTF-8?q?refactoring:=20GoogleIcon=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EB=B6=81=20=EC=BB=A8=EB=B2=A4=EC=85=98=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 - 파일 이름 수정 - Default가 아닌 Root로 이름 수정 --- .../GoogleIcon/{Google.stories.tsx => GoogleIcon.stories.tsx} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/shared/ui/GoogleIcon/{Google.stories.tsx => GoogleIcon.stories.tsx} (87%) diff --git a/src/shared/ui/GoogleIcon/Google.stories.tsx b/src/shared/ui/GoogleIcon/GoogleIcon.stories.tsx similarity index 87% rename from src/shared/ui/GoogleIcon/Google.stories.tsx rename to src/shared/ui/GoogleIcon/GoogleIcon.stories.tsx index bf308eb9..d665ae74 100644 --- a/src/shared/ui/GoogleIcon/Google.stories.tsx +++ b/src/shared/ui/GoogleIcon/GoogleIcon.stories.tsx @@ -16,6 +16,6 @@ export default { }, }; -export const Default = (args: GoogleIconProps) => { +export const Root = (args: GoogleIconProps) => { return ; }; From daf0cce751710007f6e5fd14fc080b403b634e3b Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 16:35:40 +0900 Subject: [PATCH 185/307] =?UTF-8?q?refactoring:=20Box=20=EB=A5=BC=20layout?= =?UTF-8?q?=20=ED=8F=B4=EB=8D=94=EC=97=90=EC=84=9C=20ui=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/layout/Box/index.ts | 4 ---- src/shared/{layout => ui}/Box/Box.stories.tsx | 2 +- src/shared/{layout/Box/Box.tsx => ui/Box/Root.tsx} | 6 +++--- src/shared/ui/Box/index.ts | 4 ++++ 4 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 src/shared/layout/Box/index.ts rename src/shared/{layout => ui}/Box/Box.stories.tsx (93%) rename src/shared/{layout/Box/Box.tsx => ui/Box/Root.tsx} (58%) create mode 100644 src/shared/ui/Box/index.ts diff --git a/src/shared/layout/Box/index.ts b/src/shared/layout/Box/index.ts deleted file mode 100644 index 5694f87a..00000000 --- a/src/shared/layout/Box/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Box from './Box'; - -export type { BoxProps } from './Box'; -export { Box }; diff --git a/src/shared/layout/Box/Box.stories.tsx b/src/shared/ui/Box/Box.stories.tsx similarity index 93% rename from src/shared/layout/Box/Box.stories.tsx rename to src/shared/ui/Box/Box.stories.tsx index c24d0caf..948dc3cc 100644 --- a/src/shared/layout/Box/Box.stories.tsx +++ b/src/shared/ui/Box/Box.stories.tsx @@ -1,7 +1,7 @@ import { Box, BoxProps } from './index'; export default { - title: 'layouts/Box', + title: 'components/Box', component: Box, argTypes: { style: { diff --git a/src/shared/layout/Box/Box.tsx b/src/shared/ui/Box/Root.tsx similarity index 58% rename from src/shared/layout/Box/Box.tsx rename to src/shared/ui/Box/Root.tsx index 2b9ef458..229ffd10 100644 --- a/src/shared/layout/Box/Box.tsx +++ b/src/shared/ui/Box/Root.tsx @@ -1,10 +1,10 @@ import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; -export interface BoxProps extends ComponentProps<'div'> { +export interface RootProps extends ComponentProps<'div'> { style?: CSSProperties; } -const Box = ({ style, children, ...props }: PropsWithChildren) => { +const Root = ({ style, children, ...props }: PropsWithChildren) => { return (
{children} @@ -12,4 +12,4 @@ const Box = ({ style, children, ...props }: PropsWithChildren) => { ); }; -export default Box; +export default Root; diff --git a/src/shared/ui/Box/index.ts b/src/shared/ui/Box/index.ts new file mode 100644 index 00000000..52f2640c --- /dev/null +++ b/src/shared/ui/Box/index.ts @@ -0,0 +1,4 @@ +import Root from './Root'; + +export type { RootProps as BoxProps } from './Root'; +export { Root as Box }; From e59e9d8c1f1bbbe8d91cfb5c0f891c1dc3511253 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:14:24 +0900 Subject: [PATCH 186/307] =?UTF-8?q?refactoring:=20=EC=83=88=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=9C=20theme=20=EB=A1=9C=20stotybook=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/preview.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.storybook/preview.jsx b/.storybook/preview.jsx index 456c69d8..1c80fc5d 100644 --- a/.storybook/preview.jsx +++ b/.storybook/preview.jsx @@ -1,6 +1,6 @@ import { withThemeFromJSXProvider } from '@storybook/addon-themes'; import { ThemeProvider } from '@emotion/react'; -import theme from '../src/styles/theme'; +import { theme } from '../src/app/styles'; export const decorators = [ withThemeFromJSXProvider({ From 024912896a746813536a85e024ea131c5d8a3da4 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:15:02 +0900 Subject: [PATCH 187/307] =?UTF-8?q?style:=20Button=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=9D=98=20=EA=B8=B0=EB=B3=B8=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=EC=9D=84=20Emotion=20=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=98=AE=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Button/Button.stories.tsx | 7 +------ src/shared/ui/Button/Button.style.ts | 19 +++++++++++++++++++ src/shared/ui/Button/Label.tsx | 6 ++++-- src/shared/ui/Button/Root.tsx | 11 ++++------- 4 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 src/shared/ui/Button/Button.style.ts diff --git a/src/shared/ui/Button/Button.stories.tsx b/src/shared/ui/Button/Button.stories.tsx index 0645c121..93fa4c6b 100644 --- a/src/shared/ui/Button/Button.stories.tsx +++ b/src/shared/ui/Button/Button.stories.tsx @@ -5,20 +5,15 @@ export default { title: 'components/Button', component: Button, argTypes: { - children: { control: 'text' }, style: { control: 'object' }, props: { control: 'object' }, }, - args: { - children: 'Button', - style: { backgroundColor: 'blue', color: 'white' }, - }, }; export const Root = (args: RootProps) => { return ( - {args.children} + Button ); }; diff --git a/src/shared/ui/Button/Button.style.ts b/src/shared/ui/Button/Button.style.ts new file mode 100644 index 00000000..020e85fe --- /dev/null +++ b/src/shared/ui/Button/Button.style.ts @@ -0,0 +1,19 @@ +import styled from '@emotion/styled'; + +export const Button = styled.button` + background-color: ${({ theme }) => theme.color.white}; + border: none; + outline: none; + border-radius: 5px; + padding: 10px; + cursor: pointer; + + &:hover { + background-color: ${({ theme }) => theme.color.gray100}; + } +`; + +export const Label = styled.div` + width: 100%; + color: ${({ theme }) => theme.color.green500}; +`; diff --git a/src/shared/ui/Button/Label.tsx b/src/shared/ui/Button/Label.tsx index fc36b4be..327ae83c 100644 --- a/src/shared/ui/Button/Label.tsx +++ b/src/shared/ui/Button/Label.tsx @@ -1,5 +1,7 @@ import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import * as S from './Button.style'; + export interface LabelProps extends ComponentProps<'div'> { style?: CSSProperties; } @@ -10,9 +12,9 @@ const Label = ({ ...props }: PropsWithChildren) => { return ( -
+ {children} -
+ ); }; diff --git a/src/shared/ui/Button/Root.tsx b/src/shared/ui/Button/Root.tsx index 2249366a..bf79f874 100644 --- a/src/shared/ui/Button/Root.tsx +++ b/src/shared/ui/Button/Root.tsx @@ -1,24 +1,21 @@ import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import * as S from './Button.style'; + export interface RootProps extends ComponentProps<'button'> { style?: CSSProperties; } const Root = ({ children, style, ...props }: PropsWithChildren) => { return ( - + ); }; From 5cbc9ce63b789532ab02aaceedde58e3603d6d69 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:17:36 +0900 Subject: [PATCH 188/307] =?UTF-8?q?refactoring:=20useModal=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20useDisclosur?= =?UTF-8?q?e=20=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 --- .../{useModal.test.ts => useDisclosure.ts} | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) rename src/__tests__/{useModal.test.ts => useDisclosure.ts} (51%) diff --git a/src/__tests__/useModal.test.ts b/src/__tests__/useDisclosure.ts similarity index 51% rename from src/__tests__/useModal.test.ts rename to src/__tests__/useDisclosure.ts index 561cbe8f..7fc6766d 100644 --- a/src/__tests__/useModal.test.ts +++ b/src/__tests__/useDisclosure.ts @@ -1,11 +1,11 @@ import { act, renderHook } from '@testing-library/react'; import { describe, expect, test } from 'vitest'; -import { useModal } from '~/hooks'; +import { useDisclosure } from '~/shared/hooks'; -describe('useModal 훅 테스트', () => { - test('useModal 훅은 isOpen, setIsOpen, close, open 함수를 반환한다.', () => { - const { result } = renderHook(() => useModal()); +describe('useDisclosure 훅 테스트', () => { + test('useDisclosure 훅은 isOpen, setIsOpen, close, open 함수를 반환한다.', () => { + const { result } = renderHook(() => useDisclosure()); expect(result.current).toHaveProperty('isOpen'); expect(result.current).toHaveProperty('setIsOpen'); @@ -13,44 +13,35 @@ describe('useModal 훅 테스트', () => { expect(result.current).toHaveProperty('open'); }); - test('useModal 훅은 isOpen의 기본값을 false로 가진다.', () => { - const { result } = renderHook(() => useModal()); + test('useDisclosure 훅은 isOpen의 기본값을 false로 가진다.', () => { + const { result } = renderHook(() => useDisclosure()); const { isOpen } = result.current; expect(isOpen).toBe(false); }); test('useModal의 파라미터로 isOpen의 초기값을 전달할 수 있다.', () => { - const { result } = renderHook(() => useModal(true)); + const { result } = renderHook(() => useDisclosure(true)); const { isOpen } = result.current; expect(isOpen).toBe(true); }); test('useModal의 open 함수를 호출하면 isOpen이 true로 변경된다.', () => { - const { result } = renderHook(() => useModal(false)); + const { result } = renderHook(() => useDisclosure(false)); act(() => { - result.current.open(); + result.current.onOpen(); }); expect(result.current.isOpen).toBe(true); }); test('useModal의 close함수를 호출하면 isOpen이 false로 변경된다.', () => { - const { result } = renderHook(() => useModal(true)); + const { result } = renderHook(() => useDisclosure(true)); act(() => { - result.current.close(); + result.current.onClose(); }); expect(result.current.isOpen).toBe(false); }); - - test('useModal의 setIsOpen 함수를 호출하면 isOpen이 전달된 값으로 변경된다.', () => { - const { result } = renderHook(() => useModal()); - - act(() => { - result.current.setIsOpen(true); - }); - expect(result.current.isOpen).toBe(true); - }); }); From 42c46c2e27cd4baa7bb3c5fc8f63b2ff4cf2f17c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:19:56 +0900 Subject: [PATCH 189/307] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20storybook=20dependencies=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/main.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/.storybook/main.ts b/.storybook/main.ts index 60baf8d0..8069637e 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -9,7 +9,6 @@ const config: StorybookConfig = { '@chromatic-com/storybook', '@storybook/addon-interactions', '@storybook/addon-themes', - '@storybook/themes' ], framework: { name: '@storybook/react-vite', From a467f3ed0c0d45ede10caef42ee56eb5a94d666a Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:20:10 +0900 Subject: [PATCH 190/307] =?UTF-8?q?refactoring:=20=EA=B8=B0=EC=A1=B4=20use?= =?UTF-8?q?Modal=20=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/index.ts | 1 - src/hooks/useModal.tsx | 17 ----------------- 2 files changed, 18 deletions(-) delete mode 100644 src/hooks/index.ts delete mode 100644 src/hooks/useModal.tsx diff --git a/src/hooks/index.ts b/src/hooks/index.ts deleted file mode 100644 index 1ffc2642..00000000 --- a/src/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as useModal } from './useModal'; diff --git a/src/hooks/useModal.tsx b/src/hooks/useModal.tsx deleted file mode 100644 index d993aabf..00000000 --- a/src/hooks/useModal.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useState } from 'react'; - -const useModal = (initialOpen?: boolean) => { - const [isOpen, setIsOpen] = useState(initialOpen || false); - - const close = () => { - setIsOpen(false); - }; - - const open = () => { - setIsOpen(true); - }; - - return { isOpen, setIsOpen, close, open }; -}; - -export default useModal; From 51e84976b198a5db2fc1e536107b91e4438b0e64 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:20:28 +0900 Subject: [PATCH 191/307] =?UTF-8?q?refactoring:=20=EA=B8=B0=EC=A1=B4=20the?= =?UTF-8?q?me=20=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/styles/cardColor.ts | 15 --------------- src/styles/color.ts | 15 --------------- src/styles/main.css | 13 ------------- src/styles/theme.ts | 11 ----------- 4 files changed, 54 deletions(-) delete mode 100644 src/styles/cardColor.ts delete mode 100644 src/styles/color.ts delete mode 100644 src/styles/main.css delete mode 100644 src/styles/theme.ts diff --git a/src/styles/cardColor.ts b/src/styles/cardColor.ts deleted file mode 100644 index a40aa49c..00000000 --- a/src/styles/cardColor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CardCompany } from '../types'; - -const cardColor: Record & { none: string } = { - none: '#94dacd', - suyeon: '#E24141', - sejin: '#547CE4', - chanwook: '#73BC6D', - jonggil: '#DE59B9', - hyori: '#04C09E4F', - hyesong: '#E76E9A', - jingyeong: '#F37D3B', - geonwoo: '#FBCD58', -}; - -export default cardColor; diff --git a/src/styles/color.ts b/src/styles/color.ts deleted file mode 100644 index ecdcdeab..00000000 --- a/src/styles/color.ts +++ /dev/null @@ -1,15 +0,0 @@ -const color = { - white: '#ffffff', - gray100: '#eeeeee', - gray200: '#e0e0e0', - gray300: '#bdbdbd', - grayBackground: '#e5e5e5', - deemBackground: '#00000030', - mainGreen: '#04C09E', - grayFont: '#575757', - blackAlpha30: '#00000030', - darkYellow: '#cbba64', - red: '#E24141', -}; - -export default color; diff --git a/src/styles/main.css b/src/styles/main.css deleted file mode 100644 index 1b26b997..00000000 --- a/src/styles/main.css +++ /dev/null @@ -1,13 +0,0 @@ -* { - margin: 0px; - padding: 0px; - font-family: -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', - 'Pretendard Variable', Pretendard, Roboto, 'Noto Sans KR', 'Segoe UI', - 'Malgun Gothic', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', - sans-serif; - box-sizing: border-box; -} - -#root-modal { - position: relative; -} diff --git a/src/styles/theme.ts b/src/styles/theme.ts deleted file mode 100644 index 7f31a2db..00000000 --- a/src/styles/theme.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Theme } from '@emotion/react'; - -import cardColor from './cardColor'; -import color from './color'; - -const theme: Theme = { - color, - cardColor, -}; - -export default theme; From 12c64c0a75a1207bfbe61d92b861e026b3507bd1 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:33:16 +0900 Subject: [PATCH 192/307] =?UTF-8?q?feat:=20googleIcon=20=EC=97=90=20?= =?UTF-8?q?=EB=8B=AB=EA=B8=B0=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/constants/googleIcon.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shared/constants/googleIcon.ts b/src/shared/constants/googleIcon.ts index f62a5f0c..d7e9521b 100644 --- a/src/shared/constants/googleIcon.ts +++ b/src/shared/constants/googleIcon.ts @@ -1,4 +1,5 @@ export const googleIcon = Object.freeze({ arrowBack: 'arrow_back', add: 'add', + close: 'close', }); From b900bc3635e6b9ea3477160df13ee0c5e5446afd Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:33:35 +0900 Subject: [PATCH 193/307] =?UTF-8?q?feat:=20Modal=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- src/shared/hooks/index.ts | 1 + src/shared/hooks/useDisclosure.tsx | 17 +++++++ src/shared/ui/Modal/Body.tsx | 22 +++++++++ src/shared/ui/Modal/Content.tsx | 26 ++++++++++ src/shared/ui/Modal/Footer.tsx | 26 ++++++++++ src/shared/ui/Modal/Header.tsx | 26 ++++++++++ src/shared/ui/Modal/Modal.stories.tsx | 33 +++++++++++++ src/shared/ui/Modal/Modal.style.ts | 47 +++++++++++++++++++ src/shared/ui/Modal/Overlay.tsx | 10 ++++ src/shared/ui/Modal/Root.tsx | 18 +++++++ src/shared/ui/Modal/context/ModalContext.ts | 10 ++++ src/shared/ui/Modal/context/ModalProvider.tsx | 17 +++++++ src/shared/ui/Modal/context/index.ts | 2 + .../ui/Modal/context/useModalContext.ts | 15 ++++++ src/shared/ui/Modal/index.ts | 21 +++++++++ 15 files changed, 291 insertions(+) create mode 100644 src/shared/hooks/index.ts create mode 100644 src/shared/hooks/useDisclosure.tsx create mode 100644 src/shared/ui/Modal/Body.tsx create mode 100644 src/shared/ui/Modal/Content.tsx create mode 100644 src/shared/ui/Modal/Footer.tsx create mode 100644 src/shared/ui/Modal/Header.tsx create mode 100644 src/shared/ui/Modal/Modal.stories.tsx create mode 100644 src/shared/ui/Modal/Modal.style.ts create mode 100644 src/shared/ui/Modal/Overlay.tsx create mode 100644 src/shared/ui/Modal/Root.tsx create mode 100644 src/shared/ui/Modal/context/ModalContext.ts create mode 100644 src/shared/ui/Modal/context/ModalProvider.tsx create mode 100644 src/shared/ui/Modal/context/index.ts create mode 100644 src/shared/ui/Modal/context/useModalContext.ts create mode 100644 src/shared/ui/Modal/index.ts diff --git a/src/shared/hooks/index.ts b/src/shared/hooks/index.ts new file mode 100644 index 00000000..4f32fb1a --- /dev/null +++ b/src/shared/hooks/index.ts @@ -0,0 +1 @@ +export { default as useDisclosure } from './useDisclosure'; diff --git a/src/shared/hooks/useDisclosure.tsx b/src/shared/hooks/useDisclosure.tsx new file mode 100644 index 00000000..dba47d1c --- /dev/null +++ b/src/shared/hooks/useDisclosure.tsx @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +const useDisclosure = (initialOpen?: boolean) => { + const [isOpen, setIsOpen] = useState(initialOpen || false); + + const onOpen = () => { + setIsOpen(true); + }; + + const onClose = () => { + setIsOpen(false); + }; + + return { isOpen, onOpen, onClose }; +}; + +export default useDisclosure; diff --git a/src/shared/ui/Modal/Body.tsx b/src/shared/ui/Modal/Body.tsx new file mode 100644 index 00000000..3443e6b3 --- /dev/null +++ b/src/shared/ui/Modal/Body.tsx @@ -0,0 +1,22 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +import * as S from './Modal.style'; + +export interface BodyProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Body = ({ style, children, ...props }: PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default Body; diff --git a/src/shared/ui/Modal/Content.tsx b/src/shared/ui/Modal/Content.tsx new file mode 100644 index 00000000..d91b1855 --- /dev/null +++ b/src/shared/ui/Modal/Content.tsx @@ -0,0 +1,26 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +import * as S from './Modal.style'; + +export interface ContentProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Content = ({ + style, + children, + ...props +}: PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default Content; diff --git a/src/shared/ui/Modal/Footer.tsx b/src/shared/ui/Modal/Footer.tsx new file mode 100644 index 00000000..4f619225 --- /dev/null +++ b/src/shared/ui/Modal/Footer.tsx @@ -0,0 +1,26 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +import * as S from './Modal.style'; + +export interface FooterProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Footer = ({ + style, + children, + ...props +}: PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default Footer; diff --git a/src/shared/ui/Modal/Header.tsx b/src/shared/ui/Modal/Header.tsx new file mode 100644 index 00000000..5b1c51eb --- /dev/null +++ b/src/shared/ui/Modal/Header.tsx @@ -0,0 +1,26 @@ +import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; + +import * as S from './Modal.style'; + +export interface HeaderProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Header = ({ + style, + children, + ...props +}: PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default Header; diff --git a/src/shared/ui/Modal/Modal.stories.tsx b/src/shared/ui/Modal/Modal.stories.tsx new file mode 100644 index 00000000..a9033770 --- /dev/null +++ b/src/shared/ui/Modal/Modal.stories.tsx @@ -0,0 +1,33 @@ +import { Modal } from './index'; + +import { useDisclosure } from '~/shared/hooks'; +import { Button } from '~/shared/ui'; + +export default { + title: 'components/Modal', + component: Modal.Root, +}; + +export const Root = () => { + const { isOpen, onClose, onOpen } = useDisclosure(); + + return ( + <> + + Open Modal + + + + + Header + Body + + + Close Modal + + + + + + ); +}; diff --git a/src/shared/ui/Modal/Modal.style.ts b/src/shared/ui/Modal/Modal.style.ts new file mode 100644 index 00000000..7ef0b196 --- /dev/null +++ b/src/shared/ui/Modal/Modal.style.ts @@ -0,0 +1,47 @@ +import styled from '@emotion/styled'; + +export const Modal = styled.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: ${({ theme }) => theme.color.blackAlpha}; + z-index: 100; +`; + +export const Content = styled.div` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 100; + + padding: 20px; + background-color: white; + border-radius: 5px; + + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); +`; + +export const Header = styled.div` + width: 100%; + display: flex; + justify-content: space-between; + font-weight: bold; +`; + +export const Body = styled.div` + width: 100%; +`; + +export const Footer = styled.div` + width: 100%; + display: flex; + justify-content: flex-end; +`; diff --git a/src/shared/ui/Modal/Overlay.tsx b/src/shared/ui/Modal/Overlay.tsx new file mode 100644 index 00000000..b7b5c7ae --- /dev/null +++ b/src/shared/ui/Modal/Overlay.tsx @@ -0,0 +1,10 @@ +import { useModalContext } from './context'; +import * as S from './Modal.style'; + +const Overlay = () => { + const { onClose } = useModalContext(); + + return ; +}; + +export default Overlay; diff --git a/src/shared/ui/Modal/Root.tsx b/src/shared/ui/Modal/Root.tsx new file mode 100644 index 00000000..84829863 --- /dev/null +++ b/src/shared/ui/Modal/Root.tsx @@ -0,0 +1,18 @@ +import { ComponentProps, PropsWithChildren } from 'react'; + +import { ModalProvider } from './context'; + +export interface RootProps extends ComponentProps<'div'> { + isOpen: boolean; + onClose: () => void; +} + +const Root = ({ isOpen, onClose, children }: PropsWithChildren) => { + return ( + + {isOpen ? children : null} + + ); +}; + +export default Root; diff --git a/src/shared/ui/Modal/context/ModalContext.ts b/src/shared/ui/Modal/context/ModalContext.ts new file mode 100644 index 00000000..c9a05539 --- /dev/null +++ b/src/shared/ui/Modal/context/ModalContext.ts @@ -0,0 +1,10 @@ +import { createContext } from 'react'; + +export interface ModalContextValue { + isOpen: boolean; + onClose: () => void; +} + +export const ModalContext = createContext( + undefined, +); diff --git a/src/shared/ui/Modal/context/ModalProvider.tsx b/src/shared/ui/Modal/context/ModalProvider.tsx new file mode 100644 index 00000000..a117dafb --- /dev/null +++ b/src/shared/ui/Modal/context/ModalProvider.tsx @@ -0,0 +1,17 @@ +import { PropsWithChildren } from 'react'; + +import { ModalContext, ModalContextValue } from './ModalContext'; + +const ModalProvider = ({ + isOpen, + onClose, + children, +}: ModalContextValue & PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default ModalProvider; diff --git a/src/shared/ui/Modal/context/index.ts b/src/shared/ui/Modal/context/index.ts new file mode 100644 index 00000000..1266f1fa --- /dev/null +++ b/src/shared/ui/Modal/context/index.ts @@ -0,0 +1,2 @@ +export { default as ModalProvider } from './ModalProvider'; +export { default as useModalContext } from './useModalContext'; diff --git a/src/shared/ui/Modal/context/useModalContext.ts b/src/shared/ui/Modal/context/useModalContext.ts new file mode 100644 index 00000000..cd649af0 --- /dev/null +++ b/src/shared/ui/Modal/context/useModalContext.ts @@ -0,0 +1,15 @@ +import { useContext } from 'react'; + +import { ModalContext } from './ModalContext'; + +const useModalContext = () => { + const context = useContext(ModalContext); + + if (!context) { + throw new Error('useModal must be used within a ModalProvider'); + } + + return context; +}; + +export default useModalContext; diff --git a/src/shared/ui/Modal/index.ts b/src/shared/ui/Modal/index.ts new file mode 100644 index 00000000..0bb4e2f9 --- /dev/null +++ b/src/shared/ui/Modal/index.ts @@ -0,0 +1,21 @@ +import Body from './Body'; +import Content from './Content'; +import Footer from './Footer'; +import Header from './Header'; +import Overlay from './Overlay'; +import Root from './Root'; + +export type { RootProps } from './Root'; +export type { ContentProps } from './Content'; +export type { HeaderProps } from './Header'; +export type { BodyProps } from './Body'; +export type { FooterProps } from './Footer'; + +export const Modal = { + Root, + Overlay, + Content, + Header, + Body, + Footer, +}; From 4a0ff835261c1d24d867a67ef1d5e2700854db47 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Fri, 9 Aug 2024 18:54:59 +0900 Subject: [PATCH 194/307] =?UTF-8?q?refactoring:=20Modal=20Root=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=9D=84=20contextValue=20=ED=83=80=EC=9E=85=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=99=95=EC=9E=A5=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Modal/Root.tsx | 9 +++------ src/shared/ui/Modal/context/index.ts | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/shared/ui/Modal/Root.tsx b/src/shared/ui/Modal/Root.tsx index 84829863..f214162e 100644 --- a/src/shared/ui/Modal/Root.tsx +++ b/src/shared/ui/Modal/Root.tsx @@ -1,11 +1,8 @@ -import { ComponentProps, PropsWithChildren } from 'react'; +import { PropsWithChildren } from 'react'; -import { ModalProvider } from './context'; +import { ModalContextValue, ModalProvider } from './context'; -export interface RootProps extends ComponentProps<'div'> { - isOpen: boolean; - onClose: () => void; -} +export interface RootProps extends ModalContextValue {} const Root = ({ isOpen, onClose, children }: PropsWithChildren) => { return ( diff --git a/src/shared/ui/Modal/context/index.ts b/src/shared/ui/Modal/context/index.ts index 1266f1fa..f4d494f8 100644 --- a/src/shared/ui/Modal/context/index.ts +++ b/src/shared/ui/Modal/context/index.ts @@ -1,2 +1,3 @@ export { default as ModalProvider } from './ModalProvider'; export { default as useModalContext } from './useModalContext'; +export type { ModalContextValue } from './ModalContext'; From 237490dd355b923a1db6abf1bcb55b90e5a5a38c Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 12 Aug 2024 11:03:28 +0900 Subject: [PATCH 195/307] =?UTF-8?q?chore:=20Modal=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=95=8C=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Content -> Overlay로 수정 --- src/shared/ui/Modal/Modal.style.ts | 4 ++-- src/shared/ui/Modal/Overlay.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shared/ui/Modal/Modal.style.ts b/src/shared/ui/Modal/Modal.style.ts index 7ef0b196..326f6b1d 100644 --- a/src/shared/ui/Modal/Modal.style.ts +++ b/src/shared/ui/Modal/Modal.style.ts @@ -1,6 +1,6 @@ import styled from '@emotion/styled'; -export const Modal = styled.div` +export const Overlay = styled.div` position: fixed; top: 0; left: 0; @@ -26,7 +26,7 @@ export const Content = styled.div` align-items: center; gap: 10px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 10px ${({ theme }) => theme.color.blackAlpha}; `; export const Header = styled.div` diff --git a/src/shared/ui/Modal/Overlay.tsx b/src/shared/ui/Modal/Overlay.tsx index b7b5c7ae..a097dd2d 100644 --- a/src/shared/ui/Modal/Overlay.tsx +++ b/src/shared/ui/Modal/Overlay.tsx @@ -4,7 +4,7 @@ import * as S from './Modal.style'; const Overlay = () => { const { onClose } = useModalContext(); - return ; + return ; }; export default Overlay; From 459127d32bdd2badc2144bc0aea8d266c6320360 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 12 Aug 2024 11:24:45 +0900 Subject: [PATCH 196/307] =?UTF-8?q?style:=20Modal.Header=20=ED=8F=B0?= =?UTF-8?q?=ED=8A=B8=20=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=A6=9D=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Modal/Modal.style.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shared/ui/Modal/Modal.style.ts b/src/shared/ui/Modal/Modal.style.ts index 326f6b1d..9f7fbe4c 100644 --- a/src/shared/ui/Modal/Modal.style.ts +++ b/src/shared/ui/Modal/Modal.style.ts @@ -34,6 +34,7 @@ export const Header = styled.div` display: flex; justify-content: space-between; font-weight: bold; + font-size: 20px; `; export const Body = styled.div` From 4a497093149e364cee7980ce7d22acc2eca6bad9 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 12 Aug 2024 14:14:55 +0900 Subject: [PATCH 197/307] =?UTF-8?q?feat:=20Drawer=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=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 --- .../components/InputPassword/index.tsx | 2 +- src/pages/CardRegist/index.tsx | 2 +- src/pages/Home/index.tsx | 2 +- src/shared/ui/Drawer/Body.tsx | 17 +++ src/shared/ui/Drawer/Content.tsx | 25 ++++ src/shared/ui/Drawer/Drawer.stories.tsx | 43 ++++++ src/shared/ui/Drawer/Drawer.style.ts | 129 ++++++++++++++++++ src/shared/ui/Drawer/Footer.tsx | 17 +++ src/shared/ui/Drawer/Header.tsx | 22 +++ src/shared/ui/Drawer/Overlay.tsx | 10 ++ src/shared/ui/Drawer/Root.tsx | 19 +++ src/shared/ui/Drawer/context/DrawerContext.ts | 11 ++ .../ui/Drawer/context/DrawerProvider.tsx | 16 +++ src/shared/ui/Drawer/context/index.ts | 3 + .../ui/Drawer/context/useDrawerContext.ts | 15 ++ src/shared/ui/Drawer/index.ts | 21 +++ 16 files changed, 351 insertions(+), 3 deletions(-) create mode 100644 src/shared/ui/Drawer/Body.tsx create mode 100644 src/shared/ui/Drawer/Content.tsx create mode 100644 src/shared/ui/Drawer/Drawer.stories.tsx create mode 100644 src/shared/ui/Drawer/Drawer.style.ts create mode 100644 src/shared/ui/Drawer/Footer.tsx create mode 100644 src/shared/ui/Drawer/Header.tsx create mode 100644 src/shared/ui/Drawer/Overlay.tsx create mode 100644 src/shared/ui/Drawer/Root.tsx create mode 100644 src/shared/ui/Drawer/context/DrawerContext.ts create mode 100644 src/shared/ui/Drawer/context/DrawerProvider.tsx create mode 100644 src/shared/ui/Drawer/context/index.ts create mode 100644 src/shared/ui/Drawer/context/useDrawerContext.ts create mode 100644 src/shared/ui/Drawer/index.ts diff --git a/src/pages/CardRegist/components/InputPassword/index.tsx b/src/pages/CardRegist/components/InputPassword/index.tsx index a1158233..076b9dcc 100644 --- a/src/pages/CardRegist/components/InputPassword/index.tsx +++ b/src/pages/CardRegist/components/InputPassword/index.tsx @@ -7,7 +7,7 @@ import ReadonlyPassword from './ReadonlyPassword'; import TitleText from '../TitleText'; import { Card, CardBody, CardHeader, Input, InputWrapper } from '~/components'; -import { useModal } from '~/hooks'; +import { useModal } from '~/shared/hooks'; import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; import { validateHelper } from '~/utils/validateHelper'; diff --git a/src/pages/CardRegist/index.tsx b/src/pages/CardRegist/index.tsx index 1cfc8799..ddfa80b8 100644 --- a/src/pages/CardRegist/index.tsx +++ b/src/pages/CardRegist/index.tsx @@ -20,7 +20,7 @@ import { Button, GoogleIcon, } from '~/components'; -import { useModal } from '~/hooks'; +import { useModal } from '~/shared/hooks'; import { addCard } from '~/store'; import { CardForm } from '~/types'; import { cardRegsitFormValidate } from '~/utils/cardRegistFormValidate'; diff --git a/src/pages/Home/index.tsx b/src/pages/Home/index.tsx index 2ffe0f06..974253bb 100644 --- a/src/pages/Home/index.tsx +++ b/src/pages/Home/index.tsx @@ -3,7 +3,7 @@ import { Outlet, useNavigate } from 'react-router-dom'; import * as S from './index.style'; import { Button, DeemBackground } from '~/components'; -import { useModal } from '~/hooks'; +import { useModal } from '~/shared/hooks'; const Home = () => { const navigate = useNavigate(); diff --git a/src/shared/ui/Drawer/Body.tsx b/src/shared/ui/Drawer/Body.tsx new file mode 100644 index 00000000..3e9b2f93 --- /dev/null +++ b/src/shared/ui/Drawer/Body.tsx @@ -0,0 +1,17 @@ +import { ComponentProps, CSSProperties } from 'react'; + +import * as S from './Drawer.style'; + +export interface BodyProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Body = ({ style, children, ...props }: BodyProps) => { + return ( + + {children} + + ); +}; + +export default Body; diff --git a/src/shared/ui/Drawer/Content.tsx b/src/shared/ui/Drawer/Content.tsx new file mode 100644 index 00000000..9133186f --- /dev/null +++ b/src/shared/ui/Drawer/Content.tsx @@ -0,0 +1,25 @@ +import { ComponentProps, CSSProperties } from 'react'; + +import { useDrawerContext } from './context'; +import * as S from './Drawer.style'; + +export interface ContentProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Content = ({ style, children }: ContentProps) => { + const { placement } = useDrawerContext(); + + return ( + + {children} + + ); +}; + +export default Content; diff --git a/src/shared/ui/Drawer/Drawer.stories.tsx b/src/shared/ui/Drawer/Drawer.stories.tsx new file mode 100644 index 00000000..c84c4683 --- /dev/null +++ b/src/shared/ui/Drawer/Drawer.stories.tsx @@ -0,0 +1,43 @@ +import { Drawer, RootProps } from './index'; + +import { useDisclosure } from '~/shared/hooks'; +import { Button } from '~/shared/ui'; + +export default { + title: 'components/Drawer', + component: Drawer, + argTypes: { + placement: { + control: 'inline-radio', + options: ['top', 'right', 'bottom', 'left'], + }, + }, + args: { + placement: 'bottom', + }, +}; + +type Placement = Pick; + +export const Default = (placement: Placement) => { + const { isOpen, onClose, onOpen } = useDisclosure(); + + return ( + <> + + Open Drawer + + + + + Header + Body + + + + ); +}; diff --git a/src/shared/ui/Drawer/Drawer.style.ts b/src/shared/ui/Drawer/Drawer.style.ts new file mode 100644 index 00000000..21890592 --- /dev/null +++ b/src/shared/ui/Drawer/Drawer.style.ts @@ -0,0 +1,129 @@ +import { css } from '@emotion/react'; +import styled from '@emotion/styled'; + +export const Overlay = styled.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: ${({ theme }) => theme.color.blackAlpha}; + z-index: 100; +`; + +export interface ContentProps { + placement: 'top' | 'right' | 'bottom' | 'left'; +} + +function getTopPosition(placement: ContentProps['placement']) { + let top; + + switch (placement) { + case 'top': + top = 0; + break; + case 'right': + top = 0; + break; + case 'left': + top = 0; + break; + default: + break; + } + + return css` + top: ${top}px; + `; +} + +function getRightPosition(placement: ContentProps['placement']) { + let right; + + switch (placement) { + case 'right': + right = 0; + break; + case 'top': + right = 0; + break; + case 'bottom': + right = 0; + break; + default: + break; + } + + return css` + right: ${right}px; + `; +} + +function getBottomPosition(placement: ContentProps['placement']) { + let bottom; + + switch (placement) { + case 'bottom': + bottom = 0; + break; + default: + break; + } + + return css` + bottom: ${bottom}px; + `; +} + +function getLeftPosition(placement: ContentProps['placement']) { + let left; + + switch (placement) { + case 'left': + left = 0; + break; + case 'top': + left = 0; + break; + case 'bottom': + left = 0; + break; + default: + break; + } + + return css` + left: ${left}px; + `; +} + +export const Content = styled.div` + position: fixed; + background-color: ${({ theme }) => theme.color.white}; + z-index: 101; + padding: 20px; + min-width: ${({ placement }) => + placement === 'left' || placement === 'right' ? '200px' : '100%'}; + min-height: ${({ placement }) => + placement === 'top' || placement === 'bottom' ? '200px' : '100%'}; + ${({ placement }) => getTopPosition(placement)}; + ${({ placement }) => getRightPosition(placement)}; + ${({ placement }) => getBottomPosition(placement)}; + ${({ placement }) => getLeftPosition(placement)}; +`; + +export const Header = styled.div` + width: 100%; + display: flex; + justify-content: space-between; + font-weight: bold; +`; + +export const Body = styled.div` + width: 100%; +`; + +export const Footer = styled.div` + width: 100%; + display: flex; +`; diff --git a/src/shared/ui/Drawer/Footer.tsx b/src/shared/ui/Drawer/Footer.tsx new file mode 100644 index 00000000..598e2a78 --- /dev/null +++ b/src/shared/ui/Drawer/Footer.tsx @@ -0,0 +1,17 @@ +import { ComponentProps, CSSProperties } from 'react'; + +import * as S from './Drawer.style'; + +export interface FooterProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Footer = ({ style, children, ...props }: FooterProps) => { + return ( + + {children} + + ); +}; + +export default Footer; diff --git a/src/shared/ui/Drawer/Header.tsx b/src/shared/ui/Drawer/Header.tsx new file mode 100644 index 00000000..594c872c --- /dev/null +++ b/src/shared/ui/Drawer/Header.tsx @@ -0,0 +1,22 @@ +import { ComponentProps, CSSProperties } from 'react'; + +import * as S from './Drawer.style'; + +export interface HeaderProps extends ComponentProps<'div'> { + style?: CSSProperties; +} + +const Header = ({ style, children, ...props }: HeaderProps) => { + return ( + + {children} + + ); +}; + +export default Header; diff --git a/src/shared/ui/Drawer/Overlay.tsx b/src/shared/ui/Drawer/Overlay.tsx new file mode 100644 index 00000000..259c2536 --- /dev/null +++ b/src/shared/ui/Drawer/Overlay.tsx @@ -0,0 +1,10 @@ +import { useDrawerContext } from './context'; +import * as S from './Drawer.style'; + +const Overlay = () => { + const { onClose } = useDrawerContext(); + + return ; +}; + +export default Overlay; diff --git a/src/shared/ui/Drawer/Root.tsx b/src/shared/ui/Drawer/Root.tsx new file mode 100644 index 00000000..4faf48f2 --- /dev/null +++ b/src/shared/ui/Drawer/Root.tsx @@ -0,0 +1,19 @@ +import { PropsWithChildren } from 'react'; + +import { DrawerContextValue, DrawerProvider } from './context'; + +export interface RootProps extends DrawerContextValue {} + +const Root = ({ children, ...contextProps }: PropsWithChildren) => { + const { placement } = contextProps; + return ( + + {contextProps.isOpen ? children : null} + + ); +}; + +export default Root; diff --git a/src/shared/ui/Drawer/context/DrawerContext.ts b/src/shared/ui/Drawer/context/DrawerContext.ts new file mode 100644 index 00000000..93be4357 --- /dev/null +++ b/src/shared/ui/Drawer/context/DrawerContext.ts @@ -0,0 +1,11 @@ +import { createContext } from 'react'; + +export interface DrawerContextValue { + isOpen: boolean; + onClose: () => void; + placement?: 'top' | 'right' | 'bottom' | 'left'; +} + +export const DrawerContext = createContext( + undefined, +); diff --git a/src/shared/ui/Drawer/context/DrawerProvider.tsx b/src/shared/ui/Drawer/context/DrawerProvider.tsx new file mode 100644 index 00000000..75bfac31 --- /dev/null +++ b/src/shared/ui/Drawer/context/DrawerProvider.tsx @@ -0,0 +1,16 @@ +import { PropsWithChildren } from 'react'; + +import { DrawerContext, DrawerContextValue } from './DrawerContext'; + +const DrawerProvider = ({ + children, + ...drawerProps +}: DrawerContextValue & PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export default DrawerProvider; diff --git a/src/shared/ui/Drawer/context/index.ts b/src/shared/ui/Drawer/context/index.ts new file mode 100644 index 00000000..a645c099 --- /dev/null +++ b/src/shared/ui/Drawer/context/index.ts @@ -0,0 +1,3 @@ +export { default as DrawerProvider } from './DrawerProvider'; +export { default as useDrawerContext } from './useDrawerContext'; +export type { DrawerContextValue } from './DrawerContext'; diff --git a/src/shared/ui/Drawer/context/useDrawerContext.ts b/src/shared/ui/Drawer/context/useDrawerContext.ts new file mode 100644 index 00000000..9873342f --- /dev/null +++ b/src/shared/ui/Drawer/context/useDrawerContext.ts @@ -0,0 +1,15 @@ +import { useContext } from 'react'; + +import { DrawerContext } from './DrawerContext'; + +const useDrawerContext = () => { + const context = useContext(DrawerContext); + + if (!context) { + throw new Error('useDrawerContext must be used within a DrawerProvider'); + } + + return context; +}; + +export default useDrawerContext; diff --git a/src/shared/ui/Drawer/index.ts b/src/shared/ui/Drawer/index.ts new file mode 100644 index 00000000..5ab0c2a0 --- /dev/null +++ b/src/shared/ui/Drawer/index.ts @@ -0,0 +1,21 @@ +import Body from './Body'; +import Content from './Content'; +import Footer from './Footer'; +import Header from './Header'; +import Overlay from './Overlay'; +import Root from './Root'; + +export type { RootProps } from './Root'; +export type { ContentProps } from './Content'; +export type { HeaderProps } from './Header'; +export type { BodyProps } from './Body'; +export type { FooterProps } from './Footer'; + +export const Drawer = { + Root, + Overlay, + Content, + Header, + Body, + Footer, +}; From 27877b95d90cd758038eee5d3c5348f3469bb723 Mon Sep 17 00:00:00 2001 From: Suyeon Date: Mon, 12 Aug 2024 14:23:37 +0900 Subject: [PATCH 198/307] =?UTF-8?q?refactoring:=20PropsWithChildren=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/Box/Root.tsx | 4 ++-- src/shared/ui/Button/Label.tsx | 8 ++------ src/shared/ui/Button/Root.tsx | 4 ++-- src/shared/ui/Card/Body.tsx | 4 ++-- src/shared/ui/Card/Footer.tsx | 8 ++------ src/shared/ui/Card/Header.tsx | 8 ++------ src/shared/ui/Card/Root.tsx | 4 ++-- src/shared/ui/Field/Label.tsx | 8 ++------ src/shared/ui/Field/Root.tsx | 4 ++-- src/shared/ui/Keypad/Item.tsx | 4 ++-- src/shared/ui/Keypad/Root.tsx | 10 ++-------- src/shared/ui/Modal/Body.tsx | 4 ++-- src/shared/ui/Modal/Content.tsx | 8 ++------ src/shared/ui/Modal/Footer.tsx | 8 ++------ src/shared/ui/Modal/Header.tsx | 8 ++------ 15 files changed, 30 insertions(+), 64 deletions(-) diff --git a/src/shared/ui/Box/Root.tsx b/src/shared/ui/Box/Root.tsx index 229ffd10..0c9bddf3 100644 --- a/src/shared/ui/Box/Root.tsx +++ b/src/shared/ui/Box/Root.tsx @@ -1,10 +1,10 @@ -import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import { ComponentProps, CSSProperties } from 'react'; export interface RootProps extends ComponentProps<'div'> { style?: CSSProperties; } -const Root = ({ style, children, ...props }: PropsWithChildren) => { +const Root = ({ style, children, ...props }: RootProps) => { return (
{children} diff --git a/src/shared/ui/Button/Label.tsx b/src/shared/ui/Button/Label.tsx index 327ae83c..6d54cdb0 100644 --- a/src/shared/ui/Button/Label.tsx +++ b/src/shared/ui/Button/Label.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import { ComponentProps, CSSProperties } from 'react'; import * as S from './Button.style'; @@ -6,11 +6,7 @@ export interface LabelProps extends ComponentProps<'div'> { style?: CSSProperties; } -const Label = ({ - children, - style, - ...props -}: PropsWithChildren) => { +const Label = ({ children, style, ...props }: LabelProps) => { return ( {children} diff --git a/src/shared/ui/Button/Root.tsx b/src/shared/ui/Button/Root.tsx index bf79f874..bd7ae188 100644 --- a/src/shared/ui/Button/Root.tsx +++ b/src/shared/ui/Button/Root.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import { ComponentProps, CSSProperties } from 'react'; import * as S from './Button.style'; @@ -6,7 +6,7 @@ export interface RootProps extends ComponentProps<'button'> { style?: CSSProperties; } -const Root = ({ children, style, ...props }: PropsWithChildren) => { +const Root = ({ children, style, ...props }: RootProps) => { return ( { style?: CSSProperties; } -const Body = ({ children, style, ...props }: PropsWithChildren) => { +const Body = ({ children, style, ...props }: BodyProps) => { return (
{children} diff --git a/src/shared/ui/Card/Footer.tsx b/src/shared/ui/Card/Footer.tsx index a0f8336a..e034a13e 100644 --- a/src/shared/ui/Card/Footer.tsx +++ b/src/shared/ui/Card/Footer.tsx @@ -1,14 +1,10 @@ -import { ComponentProps, CSSProperties, PropsWithChildren } from 'react'; +import { ComponentProps, CSSProperties } from 'react'; export interface FooterProps extends ComponentProps<'div'> { style?: CSSProperties; } -const Footer = ({ - children, - style, - ...props -}: PropsWithChildren) => { +const Footer = ({ children, style, ...props }: FooterProps) => { return (
{ style?: CSSProperties; } -const Header = ({ - children, - style, - ...props -}: PropsWithChildren) => { +const Header = ({ children, style, ...props }: HeaderProps) => { return (
{ style?: CSSProperties; } -const Root = ({ children, style, ...props }: PropsWithChildren) => { +const Root = ({ children, style, ...props }: RootProps) => { return (
{ style?: CSSProperties; } -const Label = ({ - children, - style, - ...props -}: PropsWithChildren) => { +const Label = ({ children, style, ...props }: LabelProps) => { return (