From 0c8a4157c769c5759dd498052b8e0b4aff885253 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 08:56:24 -0300 Subject: [PATCH 01/60] Initial commit --- .gitignore | 24 + .prettierrc | 9 + eslint.config.js | 23 + index.html | 13 + package-lock.json | 3396 +++++++++++++++++++++++++++++++++++++++++++ package.json | 29 + public/favicon.png | Bin 0 -> 830 bytes src/App.tsx | 9 + src/assets/Logo.tsx | 22 + src/index.css | 19 + src/main.tsx | 10 + src/vite-env.d.ts | 1 + tsconfig.app.json | 27 + tsconfig.json | 7 + tsconfig.node.json | 25 + vite.config.ts | 7 + 16 files changed, 3621 insertions(+) create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.png create mode 100644 src/App.tsx create mode 100644 src/assets/Logo.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..71d2e1cb8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": false, + "tabWidth": 2, + "printWidth": 80, + "singleQuote": true, + "trailingComma": "none", + "bracketSpacing": true, + "arrowParens": "avoid" +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..d94e7deb7 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 000000000..7deccb9fe --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Looqdex | Looqbox Frontend Challenge + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..aafea5cb7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3396 @@ +{ + "name": "looqbox-frontend-challenge", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "looqbox-frontend-challenge", + "version": "0.0.0", + "dependencies": { + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } + }, + "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, + "license": "Apache-2.0", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", + "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.34", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz", + "integrity": "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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, + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.42.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.2.tgz", + "integrity": "sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.3", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.34", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001739", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", + "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.213", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", + "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "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, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", + "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.42.0", + "@typescript-eslint/parser": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", + "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..381210dae --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "looqbox-frontend-challenge", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..bc65cdfbf899a9314a99b302a96c88da044efd55 GIT binary patch literal 830 zcmV-E1Ht@>P)6{GnalaWV16n@0<6&_ug)T<|j(zx)u?cw5xD! zauZVts!n`ie{$3rILQtg2h1dO7#%0Dk2V3b>mcR!8il{~35*>c zqGEc83WxfY^K*Z`(u1W1s{C4@xL{du+l^X;lTPQIucKFS7^9)Pb*NZ2Ov0jz;7I}^&1Cp@5INufjR7P^T=tP89jk=_Dta3 zW&3gaB!!;i+{GA0Ms{t@lR!v{=~JYGG6aa5|MW;Nq3UvGge-~RSlaW}c>N7GUSVrX zN7qh`ISf@+Xf*(XGDL3UcC|0`8Emf-ph83@obR5Ta_s_0c-@eauvgdR{b>(0R)N|=ex7KGtM+V zwL=57pY`d)UUt}iKUJpm8hFMwl_5&2OcI7cM%Kk-?}b1LTP!_w&=R<__?|PDF>0LT zO(vf@7FdrAK;Q5;AnZ|D(zoZ(b}TxfN^tOiAm|ku^-J||?Y>fc0-?=FG#*)S0;0O< zAcPra9Ehv~h%rv#4@VfhruB$DJ0H0=)*F!k(yPQeo36+6S29*7!eYK90s=@qF9p4@ zz&jW_{!%IcLvd?;6!tz$Kp?)nw;isXB$vjS7H!&nIQTqY1-D^a)bpp3bN~PV07*qo IM6N<$g6Vd1&;S4c literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 000000000..fe5562692 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,9 @@ +function App() { + return ( + <> +

Hello world

+ + ) +} + +export default App diff --git a/src/assets/Logo.tsx b/src/assets/Logo.tsx new file mode 100644 index 000000000..f51530dda --- /dev/null +++ b/src/assets/Logo.tsx @@ -0,0 +1,22 @@ +const Logo = () => { + return ( + + + + + ) +} + +export default Logo diff --git a/src/index.css b/src/index.css new file mode 100644 index 000000000..e58826ef5 --- /dev/null +++ b/src/index.css @@ -0,0 +1,19 @@ +@import url('https://fonts.googleapis.com/css2?family=League+Spartan:wght@100..900'); + +:root { + font-family: 'League Spartan', system-ui, Arial, sans-serif; + line-height: auto; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + margin: 0; + padding: 0; + min-width: 100vw; + min-height: 100vh; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 000000000..bef5202a3 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..227a6c672 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..1ffef600d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 000000000..f85a39906 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..8b0f57b91 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 2276fca3d428e24c03e9acaecaece9e1b37c3497 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 09:23:26 -0300 Subject: [PATCH 02/60] chore: Added Ant Design library --- package-lock.json | 1039 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + 2 files changed, 1040 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index aafea5cb7..b7e2a3cd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,8 @@ "name": "looqbox-frontend-challenge", "version": "0.0.0", "dependencies": { + "@ant-design/v5-patch-for-react-19": "^1.0.3", + "antd": "^5.27.2", "react": "^19.1.1", "react-dom": "^19.1.1" }, @@ -39,6 +41,117 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz", + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@ant-design/v5-patch-for-react-19": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@ant-design/v5-patch-for-react-19/-/v5-patch-for-react-19-1.0.3.tgz", + "integrity": "sha512-iWfZuSUl5kuhqLUw7jJXUQFMMkM7XpW7apmKzQBQHU0cpifYW4A79xIBt9YVO5IBajKpPG5UKP87Ft7Yrw1p/w==", + "license": "MIT", + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "antd": ">=5.22.6", + "react": ">=19.0.0", + "react-dom": ">=19.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -273,6 +386,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -321,6 +443,18 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", @@ -1060,6 +1194,155 @@ "node": ">= 8" } }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.3.0.tgz", + "integrity": "sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz", @@ -1788,6 +2071,71 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antd": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.27.2.tgz", + "integrity": "sha512-9pYRUTrumIEuulRwZijhcnL6ScBZ1X6Y3iJa67VyNhEZAiXtENA7AtggsnqdVclQIm0WL4ky76qUdWrVhDWF3g==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.3.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.8", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.51.1", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.9.2", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1907,6 +2255,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "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==", + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1927,6 +2281,12 @@ "dev": true, "license": "MIT" }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1941,6 +2301,15 @@ "dev": true, "license": "MIT" }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1960,7 +2329,12 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", "license": "MIT" }, "node_modules/debug": { @@ -2562,6 +2936,15 @@ "dev": true, "license": "MIT" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2882,6 +3265,612 @@ ], "license": "MIT" }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", + "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.51.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.51.1.tgz", + "integrity": "sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.2.tgz", + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz", + "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.1.tgz", + "integrity": "sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", @@ -2903,6 +3892,12 @@ "react": "^19.1.1" } }, + "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==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -2913,6 +3908,12 @@ "node": ">=0.10.0" } }, + "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==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3005,6 +4006,15 @@ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3048,6 +4058,12 @@ "node": ">=0.10.0" } }, + "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==", + "license": "MIT" + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3061,6 +4077,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3074,6 +4096,15 @@ "node": ">=8" } }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -3135,6 +4166,12 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", diff --git a/package.json b/package.json index 381210dae..b2f0aab08 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "preview": "vite preview" }, "dependencies": { + "@ant-design/v5-patch-for-react-19": "^1.0.3", + "antd": "^5.27.2", "react": "^19.1.1", "react-dom": "^19.1.1" }, From 25654444934d19069c5eb2576dfd1207b3a62f35 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 09:53:53 -0300 Subject: [PATCH 03/60] feat: Configure theme colors --- src/App.tsx | 16 ++++++++++++++-- src/index.css | 11 ++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index fe5562692..2c58965e8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,20 @@ +import { ConfigProvider } from 'antd' + function App() { return ( - <> +

Hello world

- +
) } diff --git a/src/index.css b/src/index.css index e58826ef5..377e360a9 100644 --- a/src/index.css +++ b/src/index.css @@ -2,13 +2,21 @@ :root { font-family: 'League Spartan', system-ui, Arial, sans-serif; - line-height: auto; font-weight: 400; font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + + /* Color pallet */ + --vvd-green-cyan: '#00D084'; + --vvd-orange: '#FF6900'; + --eerie-black: '#172121'; + --white: '#FFFFFF'; + + --neutral-300: '#B1B9B9'; + --neutral-600: '#444B4B'; } body { @@ -16,4 +24,5 @@ body { padding: 0; min-width: 100vw; min-height: 100vh; + background-color: var(--white); } From 3d8fa77de9c5e53c81c35fd1ecfe48d1af8755ba Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 10:17:56 -0300 Subject: [PATCH 04/60] feat: Create the Home page --- package-lock.json | 1 + package.json | 1 + src/App.tsx | 7 +++++-- src/pages/Home.tsx | 28 ++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/pages/Home.tsx diff --git a/package-lock.json b/package-lock.json index b7e2a3cd7..c3c44d80d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "looqbox-frontend-challenge", "version": "0.0.0", "dependencies": { + "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", "antd": "^5.27.2", "react": "^19.1.1", diff --git a/package.json b/package.json index b2f0aab08..0f3b479f4 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", "antd": "^5.27.2", "react": "^19.1.1", diff --git a/src/App.tsx b/src/App.tsx index 2c58965e8..5f0101391 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ -import { ConfigProvider } from 'antd' +import { ConfigProvider, Layout } from 'antd' +import Home from './pages/Home' function App() { return ( @@ -13,7 +14,9 @@ function App() { } }} > -

Hello world

+ + + ) } diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 000000000..3672b1664 --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,28 @@ +import { SearchOutlined } from '@ant-design/icons' +import { Col, Flex, Input, Row, theme } from 'antd' +import { Content } from 'antd/es/layout/layout' +import Logo from '../assets/Logo' + +const Home = () => { + const { + token: { colorBgContainer } + } = theme.useToken() + + return ( + + + + + + } + /> + + + + + ) +} + +export default Home From b37def9654bc9474d97be70c1b2b0469f50829d7 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 19:51:31 -0300 Subject: [PATCH 05/60] =?UTF-8?q?feat:=20Create=20the=20Pok=C3=A9mon=20Car?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PokeCard.tsx | 74 +++++++++++++++++++++++++++++++++++++ src/components/TypeTag.tsx | 56 ++++++++++++++++++++++++++++ src/pages/Home.tsx | 19 +++++++++- src/styles/pokecard.css | 50 +++++++++++++++++++++++++ 4 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/components/PokeCard.tsx create mode 100644 src/components/TypeTag.tsx create mode 100644 src/styles/pokecard.css diff --git a/src/components/PokeCard.tsx b/src/components/PokeCard.tsx new file mode 100644 index 000000000..48b826fd5 --- /dev/null +++ b/src/components/PokeCard.tsx @@ -0,0 +1,74 @@ +import { Card, Flex, Typography } from 'antd' +import Meta from 'antd/es/card/Meta' +import { useState } from 'react' +import '../styles/pokecard.css' +import TypeTag, { type PokemonType } from './TypeTag' + +interface Props { + id: string + name: string + img: string + animatedImg: string + types: PokemonType[] +} + +const PokeCard = ({ id, name, img, animatedImg, types }: Props) => { + const [isHovering, setHovering] = useState(false) + + return ( + setHovering(true)} + onMouseOut={() => setHovering(false)} + cover={ + + } + > + {name}} + description={ + + {types.map(type => ( + + ))} + + + #{id} + + + } + /> + + ) +} + +interface PokeImageProps { + animate: boolean + img: Props['img'] + animatedImg: Props['animatedImg'] +} + +const PokeImage = ({ animate, img, animatedImg }: PokeImageProps) => { + return ( +
+ {!animate && ( + pokemon image + )} + + {animate && ( + pokemon image + )} +
+ ) +} + +export default PokeCard diff --git a/src/components/TypeTag.tsx b/src/components/TypeTag.tsx new file mode 100644 index 000000000..65dae0b61 --- /dev/null +++ b/src/components/TypeTag.tsx @@ -0,0 +1,56 @@ +import { Tag } from 'antd' + +interface TypeTagProps { + type: PokemonType +} + +const TypeTag = ({ type }: TypeTagProps) => { + return ( + + {type} + + ) +} + +export type PokemonType = + | 'fire' + | 'water' + | 'ice' + | 'grass' + | 'bug' + | 'rock' + | 'ground' + | 'steel' + | 'electric' + | 'ghost' + | 'dark' + | 'poison' + | 'psychic' + | 'fairy' + | 'dragon' + | 'flying' + | 'fighting' + | 'normal' + +const typeColors: Record = { + fire: 'red', + water: 'blue', + ice: 'cyan', + grass: 'green', + bug: 'green', + rock: 'orange', + ground: 'volcano', + steel: 'cyan', + electric: 'orange', + ghost: 'purple', + dark: 'purple', + poison: 'purple', + psychic: 'magenta', + fairy: 'magenta', + dragon: 'geekblue', + flying: 'geekblue', + fighting: 'volcano', + normal: 'default' +} + +export default TypeTag diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 3672b1664..cd4f312ff 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -2,6 +2,7 @@ import { SearchOutlined } from '@ant-design/icons' import { Col, Flex, Input, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import Logo from '../assets/Logo' +import PokeCard from '../components/PokeCard' const Home = () => { const { @@ -9,9 +10,11 @@ const Home = () => { } = theme.useToken() return ( - + - + { + + + + + + ) } diff --git a/src/styles/pokecard.css b/src/styles/pokecard.css new file mode 100644 index 000000000..7c7713bdf --- /dev/null +++ b/src/styles/pokecard.css @@ -0,0 +1,50 @@ +.pokecard { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.pokecard__image--container { + padding: 1.5rem; + padding-bottom: 0px; + display: flex !important; + justify-content: center; + align-items: center; + overflow: hidden; + height: 100%; + min-height: 260px; + + & img { + image-rendering: pixelated; + } +} + +img.pokecard__image--animated { + height: 90%; + animation: growAnimation 0.3s forwards; +} + +@keyframes growAnimation { + 0% { + transform: scale(0.8); + } + 100% { + transform: scale(1); + } +} + +img.pokecard__image--static { + height: 120%; + animation: shrinkAnimation 0.3s forwards; +} + +@keyframes shrinkAnimation { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.85); + } +} From 45ddd3579b4916043d6751338c7bd1b7a33754ea Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 21:45:22 -0300 Subject: [PATCH 06/60] =?UTF-8?q?feat:=20Getting=20Pok=C3=A9mon=20data=20w?= =?UTF-8?q?ith=20Axios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 280 ++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/api/getPokemon.ts | 26 ++++ src/pages/Home.tsx | 60 +++++++-- 4 files changed, 357 insertions(+), 10 deletions(-) create mode 100644 src/api/getPokemon.ts diff --git a/package-lock.json b/package-lock.json index c3c44d80d..88ce258ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", "antd": "^5.27.2", + "axios": "^1.11.0", "react": "^19.1.1", "react-dom": "^19.1.1" }, @@ -2144,6 +2145,23 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2208,6 +2226,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2282,6 +2313,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compute-scroll-into-view": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", @@ -2363,6 +2406,29 @@ "dev": true, "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.213", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", @@ -2370,6 +2436,51 @@ "dev": true, "license": "ISC" }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -2738,6 +2849,42 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2753,6 +2900,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==", + "license": "MIT", + "funding": { + "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", @@ -2763,6 +2919,43 @@ "node": ">=6.9.0" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2789,6 +2982,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2806,6 +3011,45 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3016,6 +3260,15 @@ "yallist": "^3.0.2" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3040,6 +3293,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3235,6 +3509,12 @@ "node": ">= 0.8.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/package.json b/package.json index 0f3b479f4..88300c778 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", "antd": "^5.27.2", + "axios": "^1.11.0", "react": "^19.1.1", "react-dom": "^19.1.1" }, diff --git a/src/api/getPokemon.ts b/src/api/getPokemon.ts new file mode 100644 index 000000000..b20d32ca1 --- /dev/null +++ b/src/api/getPokemon.ts @@ -0,0 +1,26 @@ +import axios from 'axios' + +const limit = 18 + +export const getAllPokemon = async () => { + const data = [] + + for (let i = 1; i <= limit; i++) + try { + const res = await getPokemon(i) + data.push(res) + } catch (error) { + console.log(error) + } + + return data +} + +export const getPokemon = async (pokeId: number) => { + try { + const res = await axios.get(`https://pokeapi.co/api/v2/pokemon/${pokeId}`) + return res.data + } catch (error) { + console.log(error) + } +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index cd4f312ff..e79826686 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,14 +1,46 @@ import { SearchOutlined } from '@ant-design/icons' import { Col, Flex, Input, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' +import { useEffect, useState } from 'react' +import { getAllPokemon } from '../api/getPokemon' import Logo from '../assets/Logo' import PokeCard from '../components/PokeCard' +import type { PokemonType } from '../components/TypeTag' + +type PokemonProps = { + id: number + name: string + sprites: { + versions: { + 'generation-v': { + 'black-white': { + front_default: string + animated: { + front_default: string + } + } + } + } + } + types: { type: { name: string } }[] +} const Home = () => { + const [allPokemon, setAllPokemon] = useState([]) + const { token: { colorBgContainer } } = theme.useToken() + useEffect(() => { + const fetchData = async () => { + const data = await getAllPokemon() + setAllPokemon(data) + } + + fetchData() + }, []) + return ( { - - - - + + {allPokemon.map(pokemon => ( + + type.type.name) as PokemonType[]} + /> + + ))} ) From fb36c3920a20471c36c8c4037d2b90a46942a05b Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 21:53:58 -0300 Subject: [PATCH 07/60] refactor: Move type declarations to a separate file --- src/components/PokeCard.tsx | 5 +++-- src/components/TypeTag.tsx | 25 +++---------------------- src/pages/Home.tsx | 24 ++++-------------------- src/types/pokemonTypes.ts | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 44 deletions(-) create mode 100644 src/types/pokemonTypes.ts diff --git a/src/components/PokeCard.tsx b/src/components/PokeCard.tsx index 48b826fd5..cd99e53cd 100644 --- a/src/components/PokeCard.tsx +++ b/src/components/PokeCard.tsx @@ -2,14 +2,15 @@ import { Card, Flex, Typography } from 'antd' import Meta from 'antd/es/card/Meta' import { useState } from 'react' import '../styles/pokecard.css' -import TypeTag, { type PokemonType } from './TypeTag' +import type { PokemonTypes } from '../types/pokemonTypes' +import TypeTag from './TypeTag' interface Props { id: string name: string img: string animatedImg: string - types: PokemonType[] + types: PokemonTypes[] } const PokeCard = ({ id, name, img, animatedImg, types }: Props) => { diff --git a/src/components/TypeTag.tsx b/src/components/TypeTag.tsx index 65dae0b61..6d952d9d6 100644 --- a/src/components/TypeTag.tsx +++ b/src/components/TypeTag.tsx @@ -1,7 +1,8 @@ import { Tag } from 'antd' +import type { PokemonTypes } from '../types/pokemonTypes' interface TypeTagProps { - type: PokemonType + type: PokemonTypes } const TypeTag = ({ type }: TypeTagProps) => { @@ -12,27 +13,7 @@ const TypeTag = ({ type }: TypeTagProps) => { ) } -export type PokemonType = - | 'fire' - | 'water' - | 'ice' - | 'grass' - | 'bug' - | 'rock' - | 'ground' - | 'steel' - | 'electric' - | 'ghost' - | 'dark' - | 'poison' - | 'psychic' - | 'fairy' - | 'dragon' - | 'flying' - | 'fighting' - | 'normal' - -const typeColors: Record = { +const typeColors: Record = { fire: 'red', water: 'blue', ice: 'cyan', diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index e79826686..02e723266 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -5,25 +5,7 @@ import { useEffect, useState } from 'react' import { getAllPokemon } from '../api/getPokemon' import Logo from '../assets/Logo' import PokeCard from '../components/PokeCard' -import type { PokemonType } from '../components/TypeTag' - -type PokemonProps = { - id: number - name: string - sprites: { - versions: { - 'generation-v': { - 'black-white': { - front_default: string - animated: { - front_default: string - } - } - } - } - } - types: { type: { name: string } }[] -} +import type { PokemonProps, PokemonTypes } from '../types/pokemonTypes' const Home = () => { const [allPokemon, setAllPokemon] = useState([]) @@ -71,7 +53,9 @@ const Home = () => { pokemon.sprites.versions['generation-v']['black-white'] .front_default } - types={pokemon.types.map(type => type.type.name) as PokemonType[]} + types={ + pokemon.types.map(type => type.type.name) as PokemonTypes[] + } /> ))} diff --git a/src/types/pokemonTypes.ts b/src/types/pokemonTypes.ts new file mode 100644 index 000000000..115a1e5a2 --- /dev/null +++ b/src/types/pokemonTypes.ts @@ -0,0 +1,37 @@ +export type PokemonProps = { + id: number + name: string + sprites: { + versions: { + 'generation-v': { + 'black-white': { + front_default: string + animated: { + front_default: string + } + } + } + } + } + types: { type: { name: string } }[] +} + +export type PokemonTypes = + | 'fire' + | 'water' + | 'ice' + | 'grass' + | 'bug' + | 'rock' + | 'ground' + | 'steel' + | 'electric' + | 'ghost' + | 'dark' + | 'poison' + | 'psychic' + | 'fairy' + | 'dragon' + | 'flying' + | 'fighting' + | 'normal' From be4a3b2ecea50ff0a670d074bc02a0798ab3832e Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 22:00:39 -0300 Subject: [PATCH 08/60] refactor: Applying the SRP in the Home page --- src/App.tsx | 2 +- src/pages/Home.tsx | 67 -------------------- src/pages/home/Home.tsx | 21 ++++++ src/pages/home/components/Header.tsx | 21 ++++++ src/{ => pages/home}/components/PokeCard.tsx | 6 +- src/pages/home/components/PokeGrid.tsx | 41 ++++++++++++ 6 files changed, 87 insertions(+), 71 deletions(-) delete mode 100644 src/pages/Home.tsx create mode 100644 src/pages/home/Home.tsx create mode 100644 src/pages/home/components/Header.tsx rename src/{ => pages/home}/components/PokeCard.tsx (91%) create mode 100644 src/pages/home/components/PokeGrid.tsx diff --git a/src/App.tsx b/src/App.tsx index 5f0101391..3d5931101 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ import { ConfigProvider, Layout } from 'antd' -import Home from './pages/Home' +import Home from './pages/home/Home' function App() { return ( diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx deleted file mode 100644 index 02e723266..000000000 --- a/src/pages/Home.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { SearchOutlined } from '@ant-design/icons' -import { Col, Flex, Input, Row, theme } from 'antd' -import { Content } from 'antd/es/layout/layout' -import { useEffect, useState } from 'react' -import { getAllPokemon } from '../api/getPokemon' -import Logo from '../assets/Logo' -import PokeCard from '../components/PokeCard' -import type { PokemonProps, PokemonTypes } from '../types/pokemonTypes' - -const Home = () => { - const [allPokemon, setAllPokemon] = useState([]) - - const { - token: { colorBgContainer } - } = theme.useToken() - - useEffect(() => { - const fetchData = async () => { - const data = await getAllPokemon() - setAllPokemon(data) - } - - fetchData() - }, []) - - return ( - - - - - - } - /> - - - - - - {allPokemon.map(pokemon => ( - - type.type.name) as PokemonTypes[] - } - /> - - ))} - - - ) -} - -export default Home diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx new file mode 100644 index 000000000..64bb73a86 --- /dev/null +++ b/src/pages/home/Home.tsx @@ -0,0 +1,21 @@ +import { theme } from 'antd' +import { Content } from 'antd/es/layout/layout' +import HomeHeader from './components/Header' +import PokeGrid from './components/PokeGrid' + +const Home = () => { + const { + token: { colorBgContainer } + } = theme.useToken() + + return ( + + + + + ) +} + +export default Home diff --git a/src/pages/home/components/Header.tsx b/src/pages/home/components/Header.tsx new file mode 100644 index 000000000..3924e815b --- /dev/null +++ b/src/pages/home/components/Header.tsx @@ -0,0 +1,21 @@ +import { SearchOutlined } from '@ant-design/icons' +import { Col, Flex, Input, Row } from 'antd' +import Logo from '../../../assets/Logo' + +const HomeHeader = () => { + return ( + + + + + } + /> + + + + ) +} + +export default HomeHeader diff --git a/src/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx similarity index 91% rename from src/components/PokeCard.tsx rename to src/pages/home/components/PokeCard.tsx index cd99e53cd..683efb9a0 100644 --- a/src/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -1,9 +1,9 @@ import { Card, Flex, Typography } from 'antd' import Meta from 'antd/es/card/Meta' import { useState } from 'react' -import '../styles/pokecard.css' -import type { PokemonTypes } from '../types/pokemonTypes' -import TypeTag from './TypeTag' +import TypeTag from '../../../components/TypeTag' +import '../../../styles/pokecard.css' +import type { PokemonTypes } from '../../../types/pokemonTypes' interface Props { id: string diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx new file mode 100644 index 000000000..f18c7baab --- /dev/null +++ b/src/pages/home/components/PokeGrid.tsx @@ -0,0 +1,41 @@ +import { Col, Row } from 'antd' +import { useEffect, useState } from 'react' +import { getAllPokemon } from '../../../api/getPokemon' +import type { PokemonProps, PokemonTypes } from '../../../types/pokemonTypes' +import PokeCard from './PokeCard' + +const PokeGrid = () => { + const [allPokemon, setAllPokemon] = useState([]) + + useEffect(() => { + const fetchData = async () => { + const data = await getAllPokemon() + setAllPokemon(data) + } + fetchData() + }, []) + + return ( + + {allPokemon.map(pokemon => ( + + type.type.name) as PokemonTypes[]} + /> + + ))} + + ) +} + +export default PokeGrid From c934cfe53b020f1666e524979f5f4d5a7e5e6851 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 22:13:07 -0300 Subject: [PATCH 09/60] fix: Handle Pokemon without animated sprite --- src/pages/home/components/PokeCard.tsx | 20 ++++++++---- src/pages/home/components/PokeGrid.tsx | 44 ++++++++++++++++---------- src/types/pokemonTypes.ts | 1 + 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/pages/home/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx index 683efb9a0..84c236a5b 100644 --- a/src/pages/home/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -23,7 +23,12 @@ const PokeCard = ({ id, name, img, animatedImg, types }: Props) => { onMouseOver={() => setHovering(true)} onMouseOut={() => setHovering(false)} cover={ - + } > { } interface PokeImageProps { - animate: boolean + isHovering: boolean + name: Props['name'] img: Props['img'] animatedImg: Props['animatedImg'] } -const PokeImage = ({ animate, img, animatedImg }: PokeImageProps) => { +const PokeImage = ({ name, img, animatedImg, isHovering }: PokeImageProps) => { return (
- {!animate && ( + {!isHovering && ( pokemon image )} - {animate && ( + {isHovering && ( pokemon image )} diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index f18c7baab..6c822798f 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -17,23 +17,33 @@ const PokeGrid = () => { return ( - {allPokemon.map(pokemon => ( - - type.type.name) as PokemonTypes[]} - /> - - ))} + {allPokemon.map(pokemon => { + const blackWhiteVer = + pokemon.sprites.versions['generation-v']['black-white'] + const hasBlackWhite = blackWhiteVer.front_default !== null + + return ( + + type.type.name) as PokemonTypes[] + } + /> + + ) + })} ) } diff --git a/src/types/pokemonTypes.ts b/src/types/pokemonTypes.ts index 115a1e5a2..93358d678 100644 --- a/src/types/pokemonTypes.ts +++ b/src/types/pokemonTypes.ts @@ -2,6 +2,7 @@ export type PokemonProps = { id: number name: string sprites: { + front_default: string versions: { 'generation-v': { 'black-white': { From 159d36688b27b77a541b3149854c19fe5fd75f31 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Wed, 3 Sep 2025 22:32:36 -0300 Subject: [PATCH 10/60] fix: Changing verification to handle missing animated sprite --- src/api/getPokemon.ts | 2 +- src/pages/home/components/PokeGrid.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/api/getPokemon.ts b/src/api/getPokemon.ts index b20d32ca1..770f375ff 100644 --- a/src/api/getPokemon.ts +++ b/src/api/getPokemon.ts @@ -7,7 +7,7 @@ export const getAllPokemon = async () => { for (let i = 1; i <= limit; i++) try { - const res = await getPokemon(i) + const res = await getPokemon(800) data.push(res) } catch (error) { console.log(error) diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index 6c822798f..e9ac90c46 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -20,7 +20,7 @@ const PokeGrid = () => { {allPokemon.map(pokemon => { const blackWhiteVer = pokemon.sprites.versions['generation-v']['black-white'] - const hasBlackWhite = blackWhiteVer.front_default !== null + const hasAnimatedSprite = blackWhiteVer.animated.front_default !== null return ( @@ -28,12 +28,12 @@ const PokeGrid = () => { id={String(pokemon.id)} name={pokemon.name} animatedImg={ - hasBlackWhite + hasAnimatedSprite ? blackWhiteVer.animated.front_default : pokemon.sprites.front_default } img={ - hasBlackWhite + hasAnimatedSprite ? blackWhiteVer.front_default : pokemon.sprites.front_default } From 7c655ef5fd407a1b79b095dd34cf7da9ceed6ec8 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 09:05:23 -0300 Subject: [PATCH 11/60] refactor: Update layout styling for better responsiveness --- src/App.tsx | 2 +- src/api/getPokemon.ts | 2 +- src/index.css | 29 ++++++++++++++++++++++++++ src/pages/home/Home.tsx | 4 +--- src/pages/home/components/PokeGrid.tsx | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 3d5931101..0bb7c0ac3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,7 +14,7 @@ function App() { } }} > - + diff --git a/src/api/getPokemon.ts b/src/api/getPokemon.ts index 770f375ff..b20d32ca1 100644 --- a/src/api/getPokemon.ts +++ b/src/api/getPokemon.ts @@ -7,7 +7,7 @@ export const getAllPokemon = async () => { for (let i = 1; i <= limit; i++) try { - const res = await getPokemon(800) + const res = await getPokemon(i) data.push(res) } catch (error) { console.log(error) diff --git a/src/index.css b/src/index.css index 377e360a9..50cb73369 100644 --- a/src/index.css +++ b/src/index.css @@ -26,3 +26,32 @@ body { min-height: 100vh; background-color: var(--white); } + +.container { + padding: 0 24px; + background-color: var(--white); +} + +@media (min-width: 768px) { + .container { + padding: 0 40px; + } +} + +@media (min-width: 1000px) { + .container { + padding: 0 64px; + } +} + +@media (min-width: 1200px) { + .container { + padding: 0 88px; + } +} + +@media (min-width: 1600px) { + .container { + padding: 0 160px; + } +} diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx index 64bb73a86..cf60b5159 100644 --- a/src/pages/home/Home.tsx +++ b/src/pages/home/Home.tsx @@ -9,9 +9,7 @@ const Home = () => { } = theme.useToken() return ( - + diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index e9ac90c46..e58adfde5 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -23,7 +23,7 @@ const PokeGrid = () => { const hasAnimatedSprite = blackWhiteVer.animated.front_default !== null return ( - + Date: Thu, 4 Sep 2025 09:08:19 -0300 Subject: [PATCH 12/60] feat: Integrate React-Query for data fetching --- package-lock.json | 27 +++++++++++++++++++++++++++ package.json | 1 + src/App.tsx | 35 ++++++++++++++++++++--------------- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88ce258ef..ad856e17f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", + "@tanstack/react-query": "^5.86.0", "antd": "^5.27.2", "axios": "^1.11.0", "react": "^19.1.1", @@ -1646,6 +1647,32 @@ "win32" ] }, + "node_modules/@tanstack/query-core": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.86.0.tgz", + "integrity": "sha512-Y6ibQm6BXbw6w1p3a5LrPn8Ae64M0dx7hGmnhrm9P+XAkCCKXOwZN0J5Z1wK/0RdNHtR9o+sWHDXd4veNI60tQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.86.0.tgz", + "integrity": "sha512-jgS/v0oSJkGHucv9zxOS8rL7mjATh1XO3K4eqAV4WMpAly8okcBrGi1YxRZN5S4B59F54x9JFjWrK5vMAvJYqA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.86.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/package.json b/package.json index 88300c778..ce4817907 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@ant-design/icons": "^5.6.1", "@ant-design/v5-patch-for-react-19": "^1.0.3", + "@tanstack/react-query": "^5.86.0", "antd": "^5.27.2", "axios": "^1.11.0", "react": "^19.1.1", diff --git a/src/App.tsx b/src/App.tsx index 0bb7c0ac3..f394ad08b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,23 +1,28 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { ConfigProvider, Layout } from 'antd' import Home from './pages/home/Home' +const queryClient = new QueryClient() + function App() { return ( - - - - - + + + + + + + ) } From a2a7868a4205f21bb39e12ee92adb5b05afda14e Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 09:43:20 -0300 Subject: [PATCH 13/60] refactor: Create custom hooks for fetch and cache Pokemon data --- src/api/getPokemon.ts | 21 +++------------------ src/api/usePokemon.ts | 19 +++++++++++++++++++ src/pages/home/components/PokeGrid.tsx | 20 +++++++------------- 3 files changed, 29 insertions(+), 31 deletions(-) create mode 100644 src/api/usePokemon.ts diff --git a/src/api/getPokemon.ts b/src/api/getPokemon.ts index b20d32ca1..9df2fe564 100644 --- a/src/api/getPokemon.ts +++ b/src/api/getPokemon.ts @@ -1,26 +1,11 @@ import axios from 'axios' +import type { PokemonProps } from '../types/pokemonTypes' -const limit = 18 - -export const getAllPokemon = async () => { - const data = [] - - for (let i = 1; i <= limit; i++) - try { - const res = await getPokemon(i) - data.push(res) - } catch (error) { - console.log(error) - } - - return data -} - -export const getPokemon = async (pokeId: number) => { +export const getPokemon = async (pokeId: number): Promise => { try { const res = await axios.get(`https://pokeapi.co/api/v2/pokemon/${pokeId}`) return res.data } catch (error) { - console.log(error) + throw new Error('Failed to fetch Pokemon. Error: ' + error) } } diff --git a/src/api/usePokemon.ts b/src/api/usePokemon.ts new file mode 100644 index 000000000..170661ee7 --- /dev/null +++ b/src/api/usePokemon.ts @@ -0,0 +1,19 @@ +import { useQueries, useQuery } from '@tanstack/react-query' +import { getPokemon } from './getPokemon' + +export const useGetPokemon = (pokeId: number) => { + return useQuery({ + queryKey: [pokeId], + queryFn: () => getPokemon(pokeId) + }) +} + +export const useGetAllPokemon = () => { + const limit = 18 + return useQueries({ + queries: Array.from({ length: limit }, (_, i) => ({ + queryKey: [i + 1], + queryFn: () => getPokemon(i + 1) + })) + }) +} diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index e58adfde5..bd6e424b8 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -1,23 +1,17 @@ import { Col, Row } from 'antd' -import { useEffect, useState } from 'react' -import { getAllPokemon } from '../../../api/getPokemon' -import type { PokemonProps, PokemonTypes } from '../../../types/pokemonTypes' +import { useGetAllPokemon } from '../../../api/usePokemon' +import type { PokemonTypes } from '../../../types/pokemonTypes' import PokeCard from './PokeCard' const PokeGrid = () => { - const [allPokemon, setAllPokemon] = useState([]) - - useEffect(() => { - const fetchData = async () => { - const data = await getAllPokemon() - setAllPokemon(data) - } - fetchData() - }, []) + const allPokemonQueries = useGetAllPokemon() + const pokemonList = allPokemonQueries + .map(query => query.data) + .filter(pokemon => pokemon !== undefined) return ( - {allPokemon.map(pokemon => { + {pokemonList.map(pokemon => { const blackWhiteVer = pokemon.sprites.versions['generation-v']['black-white'] const hasAnimatedSprite = blackWhiteVer.animated.front_default !== null From 3fb538ed953a16f1941ea8423440e5a5f24f49a0 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 10:18:27 -0300 Subject: [PATCH 14/60] feat: Add loading state to PokeCard --- src/App.tsx | 33 +++++++++++++----------- src/pages/home/components/PokeCard.tsx | 35 +++++++++++++------------- src/pages/home/components/PokeGrid.tsx | 2 ++ src/styles/pokecard.css | 17 +++++++++---- 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index f394ad08b..8cbd6c803 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,3 +1,4 @@ +import { StyleProvider } from '@ant-design/cssinjs' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { ConfigProvider, Layout } from 'antd' import Home from './pages/home/Home' @@ -7,21 +8,23 @@ const queryClient = new QueryClient() function App() { return ( - - - - - + + + + + + + ) } diff --git a/src/pages/home/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx index 84c236a5b..f6c87356f 100644 --- a/src/pages/home/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -1,4 +1,5 @@ -import { Card, Flex, Typography } from 'antd' +import { LoadingOutlined } from '@ant-design/icons' +import { Card, Flex, Image, Spin, Typography } from 'antd' import Meta from 'antd/es/card/Meta' import { useState } from 'react' import TypeTag from '../../../components/TypeTag' @@ -11,14 +12,16 @@ interface Props { img: string animatedImg: string types: PokemonTypes[] + isLoading: boolean } -const PokeCard = ({ id, name, img, animatedImg, types }: Props) => { +const PokeCard = ({ id, name, img, animatedImg, types, isLoading }: Props) => { const [isHovering, setHovering] = useState(false) return ( setHovering(true)} onMouseOut={() => setHovering(false)} @@ -59,21 +62,19 @@ interface PokeImageProps { const PokeImage = ({ name, img, animatedImg, isHovering }: PokeImageProps) => { return (
- {!isHovering && ( - {`${name} - )} - - {isHovering && ( - {`${name} - )} + {`${name} + } size="large" /> + + } + className={ + isHovering ? 'pokecard__image--animated' : 'pokecard__image--static' + } + />
) } diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index bd6e424b8..9ee509a06 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -5,6 +5,7 @@ import PokeCard from './PokeCard' const PokeGrid = () => { const allPokemonQueries = useGetAllPokemon() + const isLoading = allPokemonQueries.some(query => query.isLoading) const pokemonList = allPokemonQueries .map(query => query.data) .filter(pokemon => pokemon !== undefined) @@ -34,6 +35,7 @@ const PokeGrid = () => { types={ pokemon.types.map(type => type.type.name) as PokemonTypes[] } + isLoading={isLoading} /> ) diff --git a/src/styles/pokecard.css b/src/styles/pokecard.css index 7c7713bdf..3f91f119f 100644 --- a/src/styles/pokecard.css +++ b/src/styles/pokecard.css @@ -4,6 +4,13 @@ display: flex; flex-direction: column; justify-content: space-between; + + & .ant-image { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } } .pokecard__image--container { @@ -14,15 +21,15 @@ align-items: center; overflow: hidden; height: 100%; - min-height: 260px; + height: 260px; & img { image-rendering: pixelated; } } -img.pokecard__image--animated { - height: 90%; +.pokecard__image--animated { + width: 75% !important; animation: growAnimation 0.3s forwards; } @@ -35,8 +42,8 @@ img.pokecard__image--animated { } } -img.pokecard__image--static { - height: 120%; +.pokecard__image--static { + width: 100% !important; animation: shrinkAnimation 0.3s forwards; } From f6fd442d975cfde42d7503a9bf8a8cb647aa36c9 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 12:52:26 -0300 Subject: [PATCH 15/60] feat: Implement pagination --- src/api/usePokemon.ts | 12 ++-- src/pages/home/components/PokeGrid.tsx | 80 +++++++++++++++----------- 2 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/api/usePokemon.ts b/src/api/usePokemon.ts index 170661ee7..68cbccb1e 100644 --- a/src/api/usePokemon.ts +++ b/src/api/usePokemon.ts @@ -8,12 +8,14 @@ export const useGetPokemon = (pokeId: number) => { }) } -export const useGetAllPokemon = () => { - const limit = 18 +export const useGetAllPokemon = ( + currentPage: number = 1, + pageSize: number = 18 +) => { return useQueries({ - queries: Array.from({ length: limit }, (_, i) => ({ - queryKey: [i + 1], - queryFn: () => getPokemon(i + 1) + queries: Array.from({ length: pageSize }, (_, i) => ({ + queryKey: [currentPage, i + 1], + queryFn: () => getPokemon(i + 1 + (currentPage - 1) * pageSize) })) }) } diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index 9ee509a06..6a2bd3418 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -1,46 +1,62 @@ -import { Col, Row } from 'antd' +import { Col, Pagination, Row } from 'antd' +import { useState } from 'react' import { useGetAllPokemon } from '../../../api/usePokemon' import type { PokemonTypes } from '../../../types/pokemonTypes' import PokeCard from './PokeCard' const PokeGrid = () => { - const allPokemonQueries = useGetAllPokemon() - const isLoading = allPokemonQueries.some(query => query.isLoading) + const [currentPage, setCurrentPage] = useState(1) + + const allPokemonQueries = useGetAllPokemon(currentPage) const pokemonList = allPokemonQueries .map(query => query.data) .filter(pokemon => pokemon !== undefined) + const isLoading = allPokemonQueries.some(query => query.isLoading) + return ( - - {pokemonList.map(pokemon => { - const blackWhiteVer = - pokemon.sprites.versions['generation-v']['black-white'] - const hasAnimatedSprite = blackWhiteVer.animated.front_default !== null + <> + + {pokemonList.map(pokemon => { + const blackWhiteVer = + pokemon.sprites.versions['generation-v']['black-white'] + const hasAnimatedSprite = + blackWhiteVer.animated.front_default !== null + + return ( + + type.type.name) as PokemonTypes[] + } + isLoading={isLoading} + /> + + ) + })} + - return ( - - type.type.name) as PokemonTypes[] - } - isLoading={isLoading} - /> - - ) - })} - + setCurrentPage(page)} + /> + ) } From bbb8da798fe8facbe585b084e54a61e8c8f81abc Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 13:04:26 -0300 Subject: [PATCH 16/60] feat: Handle error states in PokeGrid --- src/pages/home/components/PokeGrid.tsx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index 6a2bd3418..0eae8b6ef 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -1,4 +1,4 @@ -import { Col, Pagination, Row } from 'antd' +import { Col, Empty, Flex, Pagination, Row, Typography } from 'antd' import { useState } from 'react' import { useGetAllPokemon } from '../../../api/usePokemon' import type { PokemonTypes } from '../../../types/pokemonTypes' @@ -13,6 +13,26 @@ const PokeGrid = () => { .filter(pokemon => pokemon !== undefined) const isLoading = allPokemonQueries.some(query => query.isLoading) + const isError = allPokemonQueries.some(query => query.isError) + + if (isError) { + return ( + + + Woops! Something went wrong while loading Pokémon data + + } + /> + + ) + } return ( <> From 86bc7ef9b17a2eeb634e3e8ef3f4d500a2edfae4 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Thu, 4 Sep 2025 17:09:13 -0300 Subject: [PATCH 17/60] =?UTF-8?q?feat:=20Add=20search=20by=20Pok=C3=A9mon?= =?UTF-8?q?=20name=20and=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/getPokemon.ts | 4 +- src/api/usePokemon.ts | 2 +- src/pages/home/Home.tsx | 59 +++++++++++++++++++++++-- src/pages/home/components/Header.tsx | 21 --------- src/pages/home/components/PokeGrid.tsx | 51 ++++++++++++--------- src/pages/home/components/Searchbar.tsx | 19 ++++++++ 6 files changed, 108 insertions(+), 48 deletions(-) delete mode 100644 src/pages/home/components/Header.tsx create mode 100644 src/pages/home/components/Searchbar.tsx diff --git a/src/api/getPokemon.ts b/src/api/getPokemon.ts index 9df2fe564..a2ae0a5d0 100644 --- a/src/api/getPokemon.ts +++ b/src/api/getPokemon.ts @@ -1,7 +1,9 @@ import axios from 'axios' import type { PokemonProps } from '../types/pokemonTypes' -export const getPokemon = async (pokeId: number): Promise => { +export const getPokemon = async ( + pokeId: number | string +): Promise => { try { const res = await axios.get(`https://pokeapi.co/api/v2/pokemon/${pokeId}`) return res.data diff --git a/src/api/usePokemon.ts b/src/api/usePokemon.ts index 68cbccb1e..be6c90e5b 100644 --- a/src/api/usePokemon.ts +++ b/src/api/usePokemon.ts @@ -1,7 +1,7 @@ import { useQueries, useQuery } from '@tanstack/react-query' import { getPokemon } from './getPokemon' -export const useGetPokemon = (pokeId: number) => { +export const useGetPokemon = (pokeId: number | string) => { return useQuery({ queryKey: [pokeId], queryFn: () => getPokemon(pokeId) diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx index cf60b5159..41a69e8e8 100644 --- a/src/pages/home/Home.tsx +++ b/src/pages/home/Home.tsx @@ -1,17 +1,68 @@ -import { theme } from 'antd' +import { Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' -import HomeHeader from './components/Header' +import { useState } from 'react' +import { useGetAllPokemon, useGetPokemon } from '../../api/usePokemon' +import Logo from '../../assets/Logo' +import type { PokemonProps } from '../../types/pokemonTypes' import PokeGrid from './components/PokeGrid' +import Searchbar from './components/Searchbar' const Home = () => { const { token: { colorBgContainer } } = theme.useToken() + const [currentPage, setCurrentPage] = useState(1) + const [searchName, setSearchName] = useState('') + + const isSearching = searchName.trim() !== '' + const pageSize = 18 + + const searchQuery = useGetPokemon(searchName.toLowerCase()) + const allPokemonQueries = useGetAllPokemon(currentPage, pageSize) + + const pokemonList: PokemonProps[] = [] + + if (isSearching && searchQuery.data) { + pokemonList.push(searchQuery.data) + } else { + pokemonList.push( + ...allPokemonQueries + .map(query => query.data) + .filter(pokemon => pokemon !== undefined) + ) + } + + const isLoading = isSearching + ? searchQuery.isFetching + : allPokemonQueries.some(query => query.isFetching) + + const isError = isSearching + ? searchQuery.isError + : allPokemonQueries.some(query => query.isError) + return ( - - + {/* Header */} + + + + + + + + + + {/* List with all Pokémon */} + ) } diff --git a/src/pages/home/components/Header.tsx b/src/pages/home/components/Header.tsx deleted file mode 100644 index 3924e815b..000000000 --- a/src/pages/home/components/Header.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { SearchOutlined } from '@ant-design/icons' -import { Col, Flex, Input, Row } from 'antd' -import Logo from '../../../assets/Logo' - -const HomeHeader = () => { - return ( - - - - - } - /> - - - - ) -} - -export default HomeHeader diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index 0eae8b6ef..f8c08cd9e 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -1,20 +1,26 @@ import { Col, Empty, Flex, Pagination, Row, Typography } from 'antd' -import { useState } from 'react' -import { useGetAllPokemon } from '../../../api/usePokemon' -import type { PokemonTypes } from '../../../types/pokemonTypes' +import type { PokemonProps, PokemonTypes } from '../../../types/pokemonTypes' import PokeCard from './PokeCard' -const PokeGrid = () => { - const [currentPage, setCurrentPage] = useState(1) - - const allPokemonQueries = useGetAllPokemon(currentPage) - const pokemonList = allPokemonQueries - .map(query => query.data) - .filter(pokemon => pokemon !== undefined) - - const isLoading = allPokemonQueries.some(query => query.isLoading) - const isError = allPokemonQueries.some(query => query.isError) +interface Props { + pokemonCount: number + pokemonList: PokemonProps[] + isSearching: boolean + isLoading: boolean + isError: boolean + currentPage: number + setCurrentPage: React.Dispatch> +} +const PokeGrid = ({ + pokemonCount, + pokemonList, + isSearching, + isLoading, + isError, + currentPage, + setCurrentPage +}: Props) => { if (isError) { return ( { })}
- setCurrentPage(page)} - /> + {!isSearching && ( + setCurrentPage(page)} + /> + )} ) } diff --git a/src/pages/home/components/Searchbar.tsx b/src/pages/home/components/Searchbar.tsx new file mode 100644 index 000000000..d6aadc260 --- /dev/null +++ b/src/pages/home/components/Searchbar.tsx @@ -0,0 +1,19 @@ +import { Input } from 'antd' + +interface Props { + isLoading: boolean + setSearchName: React.Dispatch> +} + +const Searchbar = ({ isLoading, setSearchName }: Props) => { + return ( + setSearchName(name)} + /> + ) +} + +export default Searchbar From 65754587fde90c8d6ef0bbe7f34dcef636d8a400 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 08:54:15 -0300 Subject: [PATCH 18/60] feat: Improove loading and error handlers when searching --- src/pages/home/Home.tsx | 2 +- src/pages/home/components/PokeGrid.tsx | 94 +++++++++++++++++++++----- 2 files changed, 79 insertions(+), 17 deletions(-) diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx index 41a69e8e8..2459ae163 100644 --- a/src/pages/home/Home.tsx +++ b/src/pages/home/Home.tsx @@ -18,8 +18,8 @@ const Home = () => { const isSearching = searchName.trim() !== '' const pageSize = 18 - const searchQuery = useGetPokemon(searchName.toLowerCase()) const allPokemonQueries = useGetAllPokemon(currentPage, pageSize) + const searchQuery = useGetPokemon(searchName.toLowerCase()) const pokemonList: PokemonProps[] = [] diff --git a/src/pages/home/components/PokeGrid.tsx b/src/pages/home/components/PokeGrid.tsx index f8c08cd9e..1d5ce1950 100644 --- a/src/pages/home/components/PokeGrid.tsx +++ b/src/pages/home/components/PokeGrid.tsx @@ -1,4 +1,4 @@ -import { Col, Empty, Flex, Pagination, Row, Typography } from 'antd' +import { Col, Empty, Flex, Pagination, Row, Skeleton, Typography } from 'antd' import type { PokemonProps, PokemonTypes } from '../../../types/pokemonTypes' import PokeCard from './PokeCard' @@ -21,22 +21,13 @@ const PokeGrid = ({ currentPage, setCurrentPage }: Props) => { - if (isError) { + if (isLoading || isError) { return ( - - - Woops! Something went wrong while loading Pokémon data - - } - /> - + ) } @@ -89,4 +80,75 @@ const PokeGrid = ({ ) } +const StateHandlers = ({ + isError, + isLoading, + isSearching +}: { + isError: boolean + isLoading: boolean + isSearching: boolean +}) => { + if (isSearching && isError) { + return ( + + + + No Pokémon appeared :( + + + Try searching for a different name or ID. + + + } + /> + + ) + } + + if (isError) { + return ( + + + + Woops! Pikachu used Thunderbolt and it failed! + + + Something went wrong while loading Pokémon data, try again in a + moment. + + + } + /> + + ) + } + + if (isLoading) { + return ( + + {Array.from({ length: 12 }).map((_, index) => ( + + + + ))} + + ) + } +} + export default PokeGrid From 25fcb2a5ac3e864ec1e9c1972d08ad1f6f482dab Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 09:19:57 -0300 Subject: [PATCH 19/60] feat: Add image fallback in PokeCard --- src/pages/home/components/PokeCard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx index f6c87356f..cf40554cb 100644 --- a/src/pages/home/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -66,6 +66,7 @@ const PokeImage = ({ name, img, animatedImg, isHovering }: PokeImageProps) => { src={isHovering ? animatedImg : img} alt={`${name} image`} preview={false} + fallback="https://placehold.co/260.png?text=Image+not+found" placeholder={ } size="large" /> From 52715293e115f4b92ff0126ac5e11b2756ecfcca Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 09:27:36 -0300 Subject: [PATCH 20/60] =?UTF-8?q?fix:=20Capitalize=20Pok=C3=A9mon=20names?= =?UTF-8?q?=20in=20PokeCard=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/home/components/PokeCard.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pages/home/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx index cf40554cb..0c78315b3 100644 --- a/src/pages/home/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -35,7 +35,16 @@ const PokeCard = ({ id, name, img, animatedImg, types, isLoading }: Props) => { } > {name}} + title={ + + {name.split('-').join(' ')} + + } description={ {types.map(type => ( From c6059108f17f279fb23a95caf6b15cfdcbb9bfb5 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 14:12:41 -0300 Subject: [PATCH 21/60] feat: Integrate react-router for navigation --- package-lock.json | 40 +++++++++++++++++++++++++++++++++++++++- package.json | 3 ++- src/App.tsx | 32 -------------------------------- src/main.tsx | 38 +++++++++++++++++++++++++++++++++++--- 4 files changed, 76 insertions(+), 37 deletions(-) delete mode 100644 src/App.tsx diff --git a/package-lock.json b/package-lock.json index ad856e17f..1e0e01851 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "antd": "^5.27.2", "axios": "^1.11.0", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.33.0", @@ -2372,6 +2373,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -4216,6 +4226,28 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", + "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": 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", @@ -4333,6 +4365,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index ce4817907..bf6c9b93d 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "antd": "^5.27.2", "axios": "^1.11.0", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.33.0", diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 8cbd6c803..000000000 --- a/src/App.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { StyleProvider } from '@ant-design/cssinjs' -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { ConfigProvider, Layout } from 'antd' -import Home from './pages/home/Home' - -const queryClient = new QueryClient() - -function App() { - return ( - - - - - - - - - - ) -} - -export default App diff --git a/src/main.tsx b/src/main.tsx index bef5202a3..ccfbda6fc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,42 @@ +import { StyleProvider } from '@ant-design/cssinjs' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { ConfigProvider, Layout } from 'antd' import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' +import { createBrowserRouter } from 'react-router' +import { RouterProvider } from 'react-router/dom' + import './index.css' -import App from './App.tsx' +import Home from './pages/home/Home' + +const queryClient = new QueryClient() +const router = createBrowserRouter([ + { + path: '/', + element: + } +]) createRoot(document.getElementById('root')!).render( - - , + + + + + + + + + + ) From a61f8c107790f570c102b6ff843f9d3c09faf6a3 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 14:14:13 -0300 Subject: [PATCH 22/60] feat: Create PokemonDetail page --- src/main.tsx | 7 ++++++- src/pages/home/{Home.tsx => Index.tsx} | 0 src/pages/pokemon-detail/Index.tsx | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) rename src/pages/home/{Home.tsx => Index.tsx} (100%) create mode 100644 src/pages/pokemon-detail/Index.tsx diff --git a/src/main.tsx b/src/main.tsx index ccfbda6fc..9a1f1694d 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -7,13 +7,18 @@ import { createBrowserRouter } from 'react-router' import { RouterProvider } from 'react-router/dom' import './index.css' -import Home from './pages/home/Home' +import Home from './pages/home/Index' +import PokemonDetail from './pages/pokemon-detail/Index' const queryClient = new QueryClient() const router = createBrowserRouter([ { path: '/', element: + }, + { + path: '/pokemon/:id', + element: } ]) diff --git a/src/pages/home/Home.tsx b/src/pages/home/Index.tsx similarity index 100% rename from src/pages/home/Home.tsx rename to src/pages/home/Index.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx new file mode 100644 index 000000000..d489b8a58 --- /dev/null +++ b/src/pages/pokemon-detail/Index.tsx @@ -0,0 +1,5 @@ +const PokemonDetail = () => { + return
PokemonDetail
+} + +export default PokemonDetail From 7e0542c3e02c6900a918345f6b620fa409f07d10 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Fri, 5 Sep 2025 15:39:25 -0300 Subject: [PATCH 23/60] feat: Create the PokeInfo component --- src/assets/Logo.tsx | 6 +- src/main.tsx | 2 +- src/pages/pokemon-detail/Index.tsx | 36 +++++++++- .../pokemon-detail/components/PokeInfos.tsx | 66 +++++++++++++++++++ 4 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 src/pages/pokemon-detail/components/PokeInfos.tsx diff --git a/src/assets/Logo.tsx b/src/assets/Logo.tsx index f51530dda..52d984e72 100644 --- a/src/assets/Logo.tsx +++ b/src/assets/Logo.tsx @@ -1,9 +1,9 @@ -const Logo = () => { +const Logo = ({ width, height }: { width?: number; height?: number }) => { return ( diff --git a/src/main.tsx b/src/main.tsx index 9a1f1694d..b1eb93292 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -31,7 +31,7 @@ createRoot(document.getElementById('root')!).render( cssVar: true, token: { colorPrimary: '#00D084', - colorSuccess: '#FF6900', + orange: '#FF6900', colorText: '#172121', colorBgContainer: '#FFFFFF' } diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index d489b8a58..a3ccb1339 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,5 +1,39 @@ +import { ArrowLeftOutlined } from '@ant-design/icons' +import { Button, Col, Divider, Flex, Row, theme } from 'antd' +import { Content } from 'antd/es/layout/layout' +import Logo from '../../assets/Logo' +import PokeInfos from './components/PokeInfos' + const PokemonDetail = () => { - return
PokemonDetail
+ const { + token: { colorBgContainer } + } = theme.useToken() + + return ( + + + + + + + + + + + + + {/* Content for the right column */} + + + ) } export default PokemonDetail diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx new file mode 100644 index 000000000..25b82791d --- /dev/null +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -0,0 +1,66 @@ +import { PlayCircleOutlined, StarOutlined } from '@ant-design/icons' +import { Button, Col, Flex, Image, Row, Typography } from 'antd' +import TypeTag from '../../../components/TypeTag' + +const PokeInfos = () => { + return ( + + {/* Image */} + + + bulbasaur image + + + + {/* Infos */} + + {/* Buttons */} + + + + + + {/* Details */} + +
+ #1 + + Bulbasaur + +
+ + + + + + + + BULBASAUR can be seen napping in bright sunlight. There is a seed on + its back. By soaking up the sun’s rays, the seed grows progressively + larger. + +
+ +
+ ) +} + +export default PokeInfos From 877ba41eb303040e46d3d141ea9a75b42e18bbe2 Mon Sep 17 00:00:00 2001 From: laerte-quinui Date: Sat, 6 Sep 2025 19:29:17 -0300 Subject: [PATCH 24/60] feat: Create the PokeStats component --- src/pages/pokemon-detail/Index.tsx | 15 ++++++++---- .../pokemon-detail/components/PokeInfos.tsx | 2 +- .../pokemon-detail/components/PokeStats.tsx | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 src/pages/pokemon-detail/components/PokeStats.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index a3ccb1339..5a5dd5dbd 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,12 +1,13 @@ import { ArrowLeftOutlined } from '@ant-design/icons' -import { Button, Col, Divider, Flex, Row, theme } from 'antd' +import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import Logo from '../../assets/Logo' import PokeInfos from './components/PokeInfos' +import PokeStats from './components/PokeStats' const PokemonDetail = () => { const { - token: { colorBgContainer } + token: { colorBgContainer, colorSplit } } = theme.useToken() return ( @@ -26,11 +27,15 @@ const PokemonDetail = () => { - + - - {/* Content for the right column */} + + +
) diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index 25b82791d..38ebbba5f 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -4,7 +4,7 @@ import TypeTag from '../../../components/TypeTag' const PokeInfos = () => { return ( - + {/* Image */} diff --git a/src/pages/pokemon-detail/components/PokeStats.tsx b/src/pages/pokemon-detail/components/PokeStats.tsx new file mode 100644 index 000000000..0ebe829cc --- /dev/null +++ b/src/pages/pokemon-detail/components/PokeStats.tsx @@ -0,0 +1,23 @@ +import { Col, Flex, Row, Statistic } from 'antd' + +const PokeStats = () => { + const measurements = [ + { title: 'Weight', value: 27.8, suffix: 'kg' }, + { title: 'Height', value: 153.3, suffix: 'cm' } + ] + return ( + + {/* Measurements */} + + + {measurements.map(measurement => ( + + ))} + + + + + ) +} + +export default PokeStats From e98c486684944474fd8064a7d252cb37bcbc41fc Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 17:43:43 -0300 Subject: [PATCH 25/60] feat: Add Recharts and create DonutChart component --- package-lock.json | 391 +++++++++++++++++- package.json | 3 +- src/components/DonutChart.tsx | 61 +++ .../pokemon-detail/components/PokeStats.tsx | 22 +- 4 files changed, 473 insertions(+), 4 deletions(-) create mode 100644 src/components/DonutChart.tsx diff --git a/package-lock.json b/package-lock.json index 1e0e01851..7c4659a22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "axios": "^1.11.0", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router": "^7.8.2" + "react-router": "^7.8.2", + "recharts": "^3.1.2" }, "devDependencies": { "@eslint/js": "^9.33.0", @@ -1347,6 +1348,32 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.9.0.tgz", + "integrity": "sha512-fSfQlSRu9Z5yBkvsNhYF2rPS8cGXn/TZVrlwN1948QyZ8xMZ0JvP50S2acZNaf+o63u6aEeMjipFyksjIcWrog==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "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 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz", @@ -1648,6 +1675,18 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@tanstack/query-core": { "version": "5.86.0", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.86.0.tgz", @@ -1719,6 +1758,69 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1737,7 +1839,7 @@ "version": "19.1.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1753,6 +1855,12 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.42.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", @@ -2321,6 +2429,15 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2412,6 +2529,127 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/dayjs": { "version": "1.11.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", @@ -2436,6 +2674,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2518,6 +2762,16 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.39.10", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.10.tgz", + "integrity": "sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -2761,6 +3015,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3097,6 +3357,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -3124,6 +3394,15 @@ "node": ">=0.8.19" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4216,6 +4495,29 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -4248,6 +4550,54 @@ } } }, + "node_modules/recharts": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.1.2.tgz", + "integrity": "sha512-vhNbYwaxNbk/IATK0Ki29k3qvTkGqwvCgyQAQ9MavvvBwjvKnMTswdbklJpcOAoMPN/qxF3Lyqob0zO+ZXkZ4g==", + "license": "MIT", + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "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==", + "license": "MIT" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -4451,6 +4801,12 @@ "node": ">=12.22" } }, + "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==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -4623,6 +4979,37 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/vite": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", diff --git a/package.json b/package.json index bf6c9b93d..f2a6c34c4 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "axios": "^1.11.0", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router": "^7.8.2" + "react-router": "^7.8.2", + "recharts": "^3.1.2" }, "devDependencies": { "@eslint/js": "^9.33.0", diff --git a/src/components/DonutChart.tsx b/src/components/DonutChart.tsx new file mode 100644 index 000000000..5468bc76c --- /dev/null +++ b/src/components/DonutChart.tsx @@ -0,0 +1,61 @@ +import { theme, Typography } from 'antd' +import { Cell, Label, Legend, Pie, PieChart } from 'recharts' + +interface Props { + data: { name: string; value: number } + color?: string + size?: number +} + +const DonutChart = ({ data, color, size }: Props) => { + const { + token: { colorPrimary, colorText } + } = theme.useToken() + + const formatedData = [ + { ...data, color: color ?? colorPrimary }, + { name: 'rest', value: 260 - data.value, color: '#C8D3D3' } + ] + /* The above value (260) is based on the max base stat that a Pokémon can have. + The stat is the HP of Blissey and Eternamax Eternatus, that are both 255. + */ + + return ( + + + {formatedData.map(entry => ( + + ))} + + ( + + {payload && payload[0]?.value} + + )} + /> + + ) +} + +export default DonutChart diff --git a/src/pages/pokemon-detail/components/PokeStats.tsx b/src/pages/pokemon-detail/components/PokeStats.tsx index 0ebe829cc..a7eef7abe 100644 --- a/src/pages/pokemon-detail/components/PokeStats.tsx +++ b/src/pages/pokemon-detail/components/PokeStats.tsx @@ -1,10 +1,20 @@ import { Col, Flex, Row, Statistic } from 'antd' +import DonutChart from '../../../components/DonutChart' const PokeStats = () => { const measurements = [ { title: 'Weight', value: 27.8, suffix: 'kg' }, { title: 'Height', value: 153.3, suffix: 'cm' } ] + const stats = [ + { name: 'Base Health', value: 45 }, + { name: 'Base Attack', value: 49 }, + { name: 'Base Defense', value: 49 }, + { name: 'Base Speed', value: 69 }, + { name: 'Special Attack', value: 65 }, + { name: 'Special Defense', value: 65 } + ] + return ( {/* Measurements */} @@ -15,7 +25,17 @@ const PokeStats = () => { ))} - + + {/* Stats */} + + + {stats.map(stat => ( + + + + ))} + + ) } From cb483bb97b17688b6b80f838ac1e1f40eb047162 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 18:12:55 -0300 Subject: [PATCH 26/60] refactor: Move typeColors to a separate utility file --- src/components/TypeTag.tsx | 22 +--------------------- src/utils/typeColors.ts | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 src/utils/typeColors.ts diff --git a/src/components/TypeTag.tsx b/src/components/TypeTag.tsx index 6d952d9d6..56a2f4e98 100644 --- a/src/components/TypeTag.tsx +++ b/src/components/TypeTag.tsx @@ -1,5 +1,6 @@ import { Tag } from 'antd' import type { PokemonTypes } from '../types/pokemonTypes' +import { typeColors } from '../utils/typeColors' interface TypeTagProps { type: PokemonTypes @@ -13,25 +14,4 @@ const TypeTag = ({ type }: TypeTagProps) => { ) } -const typeColors: Record = { - fire: 'red', - water: 'blue', - ice: 'cyan', - grass: 'green', - bug: 'green', - rock: 'orange', - ground: 'volcano', - steel: 'cyan', - electric: 'orange', - ghost: 'purple', - dark: 'purple', - poison: 'purple', - psychic: 'magenta', - fairy: 'magenta', - dragon: 'geekblue', - flying: 'geekblue', - fighting: 'volcano', - normal: 'default' -} - export default TypeTag diff --git a/src/utils/typeColors.ts b/src/utils/typeColors.ts new file mode 100644 index 000000000..c1cf99f46 --- /dev/null +++ b/src/utils/typeColors.ts @@ -0,0 +1,22 @@ +import type { PokemonTypes } from '../types/pokemonTypes' + +export const typeColors: Record = { + fire: 'red', + water: 'blue', + ice: 'cyan', + grass: 'green', + bug: 'green', + rock: 'orange', + ground: 'volcano', + steel: 'cyan', + electric: 'orange', + ghost: 'purple', + dark: 'purple', + poison: 'purple', + psychic: 'magenta', + fairy: 'magenta', + dragon: 'geekblue', + flying: 'geekblue', + fighting: 'volcano', + normal: 'default' +} From d114d63b612abdccacbf0b94e24c04715a005d08 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 18:13:11 -0300 Subject: [PATCH 27/60] feat: Create PokeEffectiveness component to display type effectiveness --- src/pages/pokemon-detail/Index.tsx | 8 ++++ .../components/PokeEffectiveness.tsx | 40 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/pages/pokemon-detail/components/PokeEffectiveness.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 5a5dd5dbd..dc11f9365 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -2,6 +2,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import Logo from '../../assets/Logo' +import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' @@ -37,6 +38,13 @@ const PokemonDetail = () => { + + + + + + + ) } diff --git a/src/pages/pokemon-detail/components/PokeEffectiveness.tsx b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx new file mode 100644 index 000000000..c7790c2c1 --- /dev/null +++ b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx @@ -0,0 +1,40 @@ +import { Badge, Col, Flex, Row, Typography } from 'antd' +import type { PokemonTypes } from '../../../types/pokemonTypes' +import { typeColors } from '../../../utils/typeColors' + +const PokeEffectiveness = () => { + const data: { [key: string]: PokemonTypes[] }[] = [ + { effective: ['water', 'ground', 'rock'] }, + { weak: ['fire', 'ice', 'poison', 'bug', 'flying'] } + ] + + return ( + + {data.map(d => ( + + + {d.effective ? 'Super-effective against' : 'Super-weak against'} + + + + {(d.effective ?? d.weak).map(type => ( + + {type} + + } + /> + ))} + + + ))} + + ) +} + +export default PokeEffectiveness From 3f9f981a100f4240d8907178a5e0b02b4080bcb6 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 18:27:39 -0300 Subject: [PATCH 28/60] feat: Create EvolutionChain component --- src/pages/pokemon-detail/Index.tsx | 7 ++- .../components/EvolutionChain.tsx | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/pages/pokemon-detail/components/EvolutionChain.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index dc11f9365..b56d9682e 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -2,6 +2,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import Logo from '../../assets/Logo' +import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' @@ -39,11 +40,13 @@ const PokemonDetail = () => { - + - + + + ) diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx new file mode 100644 index 000000000..4c12ac39d --- /dev/null +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -0,0 +1,57 @@ +import { ExportOutlined } from '@ant-design/icons' +import { Card, Col, Image, Row } from 'antd' +import Meta from 'antd/es/card/Meta' + +const EvolutionChain = () => { + const data = [ + { + id: 1, + name: 'Bulbasaur', + img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/1.png' + }, + { + id: 2, + name: 'Ivysaur', + img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/2.png' + }, + { + id: 3, + name: 'Venusaur', + img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/3.png' + } + ] + + return ( + + {data.map(pokemon => ( + + + } + extra={ + + + + } + styles={{ header: { border: 0, minHeight: 40 } }} + > + + + + ))} + + ) +} + +export default EvolutionChain From cd2f7010bf0b7092d223bb463ef3ffb760492437 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 18:57:23 -0300 Subject: [PATCH 29/60] feat: Enhance responsiveness of PokemonDetail page --- src/pages/pokemon-detail/Index.tsx | 17 +++++++---------- .../components/EvolutionChain.tsx | 2 +- .../components/PokeEffectiveness.tsx | 4 ++-- .../pokemon-detail/components/PokeInfos.tsx | 15 +++++++++++---- .../pokemon-detail/components/PokeStats.tsx | 8 ++++---- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index b56d9682e..558abb377 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -23,28 +23,25 @@ const PokemonDetail = () => { color="default" variant="outlined" icon={} - style={{ marginBottom: 40 }} + style={{ marginBottom: 40, marginTop: 24 }} > Go Back - - + + - + - - + + - + diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index 4c12ac39d..abf09944a 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -24,7 +24,7 @@ const EvolutionChain = () => { return ( {data.map(pokemon => ( - + { ] return ( - + {data.map(d => ( - + {d.effective ? 'Super-effective against' : 'Super-weak against'} diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index 38ebbba5f..395987b8f 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -4,23 +4,30 @@ import TypeTag from '../../../components/TypeTag' const PokeInfos = () => { return ( - + {/* Image */} - - + + bulbasaur image {/* Infos */} { ] return ( - + {/* Measurements */} - + {measurements.map(measurement => ( @@ -27,10 +27,10 @@ const PokeStats = () => { {/* Stats */} - + {stats.map(stat => ( - + ))} From bc90429e7a36fdb43fd58c3f39820a4d6316a74a Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 19:29:05 -0300 Subject: [PATCH 30/60] feat: Include stats, cries and other sprites in PokemonProps --- src/types/pokemonTypes.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/types/pokemonTypes.ts b/src/types/pokemonTypes.ts index 93358d678..f6a8149ca 100644 --- a/src/types/pokemonTypes.ts +++ b/src/types/pokemonTypes.ts @@ -3,18 +3,26 @@ export type PokemonProps = { name: string sprites: { front_default: string + front_shiny: string versions: { 'generation-v': { 'black-white': { front_default: string + front_shiny: string animated: { front_default: string + front_shiny: string } } } } } types: { type: { name: string } }[] + cries: { latest: string } + stats: { base_stat: number; stat: { name: string } }[] + species: { url: string } + weight: number + height: number } export type PokemonTypes = From 2de90475c0e9ed7ed1120ac4c8e40d7375738082 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 19:29:29 -0300 Subject: [PATCH 31/60] feat: Integrate Pokemon data into PokeInfos component --- src/pages/pokemon-detail/Index.tsx | 22 +++++++++++- .../pokemon-detail/components/PokeInfos.tsx | 34 ++++++++++++++----- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 558abb377..7f1df76e4 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,17 +1,37 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' +import { useGetPokemon } from '../../api/usePokemon' import Logo from '../../assets/Logo' +import type { PokemonTypes } from '../../types/pokemonTypes' import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' const PokemonDetail = () => { + const { data: pokeData, isLoading } = useGetPokemon(10) const { token: { colorBgContainer, colorSplit } } = theme.useToken() + if (isLoading || !pokeData) { + return
Loading...
+ } + + const pokeInfos = { + id: pokeData.id, + name: pokeData.name, + types: pokeData.types.map(type => type.type.name) as PokemonTypes[], + cry: pokeData.cries.latest, + sprite: + pokeData.sprites.versions['generation-v']['black-white'].animated + .front_default || pokeData.sprites.front_default, + shinySprite: + pokeData.sprites.versions['generation-v']['black-white'].animated + .front_shiny || pokeData.sprites.front_shiny + } + return ( @@ -30,7 +50,7 @@ const PokemonDetail = () => { - + diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index 395987b8f..e866bc05c 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -1,8 +1,22 @@ import { PlayCircleOutlined, StarOutlined } from '@ant-design/icons' import { Button, Col, Flex, Image, Row, Typography } from 'antd' import TypeTag from '../../../components/TypeTag' +import type { PokemonTypes } from '../../../types/pokemonTypes' + +interface Props { + data: { + id: number + name: string + types: PokemonTypes[] + cry: string + sprite: string + shinySprite: string + } +} + +const PokeInfos = ({ data }: Props) => { + const { id, name, types, cry, sprite, shinySprite } = data -const PokeInfos = () => { return ( {/* Image */} @@ -13,8 +27,8 @@ const PokeInfos = () => { style={{ minHeight: 260, overflow: 'hidden', borderRadius: 16 }} > bulbasaur image { {/* Details */}
- #1 - - Bulbasaur + #{id} + + {name}
- - + {types.map(type => ( + + ))} From 0ca724bbef98c7310ae77fd22fb792b2f7ec6162 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 19:38:28 -0300 Subject: [PATCH 32/60] =?UTF-8?q?feat:=20Add=20play=20Pok=C3=A9mon=20cry?= =?UTF-8?q?=20functionality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/pokemon-detail/Index.tsx | 2 +- .../pokemon-detail/components/PokeInfos.tsx | 11 +++++++-- src/utils/useAudio.ts | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/utils/useAudio.ts diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 7f1df76e4..bc8335653 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -10,7 +10,7 @@ import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' const PokemonDetail = () => { - const { data: pokeData, isLoading } = useGetPokemon(10) + const { data: pokeData, isLoading } = useGetPokemon(92) const { token: { colorBgContainer, colorSplit } } = theme.useToken() diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index e866bc05c..7dc4bff26 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -2,6 +2,7 @@ import { PlayCircleOutlined, StarOutlined } from '@ant-design/icons' import { Button, Col, Flex, Image, Row, Typography } from 'antd' import TypeTag from '../../../components/TypeTag' import type { PokemonTypes } from '../../../types/pokemonTypes' +import { useAudio } from '../../../utils/useAudio' interface Props { data: { @@ -16,6 +17,7 @@ interface Props { const PokeInfos = ({ data }: Props) => { const { id, name, types, cry, sprite, shinySprite } = data + const [playing, toggleAudio] = useAudio(cry) return ( @@ -51,8 +53,13 @@ const PokeInfos = ({ data }: Props) => { > {/* Buttons */} - - + {buttons.map(btn => ( + + ))} + {/* Shiny Modal */} + {`${name} { + setShinyVisible(value) + } + }} + /> {/* Details */} From 34d05a0cd7e9010a18f065b291e47b5be2aad2d5 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:02:25 -0300 Subject: [PATCH 34/60] feat: Implement species data fetching and typing --- src/api/getSpecies.ts | 13 +++++++++++++ src/api/useSpecies.ts | 9 +++++++++ src/types/speciesTypes.ts | 4 ++++ 3 files changed, 26 insertions(+) create mode 100644 src/api/getSpecies.ts create mode 100644 src/api/useSpecies.ts create mode 100644 src/types/speciesTypes.ts diff --git a/src/api/getSpecies.ts b/src/api/getSpecies.ts new file mode 100644 index 000000000..03594797b --- /dev/null +++ b/src/api/getSpecies.ts @@ -0,0 +1,13 @@ +import axios from 'axios' +import type { SpeciesProps } from '../types/speciesTypes' + +export const getSpecies = async (id: number): Promise => { + try { + const res = await axios.get( + `https://pokeapi.co/api/v2/pokemon-species/${id}` + ) + return res.data + } catch (error) { + throw new Error('Failed to fetch species. Error: ' + error) + } +} diff --git a/src/api/useSpecies.ts b/src/api/useSpecies.ts new file mode 100644 index 000000000..00dd1f173 --- /dev/null +++ b/src/api/useSpecies.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query' +import { getSpecies } from './getSpecies' + +export const useGetSpecies = (pokeId: number) => { + return useQuery({ + queryKey: ['species', pokeId], + queryFn: () => getSpecies(pokeId) + }) +} diff --git a/src/types/speciesTypes.ts b/src/types/speciesTypes.ts new file mode 100644 index 000000000..f20adf81e --- /dev/null +++ b/src/types/speciesTypes.ts @@ -0,0 +1,4 @@ +export interface SpeciesProps { + evolution_chain: { url: string } + flavor_text_entries: { flavor_text: string }[] +} From 6980363c10b680dc2a69c28ed252d38ad1920801 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:03:22 -0300 Subject: [PATCH 35/60] feat: Fetch and display species description in PokemonDetail --- src/pages/pokemon-detail/Index.tsx | 12 +++++++++--- src/pages/pokemon-detail/components/PokeInfos.tsx | 7 +++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index bc8335653..7b5a77dee 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -2,6 +2,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { useGetPokemon } from '../../api/usePokemon' +import { useGetSpecies } from '../../api/useSpecies' import Logo from '../../assets/Logo' import type { PokemonTypes } from '../../types/pokemonTypes' import EvolutionChain from './components/EvolutionChain' @@ -10,12 +11,14 @@ import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' const PokemonDetail = () => { - const { data: pokeData, isLoading } = useGetPokemon(92) + const { data: pokeData, isLoading } = useGetPokemon(150) + const { data: speciesData } = useGetSpecies(150) + const { token: { colorBgContainer, colorSplit } } = theme.useToken() - if (isLoading || !pokeData) { + if (isLoading || !pokeData || !speciesData) { return
Loading...
} @@ -29,7 +32,10 @@ const PokemonDetail = () => { .front_default || pokeData.sprites.front_default, shinySprite: pokeData.sprites.versions['generation-v']['black-white'].animated - .front_shiny || pokeData.sprites.front_shiny + .front_shiny || pokeData.sprites.front_shiny, + description: + speciesData?.flavor_text_entries[6]?.flavor_text.replace(/\f/g, ' ') || + speciesData?.flavor_text_entries[0]?.flavor_text.replace(/\f/g, ' ') } return ( diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index 429910ff4..cfee17b5c 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -13,11 +13,12 @@ interface Props { cry: string sprite: string shinySprite: string + description: string } } const PokeInfos = ({ data }: Props) => { - const { id, name, types, cry, sprite, shinySprite } = data + const { id, name, types, cry, sprite, shinySprite, description } = data const [playing, toggleAudio] = useAudio(cry) const [shinyVisible, setShinyVisible] = useState(false) @@ -114,9 +115,7 @@ const PokeInfos = ({ data }: Props) => {
- BULBASAUR can be seen napping in bright sunlight. There is a seed on - its back. By soaking up the sun’s rays, the seed grows progressively - larger. + {description}
From 954462bfb686c33798db14a6754c6477d9474bb6 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:15:10 -0300 Subject: [PATCH 36/60] feat: Add dynamic data to PokemonDetail --- src/pages/pokemon-detail/Index.tsx | 25 ++++++++++++-- .../pokemon-detail/components/PokeStats.tsx | 33 ++++++++++++++----- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 7b5a77dee..e8eb9820f 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -11,8 +11,8 @@ import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' const PokemonDetail = () => { - const { data: pokeData, isLoading } = useGetPokemon(150) - const { data: speciesData } = useGetSpecies(150) + const { data: pokeData, isLoading } = useGetPokemon(1) + const { data: speciesData } = useGetSpecies(1) const { token: { colorBgContainer, colorSplit } @@ -38,6 +38,25 @@ const PokemonDetail = () => { speciesData?.flavor_text_entries[0]?.flavor_text.replace(/\f/g, ' ') } + const pokeStats = { + height: pokeData.height / 10, // Convert to meter + weight: pokeData.weight / 10, // Convert to kg + stats: { + hp: pokeData.stats.find(s => s.stat.name === 'hp')?.base_stat ?? 0, + attack: + pokeData.stats.find(s => s.stat.name === 'attack')?.base_stat ?? 0, + defense: + pokeData.stats.find(s => s.stat.name === 'defense')?.base_stat ?? 0, + specialAttack: + pokeData.stats.find(s => s.stat.name === 'special-attack')?.base_stat ?? + 0, + specialDefense: + pokeData.stats.find(s => s.stat.name === 'special-defense') + ?.base_stat ?? 0, + speed: pokeData.stats.find(s => s.stat.name === 'speed')?.base_stat ?? 0 + } + } + return ( @@ -59,7 +78,7 @@ const PokemonDetail = () => { - +
diff --git a/src/pages/pokemon-detail/components/PokeStats.tsx b/src/pages/pokemon-detail/components/PokeStats.tsx index d1b593340..108f052b3 100644 --- a/src/pages/pokemon-detail/components/PokeStats.tsx +++ b/src/pages/pokemon-detail/components/PokeStats.tsx @@ -1,18 +1,33 @@ import { Col, Flex, Row, Statistic } from 'antd' import DonutChart from '../../../components/DonutChart' -const PokeStats = () => { +interface Props { + data: { + height: number + weight: number + stats: { + hp: number + attack: number + defense: number + specialAttack: number + specialDefense: number + speed: number + } + } +} + +const PokeStats = ({ data }: Props) => { const measurements = [ - { title: 'Weight', value: 27.8, suffix: 'kg' }, - { title: 'Height', value: 153.3, suffix: 'cm' } + { title: 'Weight', value: data.weight, suffix: 'kg' }, + { title: 'Height', value: data.height, suffix: 'm' } ] const stats = [ - { name: 'Base Health', value: 45 }, - { name: 'Base Attack', value: 49 }, - { name: 'Base Defense', value: 49 }, - { name: 'Base Speed', value: 69 }, - { name: 'Special Attack', value: 65 }, - { name: 'Special Defense', value: 65 } + { name: 'Base Health', value: data.stats.hp }, + { name: 'Base Attack', value: data.stats.attack }, + { name: 'Base Defense', value: data.stats.defense }, + { name: 'Base Speed', value: data.stats.speed }, + { name: 'Special Attack', value: data.stats.specialAttack }, + { name: 'Special Defense', value: data.stats.specialDefense } ] return ( From 777607f4f2a125cf1e3d1d9a467e4b2ecfd7695b Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:22:27 -0300 Subject: [PATCH 37/60] refactor: Create separate functions to format pokemon info and stats --- src/pages/pokemon-detail/Index.tsx | 39 +++------------------- src/pages/pokemon-detail/data/pokeInfo.ts | 23 +++++++++++++ src/pages/pokemon-detail/data/pokeStats.ts | 22 ++++++++++++ 3 files changed, 49 insertions(+), 35 deletions(-) create mode 100644 src/pages/pokemon-detail/data/pokeInfo.ts create mode 100644 src/pages/pokemon-detail/data/pokeStats.ts diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index e8eb9820f..4ace5ebf7 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -4,11 +4,12 @@ import { Content } from 'antd/es/layout/layout' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' import Logo from '../../assets/Logo' -import type { PokemonTypes } from '../../types/pokemonTypes' import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' +import { formatPokeInfo } from './data/pokeInfo' +import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { const { data: pokeData, isLoading } = useGetPokemon(1) @@ -22,40 +23,8 @@ const PokemonDetail = () => { return
Loading...
} - const pokeInfos = { - id: pokeData.id, - name: pokeData.name, - types: pokeData.types.map(type => type.type.name) as PokemonTypes[], - cry: pokeData.cries.latest, - sprite: - pokeData.sprites.versions['generation-v']['black-white'].animated - .front_default || pokeData.sprites.front_default, - shinySprite: - pokeData.sprites.versions['generation-v']['black-white'].animated - .front_shiny || pokeData.sprites.front_shiny, - description: - speciesData?.flavor_text_entries[6]?.flavor_text.replace(/\f/g, ' ') || - speciesData?.flavor_text_entries[0]?.flavor_text.replace(/\f/g, ' ') - } - - const pokeStats = { - height: pokeData.height / 10, // Convert to meter - weight: pokeData.weight / 10, // Convert to kg - stats: { - hp: pokeData.stats.find(s => s.stat.name === 'hp')?.base_stat ?? 0, - attack: - pokeData.stats.find(s => s.stat.name === 'attack')?.base_stat ?? 0, - defense: - pokeData.stats.find(s => s.stat.name === 'defense')?.base_stat ?? 0, - specialAttack: - pokeData.stats.find(s => s.stat.name === 'special-attack')?.base_stat ?? - 0, - specialDefense: - pokeData.stats.find(s => s.stat.name === 'special-defense') - ?.base_stat ?? 0, - speed: pokeData.stats.find(s => s.stat.name === 'speed')?.base_stat ?? 0 - } - } + const pokeInfos = formatPokeInfo(pokeData, speciesData) + const pokeStats = formatPokeStats(pokeData) return ( diff --git a/src/pages/pokemon-detail/data/pokeInfo.ts b/src/pages/pokemon-detail/data/pokeInfo.ts new file mode 100644 index 000000000..aac2ff458 --- /dev/null +++ b/src/pages/pokemon-detail/data/pokeInfo.ts @@ -0,0 +1,23 @@ +import type { PokemonProps, PokemonTypes } from '../../../types/pokemonTypes' +import type { SpeciesProps } from '../../../types/speciesTypes' + +export const formatPokeInfo = ( + pokeData: PokemonProps, + speciesData: SpeciesProps +) => { + return { + id: pokeData.id, + name: pokeData.name, + types: pokeData.types.map(type => type.type.name) as PokemonTypes[], + cry: pokeData.cries.latest, + sprite: + pokeData.sprites.versions['generation-v']['black-white'].animated + .front_default || pokeData.sprites.front_default, + shinySprite: + pokeData.sprites.versions['generation-v']['black-white'].animated + .front_shiny || pokeData.sprites.front_shiny, + description: + speciesData?.flavor_text_entries[6]?.flavor_text.replace(/\f/g, ' ') || + speciesData?.flavor_text_entries[0]?.flavor_text.replace(/\f/g, ' ') + } +} diff --git a/src/pages/pokemon-detail/data/pokeStats.ts b/src/pages/pokemon-detail/data/pokeStats.ts new file mode 100644 index 000000000..cfae46618 --- /dev/null +++ b/src/pages/pokemon-detail/data/pokeStats.ts @@ -0,0 +1,22 @@ +import type { PokemonProps } from '../../../types/pokemonTypes' + +export const formatPokeStats = (pokeData: PokemonProps) => { + return { + height: pokeData.height / 10, // Convert to meters + weight: pokeData.weight / 10, // Convert to kg + stats: { + hp: pokeData.stats.find(s => s.stat.name === 'hp')?.base_stat ?? 0, + attack: + pokeData.stats.find(s => s.stat.name === 'attack')?.base_stat ?? 0, + defense: + pokeData.stats.find(s => s.stat.name === 'defense')?.base_stat ?? 0, + specialAttack: + pokeData.stats.find(s => s.stat.name === 'special-attack')?.base_stat ?? + 0, + specialDefense: + pokeData.stats.find(s => s.stat.name === 'special-defense') + ?.base_stat ?? 0, + speed: pokeData.stats.find(s => s.stat.name === 'speed')?.base_stat ?? 0 + } + } +} From 0bf6ff403913e6979955efc430c4bf879fe8c378 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:30:15 -0300 Subject: [PATCH 38/60] =?UTF-8?q?feat:=20Implement=20Pok=C3=A9mon=20type?= =?UTF-8?q?=20data=20fetching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/getTypes.ts | 11 +++++++++++ src/api/useTypes.ts | 9 +++++++++ src/types/speciesTypes.ts | 2 +- src/types/typesTypes.ts | 6 ++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/api/getTypes.ts create mode 100644 src/api/useTypes.ts create mode 100644 src/types/typesTypes.ts diff --git a/src/api/getTypes.ts b/src/api/getTypes.ts new file mode 100644 index 000000000..06ad59d76 --- /dev/null +++ b/src/api/getTypes.ts @@ -0,0 +1,11 @@ +import axios from 'axios' +import type { TypeProps } from '../types/typesTypes' + +export const getTypes = async (id: number | string): Promise => { + try { + const res = await axios.get(`https://pokeapi.co/api/v2/type/${id}`) + return res.data + } catch (error) { + throw new Error('Failed to fetch types. Error: ' + error) + } +} diff --git a/src/api/useTypes.ts b/src/api/useTypes.ts new file mode 100644 index 000000000..33df4bc81 --- /dev/null +++ b/src/api/useTypes.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query' +import { getTypes } from './getTypes' + +export const useGetTypes = (id: number | string) => { + return useQuery({ + queryKey: ['types', id], + queryFn: () => getTypes(id) + }) +} diff --git a/src/types/speciesTypes.ts b/src/types/speciesTypes.ts index f20adf81e..06cdd31de 100644 --- a/src/types/speciesTypes.ts +++ b/src/types/speciesTypes.ts @@ -1,4 +1,4 @@ -export interface SpeciesProps { +export type SpeciesProps = { evolution_chain: { url: string } flavor_text_entries: { flavor_text: string }[] } diff --git a/src/types/typesTypes.ts b/src/types/typesTypes.ts new file mode 100644 index 000000000..5eb9cbe3a --- /dev/null +++ b/src/types/typesTypes.ts @@ -0,0 +1,6 @@ +export type TypeProps = { + damage_relations: { + double_damage_from: { name: string }[] + double_damage_to: { name: string }[] + } +} From c2b8c6265630a0821330eb23e00c710ffffe578c Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:43:42 -0300 Subject: [PATCH 39/60] feat: Add dynamic data to PokeEffectiveness component --- src/pages/pokemon-detail/Index.tsx | 8 +++++-- .../components/PokeEffectiveness.tsx | 22 +++++++++++-------- .../pokemon-detail/data/pokeEffectiveness.tsx | 15 +++++++++++++ 3 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 src/pages/pokemon-detail/data/pokeEffectiveness.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 4ace5ebf7..e4c91332c 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -3,28 +3,32 @@ import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' +import { useGetTypes } from '../../api/useTypes' import Logo from '../../assets/Logo' import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' +import { formatTypeEffectiveness } from './data/pokeEffectiveness' import { formatPokeInfo } from './data/pokeInfo' import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { const { data: pokeData, isLoading } = useGetPokemon(1) const { data: speciesData } = useGetSpecies(1) + const { data: typesData } = useGetTypes(pokeData?.types[0].type.name || '') const { token: { colorBgContainer, colorSplit } } = theme.useToken() - if (isLoading || !pokeData || !speciesData) { + if (isLoading || !pokeData || !speciesData || !typesData) { return
Loading...
} const pokeInfos = formatPokeInfo(pokeData, speciesData) const pokeStats = formatPokeStats(pokeData) + const pokeEffectiveness = formatTypeEffectiveness(typesData) return ( @@ -53,7 +57,7 @@ const PokemonDetail = () => { - + diff --git a/src/pages/pokemon-detail/components/PokeEffectiveness.tsx b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx index ec2f6535a..f04cd686a 100644 --- a/src/pages/pokemon-detail/components/PokeEffectiveness.tsx +++ b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx @@ -2,22 +2,26 @@ import { Badge, Col, Flex, Row, Typography } from 'antd' import type { PokemonTypes } from '../../../types/pokemonTypes' import { typeColors } from '../../../utils/typeColors' -const PokeEffectiveness = () => { - const data: { [key: string]: PokemonTypes[] }[] = [ - { effective: ['water', 'ground', 'rock'] }, - { weak: ['fire', 'ice', 'poison', 'bug', 'flying'] } - ] +interface Props { + data: { [key: string]: PokemonTypes[] } +} + +const PokeEffectiveness = ({ data }: Props) => { + const title = { + double_damage_to: 'Super-effective against', + double_damage_from: 'Super-weak against' + } return ( - {data.map(d => ( - + {Object.entries(data).map(([key, types]) => ( + - {d.effective ? 'Super-effective against' : 'Super-weak against'} + {title[key as keyof typeof title]} - {(d.effective ?? d.weak).map(type => ( + {types.map(type => ( { + return { + double_damage_to: typesData?.damage_relations.double_damage_to.map( + type => type.name as PokemonTypes + ), + double_damage_from: typesData?.damage_relations.double_damage_from.map( + type => type.name as PokemonTypes + ) + } +} From 4f761a60739ea00a8de45ee40c5fce947fdb0b02 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 20:50:23 -0300 Subject: [PATCH 40/60] feat: Implement evolution chain fetching and typing --- src/api/getEvolutionChain.ts | 13 +++++++++++++ src/api/useEvolutionChain.ts | 9 +++++++++ src/types/evolutionChainTypes.ts | 10 ++++++++++ 3 files changed, 32 insertions(+) create mode 100644 src/api/getEvolutionChain.ts create mode 100644 src/api/useEvolutionChain.ts create mode 100644 src/types/evolutionChainTypes.ts diff --git a/src/api/getEvolutionChain.ts b/src/api/getEvolutionChain.ts new file mode 100644 index 000000000..2ad325890 --- /dev/null +++ b/src/api/getEvolutionChain.ts @@ -0,0 +1,13 @@ +import axios from 'axios' +import type { EvolutionChainProps } from '../types/evolutionChainTypes' + +export const getEvolutionChain = async ( + url: string +): Promise => { + try { + const res = await axios.get(url) + return res.data + } catch (error) { + throw new Error('Failed to fetch evolution chain. Error: ' + error) + } +} diff --git a/src/api/useEvolutionChain.ts b/src/api/useEvolutionChain.ts new file mode 100644 index 000000000..62f5fd5e3 --- /dev/null +++ b/src/api/useEvolutionChain.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query' +import { getEvolutionChain } from './getEvolutionChain' + +export const useGetEvolutionChain = (url: string) => { + return useQuery({ + queryKey: ['evolutionChain', url], + queryFn: () => getEvolutionChain(url) + }) +} diff --git a/src/types/evolutionChainTypes.ts b/src/types/evolutionChainTypes.ts new file mode 100644 index 000000000..8e91cad68 --- /dev/null +++ b/src/types/evolutionChainTypes.ts @@ -0,0 +1,10 @@ +type EvolutionChain = { + species: { + name: string + } + evolves_to: EvolutionChain[] +} + +export type EvolutionChainProps = { + chain: EvolutionChain +} From cb9ca9f1a775f4eacf40ca1b728f4a4600581db0 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 21:42:24 -0300 Subject: [PATCH 41/60] feat: Add dynamic data to EvolutionChain component --- src/pages/pokemon-detail/Index.tsx | 20 +++- .../components/EvolutionChain.tsx | 98 ++++++++++--------- .../pokemon-detail/data/evolutionChain.ts | 19 ++++ ...Effectiveness.tsx => pokeEffectiveness.ts} | 0 src/types/evolutionChainTypes.ts | 3 +- 5 files changed, 87 insertions(+), 53 deletions(-) create mode 100644 src/pages/pokemon-detail/data/evolutionChain.ts rename src/pages/pokemon-detail/data/{pokeEffectiveness.tsx => pokeEffectiveness.ts} (100%) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index e4c91332c..5d4053dec 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,6 +1,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' +import { useGetEvolutionChain } from '../../api/useEvolutionChain' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' import { useGetTypes } from '../../api/useTypes' @@ -9,26 +10,37 @@ import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' +import { extractSpecies } from './data/evolutionChain' import { formatTypeEffectiveness } from './data/pokeEffectiveness' import { formatPokeInfo } from './data/pokeInfo' import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { - const { data: pokeData, isLoading } = useGetPokemon(1) - const { data: speciesData } = useGetSpecies(1) + const { data: pokeData, isLoading } = useGetPokemon(350) + const { data: speciesData } = useGetSpecies(350) const { data: typesData } = useGetTypes(pokeData?.types[0].type.name || '') + const { data: evolutionChainData } = useGetEvolutionChain( + speciesData?.evolution_chain.url || '' + ) const { token: { colorBgContainer, colorSplit } } = theme.useToken() - if (isLoading || !pokeData || !speciesData || !typesData) { + if ( + isLoading || + !pokeData || + !speciesData || + !typesData || + !evolutionChainData + ) { return
Loading...
} const pokeInfos = formatPokeInfo(pokeData, speciesData) const pokeStats = formatPokeStats(pokeData) const pokeEffectiveness = formatTypeEffectiveness(typesData) + const evolutionChain = extractSpecies(evolutionChainData.chain) return ( @@ -60,7 +72,7 @@ const PokemonDetail = () => { - +
diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index abf09944a..17cde1e07 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -1,56 +1,58 @@ import { ExportOutlined } from '@ant-design/icons' -import { Card, Col, Image, Row } from 'antd' +import { Card, Col, Image, Row, Typography } from 'antd' import Meta from 'antd/es/card/Meta' -const EvolutionChain = () => { - const data = [ - { - id: 1, - name: 'Bulbasaur', - img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/1.png' - }, - { - id: 2, - name: 'Ivysaur', - img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/2.png' - }, - { - id: 3, - name: 'Venusaur', - img: 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/versions/generation-v/black-white/3.png' - } - ] +interface Props { + data: { + id: string + name: string + }[] +} + +const EvolutionChain = ({ data }: Props) => { + const evolutionData = data.map(pokemon => ({ + id: pokemon.id, + name: pokemon.name + .split('-') + .join(' ') + .replace(/\b\w/g, char => char.toUpperCase()), + img: `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemon.id}.png` + })) return ( - - {data.map(pokemon => ( - - - } - extra={ - - - - } - styles={{ header: { border: 0, minHeight: 40 } }} - > - - - - ))} - + <> + Evolution Chain + + + {evolutionData.map(pokemon => ( + + + } + extra={ + + + + } + styles={{ header: { border: 0, minHeight: 40 } }} + > + + + + ))} + + ) } diff --git a/src/pages/pokemon-detail/data/evolutionChain.ts b/src/pages/pokemon-detail/data/evolutionChain.ts new file mode 100644 index 000000000..874eb6ecc --- /dev/null +++ b/src/pages/pokemon-detail/data/evolutionChain.ts @@ -0,0 +1,19 @@ +import type { EvolutionChain } from '../../../types/evolutionChainTypes' + +export const extractSpecies = ( + chainNode: EvolutionChain, + acc: { name: string; id: string }[] = [] +) => { + if (!chainNode) return acc + acc.push({ + name: chainNode.species.name, + id: chainNode.species.url.split('/')[6] + }) + + if (chainNode.evolves_to && chainNode.evolves_to.length > 0) + chainNode.evolves_to.forEach((evolution: EvolutionChain) => + extractSpecies(evolution, acc) + ) + + return acc +} diff --git a/src/pages/pokemon-detail/data/pokeEffectiveness.tsx b/src/pages/pokemon-detail/data/pokeEffectiveness.ts similarity index 100% rename from src/pages/pokemon-detail/data/pokeEffectiveness.tsx rename to src/pages/pokemon-detail/data/pokeEffectiveness.ts diff --git a/src/types/evolutionChainTypes.ts b/src/types/evolutionChainTypes.ts index 8e91cad68..16942e6aa 100644 --- a/src/types/evolutionChainTypes.ts +++ b/src/types/evolutionChainTypes.ts @@ -1,5 +1,6 @@ -type EvolutionChain = { +export type EvolutionChain = { species: { + url: string name: string } evolves_to: EvolutionChain[] From 1f58c1e8c9905e062b20c2806072ded70ba1f1a5 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 21:46:20 -0300 Subject: [PATCH 42/60] refactor: Update flavor_text_entries type to include language information --- src/pages/pokemon-detail/data/pokeInfo.ts | 5 +++-- src/types/speciesTypes.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/pokemon-detail/data/pokeInfo.ts b/src/pages/pokemon-detail/data/pokeInfo.ts index aac2ff458..1d28d757d 100644 --- a/src/pages/pokemon-detail/data/pokeInfo.ts +++ b/src/pages/pokemon-detail/data/pokeInfo.ts @@ -17,7 +17,8 @@ export const formatPokeInfo = ( pokeData.sprites.versions['generation-v']['black-white'].animated .front_shiny || pokeData.sprites.front_shiny, description: - speciesData?.flavor_text_entries[6]?.flavor_text.replace(/\f/g, ' ') || - speciesData?.flavor_text_entries[0]?.flavor_text.replace(/\f/g, ' ') + speciesData?.flavor_text_entries + .find(entry => entry.language.name === 'en') + ?.flavor_text.replace(/\f/g, ' ') || '' } } diff --git a/src/types/speciesTypes.ts b/src/types/speciesTypes.ts index 06cdd31de..031d53568 100644 --- a/src/types/speciesTypes.ts +++ b/src/types/speciesTypes.ts @@ -1,4 +1,4 @@ export type SpeciesProps = { evolution_chain: { url: string } - flavor_text_entries: { flavor_text: string }[] + flavor_text_entries: { flavor_text: string; language: { name: string } }[] } From 2e7cba1526ebdaecd526e46f591d7e7fdbb8ec0f Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Sun, 7 Sep 2025 23:24:47 -0300 Subject: [PATCH 43/60] feat: Implement react-router for navigation between home and pokemon details page --- src/pages/home/components/PokeCard.tsx | 77 +++++++++++++------------- src/pages/pokemon-detail/Index.tsx | 7 ++- 2 files changed, 45 insertions(+), 39 deletions(-) diff --git a/src/pages/home/components/PokeCard.tsx b/src/pages/home/components/PokeCard.tsx index 0c78315b3..2df43c21c 100644 --- a/src/pages/home/components/PokeCard.tsx +++ b/src/pages/home/components/PokeCard.tsx @@ -2,6 +2,7 @@ import { LoadingOutlined } from '@ant-design/icons' import { Card, Flex, Image, Spin, Typography } from 'antd' import Meta from 'antd/es/card/Meta' import { useState } from 'react' +import { Link } from 'react-router' import TypeTag from '../../../components/TypeTag' import '../../../styles/pokecard.css' import type { PokemonTypes } from '../../../types/pokemonTypes' @@ -19,45 +20,47 @@ const PokeCard = ({ id, name, img, animatedImg, types, isLoading }: Props) => { const [isHovering, setHovering] = useState(false) return ( - setHovering(true)} - onMouseOut={() => setHovering(false)} - cover={ - - } - > - - {name.split('-').join(' ')} - + + setHovering(true)} + onMouseOut={() => setHovering(false)} + cover={ + } - description={ - - {types.map(type => ( - - ))} + > + + {name.split('-').join(' ')} + + } + description={ + + {types.map(type => ( + + ))} - - #{id} - - - } - /> - + + #{id} + +
+ } + /> +
+ ) } diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 5d4053dec..ffe427627 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,6 +1,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' +import { useParams } from 'react-router' import { useGetEvolutionChain } from '../../api/useEvolutionChain' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' @@ -16,8 +17,10 @@ import { formatPokeInfo } from './data/pokeInfo' import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { - const { data: pokeData, isLoading } = useGetPokemon(350) - const { data: speciesData } = useGetSpecies(350) + const params = useParams() + + const { data: pokeData, isLoading } = useGetPokemon(Number(params.id)) + const { data: speciesData } = useGetSpecies(Number(params.id)) const { data: typesData } = useGetTypes(pokeData?.types[0].type.name || '') const { data: evolutionChainData } = useGetEvolutionChain( speciesData?.evolution_chain.url || '' From 252c7d14573f87f811894c5e6b43712e8efcd29c Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 07:25:56 -0300 Subject: [PATCH 44/60] feat: Add navigation in evolution chain card --- .../components/EvolutionChain.tsx | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index 17cde1e07..ee69b7842 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -1,6 +1,7 @@ import { ExportOutlined } from '@ant-design/icons' import { Card, Col, Image, Row, Typography } from 'antd' import Meta from 'antd/es/card/Meta' +import { Link } from 'react-router' interface Props { data: { @@ -26,29 +27,35 @@ const EvolutionChain = ({ data }: Props) => { {evolutionData.map(pokemon => ( - - } - extra={ - - - - } - styles={{ header: { border: 0, minHeight: 40 } }} + - - + + } + extra={ + + + + } + styles={{ header: { border: 0, minHeight: 40 } }} + > + + + ))} From 77381f06e073d9003fed3a6805265441d4077ca3 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 07:31:12 -0300 Subject: [PATCH 45/60] feat: Add navigation to the Go back button --- src/pages/pokemon-detail/Index.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index ffe427627..68b517099 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,7 +1,7 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' -import { useParams } from 'react-router' +import { Link, useParams } from 'react-router' import { useGetEvolutionChain } from '../../api/useEvolutionChain' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' @@ -51,15 +51,17 @@ const PokemonDetail = () => { - + + + From 5fde6d525bf5c93fb8b3d2e363095966275757a6 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 07:32:41 -0300 Subject: [PATCH 46/60] feat: Add navigation to the Logo --- src/pages/pokemon-detail/Index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 68b517099..0d97bc72a 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -48,7 +48,9 @@ const PokemonDetail = () => { return ( - + + + From 5587d3327f9916ff953ef21ce97b7d9d88a8b79a Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 08:18:06 -0300 Subject: [PATCH 47/60] =?UTF-8?q?feat:=20Enhance=20loading=20states=20for?= =?UTF-8?q?=20Pok=C3=A9mon=20details?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/pokemon-detail/Index.tsx | 60 +++++++++++++++---- .../components/EvolutionChain.tsx | 19 +++++- .../components/PokeEffectiveness.tsx | 24 +++++++- .../pokemon-detail/components/PokeInfos.tsx | 46 ++++++++++++-- .../pokemon-detail/components/PokeStats.tsx | 35 ++++++++++- 5 files changed, 161 insertions(+), 23 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 0d97bc72a..fad513184 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,5 +1,5 @@ -import { ArrowLeftOutlined } from '@ant-design/icons' -import { Button, Col, Flex, Row, theme } from 'antd' +import { ArrowLeftOutlined, LoadingOutlined } from '@ant-design/icons' +import { Button, Col, Flex, Row, Spin, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { Link, useParams } from 'react-router' import { useGetEvolutionChain } from '../../api/useEvolutionChain' @@ -19,12 +19,30 @@ import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { const params = useParams() - const { data: pokeData, isLoading } = useGetPokemon(Number(params.id)) - const { data: speciesData } = useGetSpecies(Number(params.id)) - const { data: typesData } = useGetTypes(pokeData?.types[0].type.name || '') - const { data: evolutionChainData } = useGetEvolutionChain( - speciesData?.evolution_chain.url || '' - ) + const { + data: pokeData, + isFetching: pokeLoading, + isError: pokeError + } = useGetPokemon(Number(params.id)) + const { + data: speciesData, + isFetching: speciesLoading, + isError: speciesError + } = useGetSpecies(Number(params.id)) + const { + data: typesData, + isFetching: typesLoading, + isError: typesError + } = useGetTypes(pokeData?.types[0].type.name || '') + const { + data: evolutionChainData, + isFetching: evolutionChainLoading, + isError: evolutionChainError + } = useGetEvolutionChain(speciesData?.evolution_chain.url || '') + + const isLoading = + pokeLoading || speciesLoading || typesLoading || evolutionChainLoading + const isError = pokeError || speciesError || typesError || evolutionChainError const { token: { colorBgContainer, colorSplit } @@ -37,7 +55,14 @@ const PokemonDetail = () => { !typesData || !evolutionChainData ) { - return
Loading...
+ return ( + + } + /> + + ) } const pokeInfos = formatPokeInfo(pokeData, speciesData) @@ -67,19 +92,28 @@ const PokemonDetail = () => { - + - + - + - +
diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index ee69b7842..18f8f683b 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -1,5 +1,5 @@ import { ExportOutlined } from '@ant-design/icons' -import { Card, Col, Image, Row, Typography } from 'antd' +import { Card, Col, Image, Row, Skeleton, Typography } from 'antd' import Meta from 'antd/es/card/Meta' import { Link } from 'react-router' @@ -8,9 +8,10 @@ interface Props { id: string name: string }[] + isLoading?: boolean } -const EvolutionChain = ({ data }: Props) => { +const EvolutionChain = ({ data, isLoading }: Props) => { const evolutionData = data.map(pokemon => ({ id: pokemon.id, name: pokemon.name @@ -20,6 +21,8 @@ const EvolutionChain = ({ data }: Props) => { img: `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemon.id}.png` })) + if (isLoading) return + return ( <> Evolution Chain @@ -63,4 +66,16 @@ const EvolutionChain = ({ data }: Props) => { ) } +const LoadingEvolutionChain = () => { + return ( + + {Array.from({ length: 3 }).map((_, index) => ( + + + + ))} + + ) +} + export default EvolutionChain diff --git a/src/pages/pokemon-detail/components/PokeEffectiveness.tsx b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx index f04cd686a..a8f0e5180 100644 --- a/src/pages/pokemon-detail/components/PokeEffectiveness.tsx +++ b/src/pages/pokemon-detail/components/PokeEffectiveness.tsx @@ -1,17 +1,20 @@ -import { Badge, Col, Flex, Row, Typography } from 'antd' +import { Badge, Col, Flex, Row, Skeleton, Typography } from 'antd' import type { PokemonTypes } from '../../../types/pokemonTypes' import { typeColors } from '../../../utils/typeColors' interface Props { data: { [key: string]: PokemonTypes[] } + isLoading?: boolean } -const PokeEffectiveness = ({ data }: Props) => { +const PokeEffectiveness = ({ data, isLoading }: Props) => { const title = { double_damage_to: 'Super-effective against', double_damage_from: 'Super-weak against' } + if (isLoading) return + return ( {Object.entries(data).map(([key, types]) => ( @@ -41,4 +44,21 @@ const PokeEffectiveness = ({ data }: Props) => { ) } +const LoadingPokeEffectiveness = () => { + return ( + + {Array.from({ length: 2 }).map((_, index) => ( + + + + {Array.from({ length: 2 }).map((_, index) => ( + + ))} + + + ))} + + ) +} + export default PokeEffectiveness diff --git a/src/pages/pokemon-detail/components/PokeInfos.tsx b/src/pages/pokemon-detail/components/PokeInfos.tsx index cfee17b5c..82319bf7a 100644 --- a/src/pages/pokemon-detail/components/PokeInfos.tsx +++ b/src/pages/pokemon-detail/components/PokeInfos.tsx @@ -1,5 +1,5 @@ import { PlayCircleOutlined, StarOutlined } from '@ant-design/icons' -import { Button, Col, Flex, Image, Row, Typography } from 'antd' +import { Button, Col, Flex, Image, Row, Skeleton, Typography } from 'antd' import { useState } from 'react' import TypeTag from '../../../components/TypeTag' import type { PokemonTypes } from '../../../types/pokemonTypes' @@ -15,9 +15,10 @@ interface Props { shinySprite: string description: string } + isLoading?: boolean } -const PokeInfos = ({ data }: Props) => { +const PokeInfos = ({ data, isLoading }: Props) => { const { id, name, types, cry, sprite, shinySprite, description } = data const [playing, toggleAudio] = useAudio(cry) const [shinyVisible, setShinyVisible] = useState(false) @@ -39,6 +40,8 @@ const PokeInfos = ({ data }: Props) => { } ] + if (isLoading) return + return ( {/* Image */} @@ -98,7 +101,7 @@ const PokeInfos = ({ data }: Props) => { {/* Details */} -
+ #{id} { > {name} -
+
{types.map(type => ( @@ -123,4 +126,39 @@ const PokeInfos = ({ data }: Props) => { ) } +const LoadingPokeInfos = () => { + return ( + + {/* Image */} + + + + + + + {/* Infos */} + + {/* Buttons */} + + + + + + {/* Details */} + + + + ) +} + export default PokeInfos diff --git a/src/pages/pokemon-detail/components/PokeStats.tsx b/src/pages/pokemon-detail/components/PokeStats.tsx index 108f052b3..7d6a593e7 100644 --- a/src/pages/pokemon-detail/components/PokeStats.tsx +++ b/src/pages/pokemon-detail/components/PokeStats.tsx @@ -1,4 +1,4 @@ -import { Col, Flex, Row, Statistic } from 'antd' +import { Col, Flex, Row, Skeleton, Statistic } from 'antd' import DonutChart from '../../../components/DonutChart' interface Props { @@ -14,9 +14,10 @@ interface Props { speed: number } } + isLoading?: boolean } -const PokeStats = ({ data }: Props) => { +const PokeStats = ({ data, isLoading }: Props) => { const measurements = [ { title: 'Weight', value: data.weight, suffix: 'kg' }, { title: 'Height', value: data.height, suffix: 'm' } @@ -30,6 +31,8 @@ const PokeStats = ({ data }: Props) => { { name: 'Special Defense', value: data.stats.specialDefense } ] + if (isLoading) return + return ( {/* Measurements */} @@ -55,4 +58,32 @@ const PokeStats = ({ data }: Props) => { ) } +const LoadingPokeStats = () => { + return ( + + + + {Array.from({ length: 2 }).map((_, index) => ( + + + + + ))} + + + + {/* Stats */} + + + {Array.from({ length: 6 }).map((_, index) => ( + + + + ))} + + + + ) +} + export default PokeStats From e48911ecf44fb7815ff2b73fb4035572e9c1987f Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 08:25:32 -0300 Subject: [PATCH 48/60] feat: Add NotFound page for handling 404 errors --- src/main.tsx | 5 +++++ src/pages/not-found/Index.tsx | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/pages/not-found/Index.tsx diff --git a/src/main.tsx b/src/main.tsx index b1eb93292..b64722fa8 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,6 +8,7 @@ import { RouterProvider } from 'react-router/dom' import './index.css' import Home from './pages/home/Index' +import NotFound from './pages/not-found/Index' import PokemonDetail from './pages/pokemon-detail/Index' const queryClient = new QueryClient() @@ -19,6 +20,10 @@ const router = createBrowserRouter([ { path: '/pokemon/:id', element: + }, + { + path: '*', + element: } ]) diff --git a/src/pages/not-found/Index.tsx b/src/pages/not-found/Index.tsx new file mode 100644 index 000000000..69b275892 --- /dev/null +++ b/src/pages/not-found/Index.tsx @@ -0,0 +1,22 @@ +import { Empty, Flex, Typography } from 'antd' +import { Link } from 'react-router' + +const NotFound = () => { + return ( + + + 404 - Page Not Found + + Sorry, the page you are looking for does not exist. + + Go back to home + + } + /> + + ) +} + +export default NotFound From c70e12f551b10e361dd0b300021bb58a5bf16d39 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 08:57:23 -0300 Subject: [PATCH 49/60] =?UTF-8?q?refactir:=20add=20StateHandlers=20compone?= =?UTF-8?q?nt=20to=20Pok=C3=A9mon=20detail=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/pokemon-detail/Index.tsx | 41 ++++++--------- .../components/StateHandlers.tsx | 50 +++++++++++++++++++ 2 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 src/pages/pokemon-detail/components/StateHandlers.tsx diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index fad513184..79e4aba31 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -1,7 +1,7 @@ -import { ArrowLeftOutlined, LoadingOutlined } from '@ant-design/icons' -import { Button, Col, Flex, Row, Spin, theme } from 'antd' +import { ArrowLeftOutlined } from '@ant-design/icons' +import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' -import { Link, useParams } from 'react-router' +import { Link, useNavigate, useParams } from 'react-router' import { useGetEvolutionChain } from '../../api/useEvolutionChain' import { useGetPokemon } from '../../api/usePokemon' import { useGetSpecies } from '../../api/useSpecies' @@ -11,6 +11,7 @@ import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' import PokeStats from './components/PokeStats' +import StateHandlers from './components/StateHandlers' import { extractSpecies } from './data/evolutionChain' import { formatTypeEffectiveness } from './data/pokeEffectiveness' import { formatPokeInfo } from './data/pokeInfo' @@ -18,52 +19,40 @@ import { formatPokeStats } from './data/pokeStats' const PokemonDetail = () => { const params = useParams() + const navigate = useNavigate() + const { + token: { colorBgContainer, colorSplit } + } = theme.useToken() const { data: pokeData, isFetching: pokeLoading, - isError: pokeError + error: pokeError } = useGetPokemon(Number(params.id)) const { data: speciesData, isFetching: speciesLoading, - isError: speciesError + error: speciesError } = useGetSpecies(Number(params.id)) const { data: typesData, isFetching: typesLoading, - isError: typesError + error: typesError } = useGetTypes(pokeData?.types[0].type.name || '') const { data: evolutionChainData, isFetching: evolutionChainLoading, - isError: evolutionChainError + error: evolutionChainError } = useGetEvolutionChain(speciesData?.evolution_chain.url || '') const isLoading = pokeLoading || speciesLoading || typesLoading || evolutionChainLoading const isError = pokeError || speciesError || typesError || evolutionChainError - const { - token: { colorBgContainer, colorSplit } - } = theme.useToken() + if (isError?.message.includes('404')) navigate('/not-found') - if ( - isLoading || - !pokeData || - !speciesData || - !typesData || - !evolutionChainData - ) { - return ( - - } - /> - - ) - } + if (!pokeData || !speciesData || !typesData || !evolutionChainData) + return StateHandlers({ isError: !!isError, isLoading }) const pokeInfos = formatPokeInfo(pokeData, speciesData) const pokeStats = formatPokeStats(pokeData) diff --git a/src/pages/pokemon-detail/components/StateHandlers.tsx b/src/pages/pokemon-detail/components/StateHandlers.tsx new file mode 100644 index 000000000..2d86cfaca --- /dev/null +++ b/src/pages/pokemon-detail/components/StateHandlers.tsx @@ -0,0 +1,50 @@ +import { LoadingOutlined } from '@ant-design/icons' +import { Empty, Flex, Spin, Typography } from 'antd' + +const StateHandlers = ({ + isError, + isLoading +}: { + isError: boolean + isLoading: boolean +}) => { + if (isLoading) { + return ( + + } /> + + ) + } + + if (isError) + return ( + + + + Oh no! This Pokémon tried to use "Load data"—but it missed! + + + Please try again in a few moments. + + + } + /> + + ) + + return null +} + +export default StateHandlers From 8e8170d3b5d7d3eef76217589ab0f3f6cfb4a1de Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 08:58:30 -0300 Subject: [PATCH 50/60] refactor: Move custom hooks to a separate folder --- src/{api => hooks}/useEvolutionChain.ts | 2 +- src/{api => hooks}/usePokemon.ts | 2 +- src/{api => hooks}/useSpecies.ts | 2 +- src/{api => hooks}/useTypes.ts | 2 +- src/pages/home/Index.tsx | 2 +- src/pages/pokemon-detail/Index.tsx | 8 ++++---- 6 files changed, 9 insertions(+), 9 deletions(-) rename src/{api => hooks}/useEvolutionChain.ts (77%) rename src/{api => hooks}/usePokemon.ts (91%) rename src/{api => hooks}/useSpecies.ts (81%) rename src/{api => hooks}/useTypes.ts (81%) diff --git a/src/api/useEvolutionChain.ts b/src/hooks/useEvolutionChain.ts similarity index 77% rename from src/api/useEvolutionChain.ts rename to src/hooks/useEvolutionChain.ts index 62f5fd5e3..9d0bdc617 100644 --- a/src/api/useEvolutionChain.ts +++ b/src/hooks/useEvolutionChain.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query' -import { getEvolutionChain } from './getEvolutionChain' +import { getEvolutionChain } from '../api/getEvolutionChain' export const useGetEvolutionChain = (url: string) => { return useQuery({ diff --git a/src/api/usePokemon.ts b/src/hooks/usePokemon.ts similarity index 91% rename from src/api/usePokemon.ts rename to src/hooks/usePokemon.ts index be6c90e5b..a1a0dae84 100644 --- a/src/api/usePokemon.ts +++ b/src/hooks/usePokemon.ts @@ -1,5 +1,5 @@ import { useQueries, useQuery } from '@tanstack/react-query' -import { getPokemon } from './getPokemon' +import { getPokemon } from '../api/getPokemon' export const useGetPokemon = (pokeId: number | string) => { return useQuery({ diff --git a/src/api/useSpecies.ts b/src/hooks/useSpecies.ts similarity index 81% rename from src/api/useSpecies.ts rename to src/hooks/useSpecies.ts index 00dd1f173..248812b1c 100644 --- a/src/api/useSpecies.ts +++ b/src/hooks/useSpecies.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query' -import { getSpecies } from './getSpecies' +import { getSpecies } from '../api/getSpecies' export const useGetSpecies = (pokeId: number) => { return useQuery({ diff --git a/src/api/useTypes.ts b/src/hooks/useTypes.ts similarity index 81% rename from src/api/useTypes.ts rename to src/hooks/useTypes.ts index 33df4bc81..26ae0e01e 100644 --- a/src/api/useTypes.ts +++ b/src/hooks/useTypes.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query' -import { getTypes } from './getTypes' +import { getTypes } from '../api/getTypes' export const useGetTypes = (id: number | string) => { return useQuery({ diff --git a/src/pages/home/Index.tsx b/src/pages/home/Index.tsx index 2459ae163..a352d35d2 100644 --- a/src/pages/home/Index.tsx +++ b/src/pages/home/Index.tsx @@ -1,8 +1,8 @@ import { Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { useState } from 'react' -import { useGetAllPokemon, useGetPokemon } from '../../api/usePokemon' import Logo from '../../assets/Logo' +import { useGetAllPokemon, useGetPokemon } from '../../hooks/usePokemon' import type { PokemonProps } from '../../types/pokemonTypes' import PokeGrid from './components/PokeGrid' import Searchbar from './components/Searchbar' diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 79e4aba31..2a3b5b7f4 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -2,11 +2,11 @@ import { ArrowLeftOutlined } from '@ant-design/icons' import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { Link, useNavigate, useParams } from 'react-router' -import { useGetEvolutionChain } from '../../api/useEvolutionChain' -import { useGetPokemon } from '../../api/usePokemon' -import { useGetSpecies } from '../../api/useSpecies' -import { useGetTypes } from '../../api/useTypes' import Logo from '../../assets/Logo' +import { useGetEvolutionChain } from '../../hooks/useEvolutionChain' +import { useGetPokemon } from '../../hooks/usePokemon' +import { useGetSpecies } from '../../hooks/useSpecies' +import { useGetTypes } from '../../hooks/useTypes' import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' From 54bbda3a7d362c380005eb160c0312ab8ee467be Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 09:04:58 -0300 Subject: [PATCH 51/60] refactor: Implement usePokemonDetails hook for cleaner logic --- src/hooks/usePokemonDetails.ts | 44 ++++++++++++++++++++++++ src/pages/pokemon-detail/Index.tsx | 54 +++++++----------------------- 2 files changed, 56 insertions(+), 42 deletions(-) create mode 100644 src/hooks/usePokemonDetails.ts diff --git a/src/hooks/usePokemonDetails.ts b/src/hooks/usePokemonDetails.ts new file mode 100644 index 000000000..73894b801 --- /dev/null +++ b/src/hooks/usePokemonDetails.ts @@ -0,0 +1,44 @@ +import { useGetEvolutionChain } from './useEvolutionChain' +import { useGetPokemon } from './usePokemon' +import { useGetSpecies } from './useSpecies' +import { useGetTypes } from './useTypes' + +function usePokemonDetails(id: number, navigate: (path: string) => void) { + const { + data: pokeData, + isFetching: pokeLoading, + error: pokeError + } = useGetPokemon(id) + const { + data: speciesData, + isFetching: speciesLoading, + error: speciesError + } = useGetSpecies(id) + const { + data: typesData, + isFetching: typesLoading, + error: typesError + } = useGetTypes(pokeData?.types[0].type.name || '') + const { + data: evolutionChainData, + isFetching: evolutionChainLoading, + error: evolutionChainError + } = useGetEvolutionChain(speciesData?.evolution_chain.url || '') + + const isLoading = + pokeLoading || speciesLoading || typesLoading || evolutionChainLoading + const isError = pokeError || speciesError || typesError || evolutionChainError + + if (isError?.message?.includes('404')) navigate('/not-found') + + return { + pokeData, + speciesData, + typesData, + evolutionChainData, + isLoading, + isError + } +} + +export default usePokemonDetails diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index 2a3b5b7f4..f45f6e0e8 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -3,10 +3,7 @@ import { Button, Col, Flex, Row, theme } from 'antd' import { Content } from 'antd/es/layout/layout' import { Link, useNavigate, useParams } from 'react-router' import Logo from '../../assets/Logo' -import { useGetEvolutionChain } from '../../hooks/useEvolutionChain' -import { useGetPokemon } from '../../hooks/usePokemon' -import { useGetSpecies } from '../../hooks/useSpecies' -import { useGetTypes } from '../../hooks/useTypes' +import usePokemonDetails from '../../hooks/usePokemonDetails' import EvolutionChain from './components/EvolutionChain' import PokeEffectiveness from './components/PokeEffectiveness' import PokeInfos from './components/PokeInfos' @@ -25,31 +22,13 @@ const PokemonDetail = () => { } = theme.useToken() const { - data: pokeData, - isFetching: pokeLoading, - error: pokeError - } = useGetPokemon(Number(params.id)) - const { - data: speciesData, - isFetching: speciesLoading, - error: speciesError - } = useGetSpecies(Number(params.id)) - const { - data: typesData, - isFetching: typesLoading, - error: typesError - } = useGetTypes(pokeData?.types[0].type.name || '') - const { - data: evolutionChainData, - isFetching: evolutionChainLoading, - error: evolutionChainError - } = useGetEvolutionChain(speciesData?.evolution_chain.url || '') - - const isLoading = - pokeLoading || speciesLoading || typesLoading || evolutionChainLoading - const isError = pokeError || speciesError || typesError || evolutionChainError - - if (isError?.message.includes('404')) navigate('/not-found') + pokeData, + speciesData, + typesData, + evolutionChainData, + isLoading, + isError + } = usePokemonDetails(Number(params.id), navigate) if (!pokeData || !speciesData || !typesData || !evolutionChainData) return StateHandlers({ isError: !!isError, isLoading }) @@ -81,28 +60,19 @@ const PokemonDetail = () => { - + - + - + - + From 977155f1154010f41f2869088ac311699e692b85 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 09:16:07 -0300 Subject: [PATCH 52/60] refactor: Improve divider responsiveness --- src/pages/pokemon-detail/Index.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pages/pokemon-detail/Index.tsx b/src/pages/pokemon-detail/Index.tsx index f45f6e0e8..4a25da9c6 100644 --- a/src/pages/pokemon-detail/Index.tsx +++ b/src/pages/pokemon-detail/Index.tsx @@ -18,7 +18,7 @@ const PokemonDetail = () => { const params = useParams() const navigate = useNavigate() const { - token: { colorBgContainer, colorSplit } + token: { colorBgContainer, colorSplit, screenLG } } = theme.useToken() const { @@ -59,7 +59,17 @@ const PokemonDetail = () => { - + screenLG ? `1px solid ${colorSplit}` : `0px`, + borderBottom: + window.innerWidth < screenLG ? `1px solid ${colorSplit}` : `0px`, + paddingBottom: window.innerWidth < screenLG ? 32 : 0 + }} + > From 275887d9a43dc3fb71dbd50951e6972756c6aeee Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 09:24:33 -0300 Subject: [PATCH 53/60] =?UTF-8?q?fix:=20Format=20Pok=C3=A9mon=20name=20for?= =?UTF-8?q?=20better=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/pokemon-detail/data/pokeInfo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/pokemon-detail/data/pokeInfo.ts b/src/pages/pokemon-detail/data/pokeInfo.ts index 1d28d757d..c64d681a9 100644 --- a/src/pages/pokemon-detail/data/pokeInfo.ts +++ b/src/pages/pokemon-detail/data/pokeInfo.ts @@ -7,7 +7,7 @@ export const formatPokeInfo = ( ) => { return { id: pokeData.id, - name: pokeData.name, + name: pokeData.name.split('-').join(' '), types: pokeData.types.map(type => type.type.name) as PokemonTypes[], cry: pokeData.cries.latest, sprite: From 7e0b084de53c3bf9db49edb2f7efa305ea65d95f Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 10:52:26 -0300 Subject: [PATCH 54/60] fix: Add unique keys to skeleton components --- src/pages/pokemon-detail/components/PokeStats.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/pages/pokemon-detail/components/PokeStats.tsx b/src/pages/pokemon-detail/components/PokeStats.tsx index 7d6a593e7..0635abdd3 100644 --- a/src/pages/pokemon-detail/components/PokeStats.tsx +++ b/src/pages/pokemon-detail/components/PokeStats.tsx @@ -39,7 +39,11 @@ const PokeStats = ({ data, isLoading }: Props) => { {measurements.map(measurement => ( - + ))} @@ -64,7 +68,12 @@ const LoadingPokeStats = () => { {Array.from({ length: 2 }).map((_, index) => ( - + @@ -76,7 +85,7 @@ const LoadingPokeStats = () => { {Array.from({ length: 6 }).map((_, index) => ( - + ))} From 08342c07b67589a4d628a425afd33080eed58bcf Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 10:52:55 -0300 Subject: [PATCH 55/60] fix: Remove anchor tag in evolution chain card --- src/pages/pokemon-detail/components/EvolutionChain.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index 18f8f683b..fb5e85526 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -45,15 +45,7 @@ const EvolutionChain = ({ data, isLoading }: Props) => { style={{ imageRendering: 'pixelated' }} /> } - extra={ - - - - } + extra={} styles={{ header: { border: 0, minHeight: 40 } }} > From 31da09cb8cab174b53e9a29900e68a2b452025e3 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 10:56:10 -0300 Subject: [PATCH 56/60] fix: Change body min-width for better responsiveness --- src/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.css b/src/index.css index 50cb73369..3e7b10ba7 100644 --- a/src/index.css +++ b/src/index.css @@ -22,7 +22,7 @@ body { margin: 0; padding: 0; - min-width: 100vw; + min-width: 100%; min-height: 100vh; background-color: var(--white); } From f4a61904f5a531052bdb462b37186869176dbb41 Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 11:02:10 -0300 Subject: [PATCH 57/60] fix: Change color of ExportOutlined icon in EvolutionChain component --- src/pages/pokemon-detail/components/EvolutionChain.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/pokemon-detail/components/EvolutionChain.tsx b/src/pages/pokemon-detail/components/EvolutionChain.tsx index fb5e85526..ea765440c 100644 --- a/src/pages/pokemon-detail/components/EvolutionChain.tsx +++ b/src/pages/pokemon-detail/components/EvolutionChain.tsx @@ -45,7 +45,7 @@ const EvolutionChain = ({ data, isLoading }: Props) => { style={{ imageRendering: 'pixelated' }} /> } - extra={} + extra={} styles={{ header: { border: 0, minHeight: 40 } }} > From 595f4cd18f5bc6b3f279a0ebb1588d5b3c93425b Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 11:02:43 -0300 Subject: [PATCH 58/60] feat: Add README with project overview, features, and setup instructions --- README.MD | 103 +++++++++++++++++++++++++++++++ public/detailpage-screenshot.png | Bin 0 -> 124059 bytes public/homepage-screenshot.png | Bin 0 -> 215272 bytes public/logo.png | Bin 0 -> 16582 bytes 4 files changed, 103 insertions(+) create mode 100644 README.MD create mode 100644 public/detailpage-screenshot.png create mode 100644 public/homepage-screenshot.png create mode 100644 public/logo.png diff --git a/README.MD b/README.MD new file mode 100644 index 000000000..c7af08739 --- /dev/null +++ b/README.MD @@ -0,0 +1,103 @@ +
+

+ Looqbox Frontend chalenge solution +

+ +This is my solution for the proposed frontend chalenge. + +
+ +
+ +

+ Looqdex Logo +

+ +--- + +## Table of contents + +- [Overview](#overview) + - [Screenshot](#screenshot) + - [Features](#features) + - [Run the project](#run-the-project) +- [My process](#my-process) + - [Built with](#built-with) + - [The journey](#the-journey) +- [Author](#author) + +## Overview + +### Screenshot + +![Home page screenshot](/public/homepage-screenshot.png) +![Details page screenshot](/public/detailpage-screenshot.png) + +## Features + +- List of Pokémon in the home page +- Searchbar to search any Pokémon by name or ID +- Pagination to display more Pokémon +- Pokémon details page with: + - Animated sprite + - Description + - Pokémon cry + - Shiny sprite display + - Height and Weight + - Charts for base stats visualization + - Type effectiveness + - Evolution chain +- Navigations between two routes (`/` - home page, `/pokemon/:id` - Pokémon details) +- Error and loading handling +- Responsive layout + +> See more running the project! + +## Run the project + +> Disclaimer: This project uses Vite for local hosting and building. Make sure you have Node.js version 22.12 or higher installed so it can work properly. + +- Clone the repository in your machine +- Acces the dev branch running: `$ git checkout dev` +- Install the dependencies with `$ npm install` +- Run the project using `$ npm run dev` +- Access the provided localhost url and voilà! Have fun + +## My process + +### Built with + +- React +- TypeScript +- Vite +- Ant Design +- Recharts - for charts +- Axios - for data fetching +- Tanstack / React-query - for data management and chaching +- React Router - for navigation +- EsLint and Prettier - Linting + +### The journey + +After reading the chalenge description, I opened Figma to start designing my ideas of pages, layouts and components, so I could get a better base when coding it out. You can check the Figma project [here](https://www.figma.com/design/A5wc90dBVFydtFRyzmhWDr/Looqdex-%7C-Looqbox-Frontend-Chalenge?node-id=106-41&t=pVm6iuhT96ga1ifB-1). + +After finishing the design, I started the project by cloning the repository in my machine and setting up Vite with React and Typescript and additional configurations for EsLint and Prettier linting. + +Then, I divided my process in simple steps. For each page, I would: + +- Create the page component, +- Create components related to the page +- Mock data +- Implement responsiviness +- Fetch data from the PokéApi +- Check for possible refactoring and code enhancement + +Following this steps, I was capable to finish the project in the estimated time and in a organized way. + +## Author + +This project was built with a lot of love (and coffee) by me, Laerte Quinui! + +- [GitHub](https://github.com/laerte-quinui) +- [LinkedIn](https://www.linkedin.com/in/laerte-quinui/) +- [E-mail](mailto:laertequinuio@gmail.com) diff --git a/public/detailpage-screenshot.png b/public/detailpage-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e3ca08ce92d32318ae43dc496ac607130ca93d GIT binary patch literal 124059 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%0D%xi7ChZC{?>) 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

c-Ey&8*qahwUD_?Agz%H1Qul&f`5 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 literal 0 HcmV?d00001 diff --git a/public/homepage-screenshot.png b/public/homepage-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec1f289a36be6650bb69faa005dc07ca7c8ea02 GIT binary patch literal 215272 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üh1UD=u(PgG> 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 C7~n4e literal 0 HcmV?d00001 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb2392f0bfd6d8fa655cbed601daaaec47facb2 GIT binary patch literal 16582 zcmdseXIqm`uy+uoNL8dr6-7a+g(4k6x)kXh1(DucC`nM7f`EX4N|)Y3?}SJR2uLrX zhmO>Q8X$x`;s3lj=PR6C7rEKl*`1v`yR$p9^ZTr)qegp!?FIk>1B*d!Ln9A0R@0064usW0AM z2LKc;G+w?i1d{B|+XNY?O``XWs-=3RBzM2uwY?@fNqJ9|f%U~-6$RZ<(1)g7#rw8n z4c}uLT2O_eda9w%u6?_yF3+fV=S53}&X{S5LFq}#lSPF@7;?eL0yT8VnyC2uWHJk1 zTIZZhNfZqLJlh7m8-YqIyFvlL1AYyt3$mQJmMktNQ9{b3lAfu$@UdPUK=X z1>pE8E0SAv*Luwr(3d&@-fnuTWg=bi97?yi0s|KT;miUH ziXBQSa{+r}Kk0~7d8Iy^6N$6eH_8$2}{5p<^cZ0 zU~_I=uIdq~0N%9=0JL**Zr!vfgj7nJ88T|8`*WIX9@lB*6@4gq`8^w$+H(}M+wWkBNoJ{M;HaQC^!9YvYbq>4Pr z=ge31SX|z0cy6^Q^cVo~vyJl&#B+fBgk(go*LM_5fxu)t~VwTRi9+!38^6_S6TuJC>N)F z#u&2smhm2=o2|)bJ2nVNn)Zq)mVC_UQtS?W^Sy@pm+KZPj{}yJ>${p{5DJWwS1)K$ znsV`Mc&mbJw!-9n^h?3jtLjRkVgq-W zcGu95!Gckc6^t+E7dJEOa%h82QM8Aw{daaEQ>dRZpdy1iIyK9}VAopZ$)X#pLU%Ce zX2X4*HsbmR08B~AFhP!KXIcrmyttY!inBL=yWMQ9&^JT` zP+lz~z)T##UDaa1VF)T~!hZcDan38QU0{C|j*_@fY_1#;Smd1%5+VR{0ti zS|FW#AC}WNC>U8se64e)CMBz@f+U{8WSA|Em{f*VZf;6l13 zU{1u>x)0f474cTS71)R8CSDd#ud1eUuC=kbNx`*FbwaI4(dd}Q;w!QuIpw0(;aK%r z2(NlrJpqRepjx`3dn*ELbSQ&rtfw!(eETQ9kM^^99=v}wlXzq07ESgq?Tc#nZj2gn z5d5=1|FzIpy?*f&Q7PULAQBB)8oFBDfLkvCaLS~?!k z?PUTf40W)PcsGP=0-?G!oo@hX65Bo zN7*DU9KZ2~7rmhNpwGxT?JJ`QaIS}vT$o<$K#$0KJ|2&w_SaDr^&;O(R3)sR&?JcA3NG3%3~zpzgH-3S_9xJ zX?6P!gyzVQs|Dzay$r6(BY|-%1u8@y^e!0s0yA`O56OSY+KHY!e<&-`{9m)~Nx{(V zHne3dg~jM}2M)5smb3XEdO1^A!sed7v> ztaREAjN^G7h8?*y@JjPgKIKx+UBVea*%kQka}R?nqVXF)Mg-b2uhU;C-95=0>M#|Q z>5Gw%pY4_WG(^s!eYJ)Eo(Uqu%$X0ZaG@<$WItjH#XfnoCgj3bpUu6p7{OnBxN01l zb3%bhHy?^A!N%C?dJl%RTS}76yfvP{*k;e={Kt`yLg6Vl8{~giid6w6Qo7JG%4RQa zDR?f0;fv?ZjQ!94Ot=I90@%Z*tkb34kpA+AC0G?pN#i3wh2X7PgO49vuR8it`#dyi z3!9;U7b+fmQ?ffVy?bn(u;(zu6VAfPXxM%=`wgKmlDYo-8dfwYui=@X;R+*cM4=Gf zyWAUBVzPtWXczBq%4q~=Pc}!O4cz(87<8DfOi$-dEI0#@pTYa&##FWEcd!`PFyXj z|MjSdFlYYFm>D9^<%{TbY41swjiqMP=v$=;yz1G^(FA}^+^e#4KQxjVI%}&E_Buqq z{csOvHx>PCb&PBMYC+y*7cLDQicI`vTj68lNrFrseE$>I?xcKGr z@z^|h=_U(oJ2%w#w#CiAEN}=b7c+E%dV&#K0kp|0^zFfK>M2KXhn1AeOXzA8efchCGlO<-V^e49Kl>HoPlh>z zfRo3kOyGRWRzqSyh$cYxqvxJYOCk%~+*pAH7fg6?-dNY&>z3GW z-oyss_UEhF-0ih4(U%R0w+eEue&xoTi>Syby!*`hOMLeqEb$cL36#)KSsgq}c8 zXU5d$6pEV;;cPnU@H&99g74d&m)kF+d(@!!<(?jf^k@v4nz8IR&)pcx2t1vJ0O|ZB zz$}o=p-ZC+ib5oRh;N*z+%XwoxKZNO3x#jrZc9D^RV~hwZpv|K3ix`Qo}Rr-huoit z!hkQVANu+1)vkmB=t2a@cPy+Dru~7Lu2B&s6`c@T!d^Xehy3Txc03z%fj-SQ*+iX< z^1mBzz5FD2)D7Qx&Alu1;S2HbU_t(IOU>CkKzcwEU_kWnCIoodxJy68DJq>)d&(bZ zbFm}u_HLZeR*ZaA(VN$3%x?E1Dl6^ZPf|cg!F7_5lqvSUf`KYKYpw{%p`1Kb)NoHQ zwv)D#y?Cx$=k)E}-se;?a`4m*D9iviqwAl^{!&WN$f zn_(}3vDmjc9(K1kKzdJXbXrw2f>pA&LxS1Xb>I#AHt(*d+T2I`G57Pg^2JlGYMEMQ z0mmH*31>l?yFwIM|~R$Wxg;`;e!JRf~rN zF)WPRXe2MkYA7AO&u{!t+_uK0K7Y@*2l>2^I@V8)KDwki3;ikPtuATTSAZ8COf|y- z6@jIJ$>Ztao-2<7n966IpF>Q^4?3T&<_ErXG>G2NgU=Ndpehce-hn~PN9Y!oOf9T@ zpokSH<00;C!n|L;CMR5waQwWy{5?P~td$g4wVWCE3m;-3uok7UbJnKms)m|{0tvw% z-TwXJWC4*(M#xjhr16X+nrI#g$vdf3*pPqf#K>cOfU&aQ{3I4E!llb!6?(=p^Po*1 z1~0MsSwsDBK9;Q0A>W669N+F+3RH~kOe4?@P>VCq>FEnWl2Gw)XSaPNlk*Jc!Fz@K zv`<)Id_g|1_q9`AYZ3hNpC8dzX6NXXTDu>*QPPoW)Ep{X0Bxc$7~{ChYVhG5or>3U z*9;v@I;uN1R{Xopye?!{sCZmnRty0lteMJ$SEo{WecQJ)x07HdsWhvk0K>aP|6p-+ zZTj$&qdh^E?qM=S-|3C;q1<9I?VHkS{2cw-U=}!Kt_!~yEGp=t5|B74@A)IX+NR;! zph0b~yzuP1XKTzaLhge78~lR1#2K2jGwMcCU7IlCf6_c-BU2k>9r)*s4_!XJxX9$# z<^Ge=bLPAJ;5Rzbg@6X)Th@9u(lZ}2$iMgAx#SVrk#sF~G5#(B_J=6o9p2dAq43O_ zluBLMnB~qG2{e$Z%Y?j_prjYJI<8p8RV9zhV{94H0Oh~R+XrDcB*TA1MP5h78p+bq zA0|1Jvy%BA$&$$^e4V8E@P)*K&ocLg;5F;HC=}IDPBd0S(nYX-Q1`@N00wtTV4Yjo zv<}+EFvx+uWG;fSJD>nL12 z{`T&lU4@aPnW>3+l~03pc+X*6ZG!Q=`ED2{=;*Hh#;W7%8S{zu zQR(bj)eo;yN0Sl*F06?>orFS@zcn~tKkjhVibOZM6pEkI0+(-O{oo9bGEpIE?LfOd zSeC~?0a9a7PQHp+`1jT5lnoBS^5(4hp-va4*?4*1=0A_=Y|!q;78N=yYR~WF?%ICB zL3n&wNSbUq&9%JVrGs0kAp~xvo6E4)yyoWCO1;t4WgONDNMCd)e$-j#^Wksl||`GJN0{=tnE0%515A1!%) zL?rgRAtG+GFzeUm=6twoUB6<%MIogf=*2JVv1c~eOl5=foJOUc-99pw{x(MuG3xe5{@MZn}z=Pf-aJl&alK{lJUFMV_J7xK#tf7la;7 z_H|-_u*)M!&+d^miMzXq7reP$N%yh zAKzw{I|`2uV;^#9oYL%h?31Z)9%nHEZqqXqovI)c(=IJxYnzpJb+Z>Cvmz8chuypR zBm_0;X5{Mi*|JG5aoBA9Nl4TUIdhHDFrM^(*S>>&AJDh(gv9mtF1R2F*7cpoL5$au zxdx_^Wp}r}BtE^3T%m3fwPpU=pi~{gDY#4Zd5E4C^&axV^yS&CGen+5R(O}Xbb*^H z^nKHSWH@@r^#NmtZl@&fv%>l))lxXxIEJ)E=_}I{x1qYx*a?h+x=NVG7)$AowEdvt z2atKp6B?VbQfX#=+lKH|3R^@^?rCD6P&Wd=+2!mYU<18ePz2~|2zHj_UZWFxWZYI< zVx3JqWuCTubde8dY_kw1M=q1Y1f{6sNAxt@j_Va@i>kKV%m!RFM^Y|T1#z}zbA>Sd z{-bDrJhw~Pmd!e9ziO0;z4^NrR@y?5a#2HL*Y!{!&)<@xQq?z6A{kv8&L9t&SN|u z)>(zXo%3RzE;Lk(M%Lh9vskub;ok(R8rYfsl|rFa4_JkW#^?^nz;{GE0Qb zD2tD~WR?MC(_+iRVo4X?}VmDs6^B$gg*cXoOH*L5>8daB+ONaM#a*^tAj}@5B zfG&*_REEcrl(-*K!z0mW|IB+TH(!Otg)m;y(0&KC_e8&Grt^7n)QVxr(R64+A`S1f zQB*^t8ASFfY)>**FL{zM&qsPbO@PAoD6$#}DOvdR?`8!KD=8gzElyH5fRMK zO>V2FN2)8x@33&7k2}NM_{a`CoZ+g2n_x`l^qnQdNo?D=%k9!>BiX&^!`aI20vuylIhbQNZGIeJXmhMRyDBy{jn3G? z2l5|Nw6<~J*IN2mn4Qx|8JJa%gsiuX&uerl#un}hIhPL*J!eDgUU{%!&AVSYm~yn; z+baEsIp#RgN7f32JC}Hyr43X>7Cf;L!)K#)Q*Rs9k!`e!>QAWu5<^1Uy)*>pPRtpo zY@x@sYuCT*0-?~O3s?{{anWTo&#JmSMvZ#k0@$f+H;uo!w-B+2X(7GhT4@hF2C>%DKO zv&o8BNP2PFMvGjdY(3!5GtP>Kg$wP8uDrJMi}0wZNb+X2E{*H+sWQQ#;PElV*bV}r zeB3AU!dTtSTxHM9D4`#}IJ1?B0(;JaP-6lope$nGQIj1-IWJ8kP4bf|OqsTVTczbJ zyJ|7p76^n&YF7-v*YEv{&%2ct_7gf%b1LVoIdaf?e+946s5+U$7amPpu1=G8!%yg| z7>Ia+mX4(e=#PdFgZO@08ge9?-fd--=Z$QBU7eP|JK8 z{K%%SU0d1p&djl01I>zzxR9*BaOod`Jqm&~g*zKam>k#cGKG~Z3L;38$Ug9DcI|I` zK28#v?{|YvGwKxr^TxV;yJr%cX54Of+!7bj0eiV?`l;hH~gbQN5)>FZQ;e@iC+G_2>?I=-?(D}`y z?=vckwzT<7Om4Lf)ljZ1?MpCNG1P+OofZje(nh#^(4!Wfe-?7<0`v6Noo#3bqg|YQ zjL+|}YAcSj(T9e=Neui9;Re)nnw?<~?vAju=zPtYc}WUe;j18A;w>xweVy48A(@Bu z(btRE58Ty+@=rPRX9h-tTkqQfpP{~1|C;Ht#yU~Xw;V*w`9qQ^mexVQjO-jjd}JA> zim@cIVdZZqvo)X59(qMI19sR#PNIbo^F_GO(?8 zx$gL$ao629B%#|^U*cW9b*Cb z@06mVdMTn@foKsiIG3@zJu6NbPQrwSx9(#(;xM@G{gU809 zvrzJlLUzR&*rW#E8XU5d`iy+XOT}N2ggDf6ATuQ&?nvEl5@TYoiU^sAAX|Zcwk6uT z4qPeEHDFM^`}p4X=zSm13wwg(8-&<%GNNBJ;8zbBj}9l zo2hjU_eE)BqiSR@e7<|JyK`ylJwf)ViQRFq`JOPBhO%vhjzxwK?7c+r5w~eZGRW#Z zPive&<1rXRpERH9{T|gYfZTm&TZhJ#eJRY|9*6>!4vnUd`2b3((v!JBW4CRVN-Se4 z#68_olyfg0w=8DY&is?;vEA>s^yMo*X?{O_J#Wb!*K6qgi&}aG<{6tlFwB7@?!1=g zSQo^cP*DW7Tn3`K0diqlkh`_flUVU#DlH`$T`X2s){3H~rteHIm`)7NJpyY4~Q;D~=%T6~`I>Qr6}%O1sW zSSJ>+Gvi!R0oL6vvRwGX!ZQa;YS3T1SH&oNgSPAYAQ%4-MT5C1nC^hEf6)m zhm#jvVfIBP*M7;^Rd z;RHH;bMg7JG#M>|G4jm#RrvKpOO|2Xvz%2YHP;7s+H^rTO9Kov(qA9Xy4v~~^|?os zux!+KVrxYGh%?)w4r|lQ-AYS5s`Ula17E*Y?<(7(cxT#+YT$NiK5+2*S<_HVSMij$rbv_ZPvbdEFMKRv>K{9PVQsBV@t12w0w-<@oBOV_ zVVvl!WNJa{Lbw(^~3hlH4AN_+2tJr6-BYgNAh-Br%tk`icjf#~Sh zb@b|>51P&iOE;>H=iUhTXeNi-HgXJ?O@ZBc#$c$d8gs;g`IdOo_wIQXYB$ON%?4&O z&+0j!T%d46;}4lZ@P~KpTWoh8m4;eXEw9;UFja4tEM2U#KWWlI)5iBz>m4iBvo*wY z^`x@&lVmq@U#wiqJ8ttRhV<(#kc2SD+o(rjjo@YxOj!d+q_lbd%{0=m`l$q7`vsKb={m&F*=4SD@4)4x>Z%Gs_dFh z|H-V-x6U%v!~)LZN#45R4UxtI6%Qyj1%NT_O?AEz-Kx zAT*n1-Iw(^%Z?z0(}F1uLG$OX-p=54k~zO5=OGaR#`{&-B$5aQ@XgW4HMIAswOcp1uYJ z2ATUBpXZ0U-Y`kTxBtLt&-AQ!?`*wrWtLRxp%PJF_=3QUDq%-$>evc4^CO0G%(&vE zJSK1cus;swX%YZVQ2&u1!hlqhIUicYfX4iy!>B;-l`%T2;4y}K{5cyfM3qh#Zffc*eJm zT%>3dq8hUr1dX=3hNZq*N}ZXPtgbC%A1XI<&k-0{Oh(bSCO{}EU+q=y-veNw9UbId6i6RTIXm9Bo4$A44mdVjN9PZKaVm5KCyi&Zm6AeWy<*kVpHFJf4Re z+G6LjSgaFPsJsdGbZB;Hxe>n_|swjP zSXEU!`xXQnFea87>UeN#jLBm4*2|<{q@0z;$n9buSjD1o@}ZBgwgQ}!-qjrpU3%0S0|)C8r!Ob8tf^Z^wqIIQjLfaW z4n{?;3udH`K`4egx2|^8LL*9LX8B5O)HSUZStL;Hgoju&$ z{3bpnp)_{C2q0p8v}I4eEDS9i$~vo>2-UtNU_WZTNlTDy);YcVK_%`W1e1`L_Z%H8 zK-CMO2foD}d=S+B&Kd53RxXA+&#)+ zEAltB{!uQvboPgN!cgirYVN1g%%eux$B`)ju7y{UzVyTD`Z+NqE3j0aVTnN3@8ny% z3>|)^8D0ILy@4X~{+B;_S|KTO+OK4*AMR6C{*JA!gH3-5h^;>(IsG&;@@03EW^^ly zzyp?xbJBxSndeqOfMWREv*vl;eZjH+o;qX=M^G z`KlsB>$6DR)|)@BSxJj$x__)oo{{_0TxrJOf&zn6Pan(G>IAML)qn2uPhiStZvXCN zN3F-@6<}BO^x0Lv@+y?!Umeqteepz{XJ2?5T;dPHfwxpSeQ(T(SwM?*+n)YYe215p}awZuAV%%D$Hi*|T zmJXcoPQ z-h@?OTH>PK-ca2dYjw?De!xRuG4`FwL)<`CO-5WNM(&P!Noz~bG)g@_Qo+Wn@<_NG z$|fx2`e#-PT=&_h{BUiK^NH8A(x2|G^*UJHq0*>z_E_Avy!b~^riSk`UcD26Q_6d8 zYVToNsvn@8WK+ z--okpt8vnMZfH$h?XI*=-=kUe=@!$3JZFUx8v~ zluIrkc_0lcAgOISfZeRN@(pbuA?^E=BkEVSmEUoRK&PR=MzgTodWq;n%f&5C41CsaM=oZ<|{p~Mg@sjizanK&G zy5v+fqR*Xl5y}Uf#?bB>kr>;JOVu>pcYDhcu4-~gSEF(Z>82gyb93+9*0#Ru&`$mq zJN~3L$AgZS!l#D$h+_twx{`Mm!6Q21F>r=$rWey0mI-{YN&94umPfW2hx4cKTnq6o z<=PlsX(Zm6`|naC@eA^XFm7&jW(f){%4b>RIY|Z~LCx z+EtI+dhB#R4TkS(vA@$F2!O;V8^tiRt-*%~<|#(YZDMZjn4d)R{OC~>H2<9Ic$^@g z(W8YUZEX8T41LM;zHrqb?E4FrEX^3B9blD}j}tk*VD}de}2`x90-Nrv%=JyVxZo9w{_5t2zy3o2i03)$iy8CP4UZeR8e8QR`x%)7@b^ zq0_01gjPRDJCIK9{kP5V`&j$rZmDFaiuhb%FnIof>avw+{ltcELFM-9$Rm;>+qeDe zXURAv!;u+RpUzF`&NawkZ_boD?pwV5RAh@0F+(OdW>wQnESM zm84s%Tr@h0+mNAO%?u2U@_?Kg{sLI4N){s0rUy(C@6VR=<|gZURmyA$pl+19HL~}X z{AI58y@h!X&M<1CyN~av)LZ%qH-mrpkoWF=wRn`o(L=xGCpK2SS}V%alYF6q8`cgM z;=?80WuIJJ&M!WQSuk-&px4|lENx2zBik)D?b`DL*dF~NoQapM{eiYp8Bc=l4$X@akid8TpT&(_&aq4$PvsflI` z@=t=P*QJqhOyAxldsR(P)JFm4YE|0@g&VJTbp8NKYFSF-7-4Z0)w3>^wb%I&t~tDD zkqDs(41TyV>`1Te>#RQhY@fSvJ+ivo0$_4x9Db^VTq(w26oFU05p!b@&%m_taxq8~byd&jZ%Dnzhu1xSt+#oW(F1mu|ePdhulDtqdoi1!xK<}yuL01J zN79A|vfv);P~l*$ADd*Zq>}q#d0B*B(=6EA!n=Sm$*OQ!u2=Z9P3Q}jyoz)BmFc%x z@PVQ}6BZ;hJ6O;-zs@!>5z*Ub{OjBn5wYmI;nmz@;%q-5HfMwhsc%!QO4?a3C39O&k;EW0Far zE-{m%3*$CJPBs3w_J)X;!1+7TfgD$9(=n-)Az>lKIo^;Sg^t-sJD8W?Ow^biSDQ*9 zF{ocqR*~Q@*cj{Ojpfvi@DP-kn4q_uVd{If#BcWGZgAkEiLp0X^Ack|7EQ37fA=&K znY?B(<^Bp*Ku-wugnwGkE1nSe%02biNy*Td?e}BWpPjpSw53TyK`6(Y1|~o=Mt_Ncc@_0BYq31UBW46oy8pCVMKFQT^8CM znr2HGpS%|GP@f*53g5fy$9NfkFrQyO_xbw1-sedHUz4&^y<@`c8J~QF9@NOQCD3FE zRx;>DL(F`PEJ1C|cE)64kQ zCzDG72^mVY{G@*OQ!2`!A6edsX=JrLmkF7pmuHfx13{2-p;~1- zT}zK0>y~$>IZ0;tjob6_OE2Q*1wJa%LLfzDCz&*P0_JbU(T1P)5CWzClwv&Y)Q#eC zSy58+T$ok85`C2TXuE>wvR%_2BJp{s*r4L3Rp9f_ikWL1l8yF74QLw1 zH=JyoZ*oD1(b0nnVe9)=ibaRkMUlh^p4PD9XsRJA&086KE}VX;ATvovOmWY8T*5_| z{C@V;ST_qO9^;MiF$AiI0>C4ms_YP#UI>aJDIDc zx!GfXiZgXs33!?XVUkBy*f~0a)oqKwnMZ#u>e-!qPl+fIqg53iWcIP?pK6??qlS&b|s1$u=+nR=k(F6Nml7d}QgMI6;9 zkM~G)@|Ue%1L7g$SRPiHV!PMg0^&l6LgUpci{v~fqY5WuHNAoa>UX#0(d>1B$WboH zy?}XzlB~A2N2it}aU$WES2x?LPIUa0#dp%)cP4IYau}|jufZXg7OnJzX^p48U#&QC z`Qoy16ag!WE$_n&s{Z95?^?(B_~(OsV_U^`8t1T9LlV>wZ-s=2#E9~zu69(?H|6HC z6&x2WcidYkysG4Yw;Q&eOWk;DSKG(E4B^g9<2-v9GDl5K1#+qp?Zj?pgb1F*P+N@% zlPYutcfDxTfg4*%K?AGaIp1ol%bySW_w!F|%lD(1I|@AwO8Q{V%eWRJ1s%#o7M}2p z&luWtDqzFH@I)=I+{Y4ZUfan_+Vd3{Zf(I*NEthXtWvE0I;cbi)ll|m313VFU0PDao>e~?Q^-=T8yQ)tCM=FCJ{M8XU(7piTS;1)xFOIQ5tNIm#IfZ% zZid`+AND6xyo1R^iJC-G(WgF&gwp1@H^bhv5{h!ux5r_O_q(g`NCdWo5 z74^>rUZrWwIlxc$hg=HE-pdPE)NlJXtKZ_{n+XCf-0Ky){I?dc1cy90Hy@@VlySZs z5KfUTX$>Oe#7hfDs!thHzD2dr1mdpm}Z^9RHCS1w&LIv42D$1wt2!8ek8n0o? zr)iSuhqNI|6q133f~&{1JL~EciN~4al5g<_upWvhmdmy(!~|~xAeX(cu~Weikex zGJx9(Iha>+??)AIMs07@BMcINk{=W9Sgo3rBMnPyMhPEpwD1fSxd0%)<6jE2~CK8-0ww zO_rOVU^cTw#nc)|UuD8?NID$TzPjceFr&I%P`zhcsl^{6+QraTVAQM|h`n1(%*0}8i7Wy3@gmyoNVy7_hY)o$X&T5z4$HC{UJm=%l2ud zXscim5i4NBMO||rV9eOri94oSV)Hbh@ux;)V#MA3CVkqhL}iVm5(PN_GH0n3;Ar2z z)BZRw7MU5=YNJNE^q?Q(26=_bZSKG-O&`CNtTn)15;op<8c;1F14QfdxbcYh%UtpW zM(A8T3nD?THk}lC!Xx|TUAfT5`IRFX2j3ZNkg*vbLJFl&!0mb*Sc`A$ssA8bCp)FR zUH05uu=ATgdHKe#JUWqQl&IHUt;Qy0z(6MnqJyh~?J+C^PCvp9*ie&Ps9Ks_gzyuS zIt@E%g-aINnm5CKn+tYy&Wqom=NTRhG9zn=u+7O!?LS&(AIn`78=edt3}9NW|8PcX zK6*IT#{k{<0^xzxhod7{mqTQu0tL2}SvdAAc9)QLbvp5g8a)~-mz_2kN8fvyn$G^k zX60$h#bi$zqBy-{a#sXqamLa~E>3u3HXa@ICe`NnrGmqJ>B3fMVFuNud#+mhydj78 z>7~0Cixx2rSBo2B-#8-7ZP1%x%uZnI2v~R9VEG(#W*2$jOs1j!T6uHNyz z^Em_Bnq*RXK~LuSET;YlUr4t9plcCEi1hc#et}rP;P%&L;5=>)O3Ks%B`i|3Kr{0F zV=8~IpLm@2pppdA={6sx0WanI+1sX3Ez@An-fy0=%5giF(@D9jSg+9s%8UAPD?njl)!EN?D~}k+3?QZ zz4XFxeXa|5!r_k?6kBs+sH3&V!CiIo^^xko!$^h zxAlUMB1icqVW}|{Hl$f`U7>jNlHq+Pb4%H|;cbl7J@m~a4D3who&Rt%^ZGWM0xC|N zZlg_Ol`XbogP6pLRq%-&RNs(x`giHKx$zZ&&k@o5r=-7pf#sQ#I>dO3(=HqWc_$2w zZ}W+pfEIjAvp!h| z?~;gBHK1>7`h?uEYP7aStGSqdA9tCeLh9JC!)cIJIk`*A9WhB&rV9|Ha z!v^~?mf`jSx4}I0MMy^5gw+pV}+BDaZ%_ zI0slZrb^>G`(*BnHK@5CKlH?PTg}w*3scufGo4YXLDQ#SJzn!v$gPt;C^()sN26Gu41<-b;&yP<{JSjWwngSXX8 z+3}b$HBSC$RV-u31`I_{7u6;{8VBWIbF((5~>%54b{83d@kEmLTF`xbJ7L6_;73 zT1Wxd$uO|GW5l)96k$O;qmGY@qnSan(x#OL5!o$Mc6Jo9o{hV2qObzt@2O&By--E?=^% literal 0 HcmV?d00001 From 390f4c0ffdf723e92423569cae394db085171f1d Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 8 Sep 2025 11:27:23 -0300 Subject: [PATCH 59/60] final commit --- README.MD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.MD b/README.MD index c7af08739..462ab11c8 100644 --- a/README.MD +++ b/README.MD @@ -61,7 +61,7 @@ This is my solution for the proposed frontend chalenge. - Acces the dev branch running: `$ git checkout dev` - Install the dependencies with `$ npm install` - Run the project using `$ npm run dev` -- Access the provided localhost url and voilà! Have fun +- Access the provided localhost url and voilà! Have fun! ## My process @@ -85,7 +85,7 @@ After finishing the design, I started the project by cloning the repository in m Then, I divided my process in simple steps. For each page, I would: -- Create the page component, +- Create the page component - Create components related to the page - Mock data - Implement responsiviness From 3d0154781a0e20429f3ab82c2499381f8ddeaa0c Mon Sep 17 00:00:00 2001 From: Laerte Quinui Date: Mon, 13 Oct 2025 10:08:48 -0300 Subject: [PATCH 60/60] Merge branch 'origin/dev' into dev --- .vite/deps/_metadata.json | 8 +++ .vite/deps/package.json | 3 + README.md | 129 ++++++++++++++++++++++++++------------ 3 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 .vite/deps/_metadata.json create mode 100644 .vite/deps/package.json diff --git a/.vite/deps/_metadata.json b/.vite/deps/_metadata.json new file mode 100644 index 000000000..e44b43cb1 --- /dev/null +++ b/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "1ab388db", + "configHash": "26caf4d4", + "lockfileHash": "ef9654f5", + "browserHash": "0a871461", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/.vite/deps/package.json b/.vite/deps/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/README.md b/README.md index 36ca6165d..462ab11c8 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,103 @@ -### Would you like to work with us? Apply [here](https://looqbox.gupy.io/)! +

-We will not use anything from your project other than evaluate your skills and you are free to use it in your portfolio +
-## Stack -We use: -- ReactJS -- Redux -- TypeScript -- AntDesign +

+ Looqdex Logo +

+ +--- + +## Table of contents + +- [Overview](#overview) + - [Screenshot](#screenshot) + - [Features](#features) + - [Run the project](#run-the-project) +- [My process](#my-process) + - [Built with](#built-with) + - [The journey](#the-journey) +- [Author](#author) + +## Overview + +### Screenshot + +![Home page screenshot](/public/homepage-screenshot.png) +![Details page screenshot](/public/detailpage-screenshot.png) + +## Features + +- List of Pokémon in the home page +- Searchbar to search any Pokémon by name or ID +- Pagination to display more Pokémon +- Pokémon details page with: + - Animated sprite + - Description + - Pokémon cry + - Shiny sprite display + - Height and Weight + - Charts for base stats visualization + - Type effectiveness + - Evolution chain +- Navigations between two routes (`/` - home page, `/pokemon/:id` - Pokémon details) +- Error and loading handling +- Responsive layout -## Submitting -- Make a fork of this repository -- Create your branch -- ⚠️ Do a initial Commit when you start -- ⚠️ Do a final commit when you finish -- When you're done send us a pull request +> See more running the project! -# Guidelines -You need to create a Single Page Application (SPA) that displays a list of Pokémon and allows users to search for them, using the [Pokeapi](https://pokeapi.co/docs/v2). Your app must be dynamic, meaning you **must not** reload the page to show new content. +## Run the project -The PokeAPI was chosen for its simplicity in making requests. Since it is an open API, please **be mindful of how many requests** you make. +> Disclaimer: This project uses Vite for local hosting and building. Make sure you have Node.js version 22.12 or higher installed so it can work properly. -## Requirements: +- Clone the repository in your machine +- Acces the dev branch running: `$ git checkout dev` +- Install the dependencies with `$ npm install` +- Run the project using `$ npm run dev` +- Access the provided localhost url and voilà! Have fun! -- On the main page, include a search bar and a preloaded list of Pokémon. -- Clicking on any Pokémon should display a card, modal, or page with that Pokémon’s information. -- Typing in the search bar and pressing Enter should display the search result instead of the list. -- Your app must include at least two different routes (e.g., /home, /details — be creative!). -- Add a README file to document your project. +## My process -You may use any libraries or dependencies you like (e.g., Axios, Bootstrap, Material UI...). +### Built with -## Bonus points! -- Pagination -- Error handling -- Documentation -- Linting -- Charts -- Unit Testing +- React +- TypeScript +- Vite - Ant Design +- Recharts - for charts +- Axios - for data fetching +- Tanstack / React-query - for data management and chaching +- React Router - for navigation +- EsLint and Prettier - Linting + +### The journey + +After reading the chalenge description, I opened Figma to start designing my ideas of pages, layouts and components, so I could get a better base when coding it out. You can check the Figma project [here](https://www.figma.com/design/A5wc90dBVFydtFRyzmhWDr/Looqdex-%7C-Looqbox-Frontend-Chalenge?node-id=106-41&t=pVm6iuhT96ga1ifB-1). + +After finishing the design, I started the project by cloning the repository in my machine and setting up Vite with React and Typescript and additional configurations for EsLint and Prettier linting. + +Then, I divided my process in simple steps. For each page, I would: + +- Create the page component +- Create components related to the page +- Mock data +- Implement responsiviness +- Fetch data from the PokéApi +- Check for possible refactoring and code enhancement + +Following this steps, I was capable to finish the project in the estimated time and in a organized way. + +## Author + +This project was built with a lot of love (and coffee) by me, Laerte Quinui! -## Useful links -- [React docs](https://react.dev/) -- [PokeApi docs](https://pokeapi.co/docs/v2) -- [Redux](https://redux.js.org/) +- [GitHub](https://github.com/laerte-quinui) +- [LinkedIn](https://www.linkedin.com/in/laerte-quinui/) +- [E-mail](mailto:laertequinuio@gmail.com)