From 77fa0184e2c499d66471607ddaac4a97a6791d15 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Fri, 23 Jan 2026 18:02:36 -0300 Subject: [PATCH 01/15] first commit --- .github/INSTRUCTIONS.md | 52 + logo.png => .github/logo.png | Bin .gitignore | 24 + .prettierignore | 7 + .prettierrc.json | 9 + README.md | 125 +- eslint.config.js | 26 + index.html | 13 + package-lock.json | 7929 ++++++++++++++++++++++++++++++++++ package.json | 53 + public/vite.svg | 1 + src/App.css | 42 + src/App.tsx | 31 + src/assets/react.svg | 1 + src/index.css | 68 + src/main.tsx | 10 + src/tests/setupTests.ts | 1 + tsconfig.app.json | 28 + tsconfig.json | 4 + tsconfig.node.json | 26 + vite.config.ts | 7 + vitest.config.ts | 12 + 22 files changed, 8417 insertions(+), 52 deletions(-) create mode 100644 .github/INSTRUCTIONS.md rename logo.png => .github/logo.png (100%) create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json 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/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/tests/setupTests.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts create mode 100644 vitest.config.ts diff --git a/.github/INSTRUCTIONS.md b/.github/INSTRUCTIONS.md new file mode 100644 index 000000000..36ca6165d --- /dev/null +++ b/.github/INSTRUCTIONS.md @@ -0,0 +1,52 @@ +### Would you like to work with us? Apply [here](https://looqbox.gupy.io/)! + +# Looqbox FrontEnd Challenge +![Looqbox](https://github.com/looqbox/looqbox-frontend-challenge/blob/master/logo.png) + +## Challenge +In this challenge you will need to build a **S**ingle **P**age **A**pplication using ReactJS and a provided api + +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 + +## 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 + +# 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. + +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. + +## Requirements: + +- 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. + +You may use any libraries or dependencies you like (e.g., Axios, Bootstrap, Material UI...). + +## Bonus points! +- Pagination +- Error handling +- Documentation +- Linting +- Charts +- Unit Testing +- Ant Design + +## Useful links +- [React docs](https://react.dev/) +- [PokeApi docs](https://pokeapi.co/docs/v2) +- [Redux](https://redux.js.org/) diff --git a/logo.png b/.github/logo.png similarity index 100% rename from logo.png rename to .github/logo.png 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/.prettierignore b/.prettierignore new file mode 100644 index 000000000..54304ec82 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +dist +node_modules +coverage +.vscode +*.log +.github +README.md \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..f455ae342 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 100, + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "tabWidth": 2, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/README.md b/README.md index 36ca6165d..4dcad1f91 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,73 @@ -### Would you like to work with us? Apply [here](https://looqbox.gupy.io/)! - -# Looqbox FrontEnd Challenge -![Looqbox](https://github.com/looqbox/looqbox-frontend-challenge/blob/master/logo.png) - -## Challenge -In this challenge you will need to build a **S**ingle **P**age **A**pplication using ReactJS and a provided api - -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 - -## 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 - -# 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. - -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. - -## Requirements: - -- 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. - -You may use any libraries or dependencies you like (e.g., Axios, Bootstrap, Material UI...). - -## Bonus points! -- Pagination -- Error handling -- Documentation -- Linting -- Charts -- Unit Testing -- Ant Design - -## Useful links -- [React docs](https://react.dev/) -- [PokeApi docs](https://pokeapi.co/docs/v2) -- [Redux](https://redux.js.org/) +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is currently not compatible with SWC. See [this issue](https://github.com/vitejs/vite-plugin-react/issues/428) for tracking the progress. + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..1e1bccd44 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,26 @@ +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 prettier from 'eslint-config-prettier'; +import { defineConfig, globalIgnores } from 'eslint/config'; + +export default defineConfig([ + globalIgnores(['dist', 'coverage']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + prettier, + ], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: globals.browser, + }, + }, +]); diff --git a/index.html b/index.html new file mode 100644 index 000000000..3da6db1df --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + react-ts + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..e348f2435 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7929 @@ +{ + "name": "react-ts", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-ts", + "version": "0.0.0", + "dependencies": { + "@reduxjs/toolkit": "^2.11.2", + "antd": "^6.2.1", + "axios": "^1.13.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-redux": "^9.2.0", + "react-router-dom": "^6.30.3" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@types/react-redux": "^7.1.34", + "@typescript-eslint/eslint-plugin": "^8.53.1", + "@typescript-eslint/parser": "^8.53.1", + "@vitejs/plugin-react-swc": "^4.2.2", + "@vitest/coverage-v8": "^4.0.18", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "jsdom": "^27.4.0", + "prettier": "^3.8.1", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4", + "vitest": "^4.0.18" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ant-design/colors": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz", + "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.0.3.tgz", + "integrity": "sha512-HAo8SZ3a6G8v6jT0suCz1270na6EA3obeJWM4uzRijBhdwdoMAXWK2f4WWkwB28yUufsfk3CAhN1coGPQq4kNQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-2.0.2.tgz", + "integrity": "sha512-Mq3Hm6fJuQeFNKSp3+yT4bjuhVbdrsyXE2RyfpJFL0xiYNZdaJ6oFaE3zFrzmHbmvTd2Wp3HCbRtkD4fU+v2ZA==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^2.0.1", + "@babel/runtime": "^7.23.2", + "@rc-component/util": "^1.4.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.0.tgz", + "integrity": "sha512-eqvpP7xEDm2S7dUzl5srEQCBTXZMmY3ekf97zI+M2DHOYyKdJGH0qua0JACHTqbkRnD/KHFQP9J1uMJ/XWVzzA==", + "license": "MIT", + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.1.0.tgz", + "integrity": "sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.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": "2.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-2.0.0.tgz", + "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "clsx": "^2.1.1", + "json2mq": "^0.2.0", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", + "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz", + "integrity": "sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "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.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "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.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", + "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "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.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "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.1", + "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.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "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.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.9.0.tgz", + "integrity": "sha512-lagqsvnk09NKogQaN/XrtlWeUF8SRhT12odMvbTIIaVObqzwAogL6jhR4DAp0gPuKoM1AOVrKUshJpRdpMFrww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "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/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/cascader": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.11.0.tgz", + "integrity": "sha512-VDiEsskThWi8l0/1Nquc9I4ytcMKQYAb9Jkm6wiX5O5fpcMRsm+b8OulBMbr/b4rFTl/2y2y4GdKqQ+2whD+XQ==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.5.0", + "@rc-component/tree": "~1.1.0", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/checkbox": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/checkbox/-/checkbox-1.0.1.tgz", + "integrity": "sha512-08yTH8m+bSm8TOqbybbJ9KiAuIATti6bDs2mVeSfu4QfEnyeF6X0enHVvD1NEAyuBWEAo56QtLe++MYs2D9XiQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/collapse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/collapse/-/collapse-1.2.0.tgz", + "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-3.0.3.tgz", + "integrity": "sha512-V7gFF9O7o5XwIWafdbOtqI4BUUkEUkgdBwp6favy3xajMX/2dDqytFaiXlcwrpq6aRyPLp5dKLAG5RFKLXMeGA==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^3.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz", + "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/dialog": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.8.0.tgz", + "integrity": "sha512-zGksezfULKixYCIWctIhUC2M3zUJrc81JKWbi9dJrQdPaM7J+8vSOrhLoOHHkZFpBpb2Ri6JqnSuGYb2N+FrRA==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.3", + "@rc-component/portal": "^2.1.0", + "@rc-component/util": "^1.5.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/drawer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.4.0.tgz", + "integrity": "sha512-Zr1j1LRLDauz4a5JXHEmeYQfvEzfh4CddNa7tszyJnfd5GySYdZ5qLO63Tt2tgG4k+qi6tkFDKmcT46ikZfzbQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.1.3", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/dropdown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz", + "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/@rc-component/form": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.6.2.tgz", + "integrity": "sha512-OgIn2RAoaSBqaIgzJf/X6iflIa9LpTozci1lagLBdURDFhGA370v0+T0tXxOi8YShMjTha531sFhwtnrv+EJaQ==", + "license": "MIT", + "dependencies": { + "@rc-component/async-validator": "^5.1.0", + "@rc-component/util": "^1.6.2", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/image": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.6.0.tgz", + "integrity": "sha512-tSfn2ZE/oP082g4QIOxeehkmgnXB7R+5AFj/lIFr4k7pEuxHBdyGIq9axoCY9qea8NN0DY6p4IB/F07tLqaT5A==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/portal": "^2.1.2", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/input": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.1.2.tgz", + "integrity": "sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/input-number": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@rc-component/input-number/-/input-number-1.6.2.tgz", + "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==", + "license": "MIT", + "dependencies": { + "@rc-component/mini-decimal": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mentions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.6.0.tgz", + "integrity": "sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==", + "license": "MIT", + "dependencies": { + "@rc-component/input": "~1.1.0", + "@rc-component/menu": "~1.2.0", + "@rc-component/textarea": "~1.1.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/menu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.2.0.tgz", + "integrity": "sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "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/motion": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.1.6.tgz", + "integrity": "sha512-aEQobs/YA0kqRvHIPjQvOytdtdRVyhf/uXAal4chBjxDu6odHckExJzjn2D+Ju1aKK6hx3pAs6BXdV9+86xkgQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz", + "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/notification": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-1.2.0.tgz", + "integrity": "sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/overflow": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.0.tgz", + "integrity": "sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/pagination": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz", + "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/picker": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.9.0.tgz", + "integrity": "sha512-OLisdk8AWVCG9goBU1dWzuH5QlBQk8jktmQ6p0/IyBFwdKGwyIZOSjnBYo8hooHiTdl0lU+wGf/OfMtVBw02KQ==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/trigger": "^3.6.15", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.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-component/portal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz", + "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/progress": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz", + "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz", + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/rate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/rate/-/rate-1.0.1.tgz", + "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/resize-observer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.1.tgz", + "integrity": "sha512-NfXXMmiR+SmUuKE1NwJESzEUYUFWIDUn2uXpxCTOLwiRUUakd62DRNFjRJArgzyFW8S5rsL4aX5XlyIXyC/vRA==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/segmented": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/segmented/-/segmented-1.3.0.tgz", + "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@rc-component/motion": "^1.1.4", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@rc-component/select": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.5.1.tgz", + "integrity": "sha512-ARXtwfCVnpDJj1bQjh1cimUlNQkZiN72hvtL2G4mKXIYfkokYdA2Vyu2deAfY7kuHSWpmZygVuohQt6TxOYjnA==", + "license": "MIT", + "dependencies": { + "@rc-component/overflow": "^1.0.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.3.0", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/slider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz", + "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/steps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz", + "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/switch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/switch/-/switch-1.0.3.tgz", + "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/table": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.9.1.tgz", + "integrity": "sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==", + "license": "MIT", + "dependencies": { + "@rc-component/context": "^2.0.1", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.1.0", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tabs": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.7.0.tgz", + "integrity": "sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==", + "license": "MIT", + "dependencies": { + "@rc-component/dropdown": "~1.0.0", + "@rc-component/menu": "~1.2.0", + "@rc-component/motion": "^1.1.3", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/textarea": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/textarea/-/textarea-1.1.2.tgz", + "integrity": "sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==", + "license": "MIT", + "dependencies": { + "@rc-component/input": "~1.1.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tooltip": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", + "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==", + "license": "MIT", + "dependencies": { + "@rc-component/trigger": "^3.7.1", + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.3.0.tgz", + "integrity": "sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==", + "license": "MIT", + "dependencies": { + "@rc-component/portal": "^2.2.0", + "@rc-component/trigger": "^3.0.0", + "@rc-component/util": "^1.7.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.1.0.tgz", + "integrity": "sha512-HZs3aOlvFgQdgrmURRc/f4IujiNBf4DdEeXUlkS0lPoLlx9RoqsZcF0caXIAMVb+NaWqKtGQDnrH8hqLCN5zlA==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.0.0", + "@rc-component/util": "^1.2.1", + "@rc-component/virtual-list": "^1.0.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/tree-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.6.0.tgz", + "integrity": "sha512-UvEGmZT+gcVvRwImAZg3/sXw9nUdn4FmCs1rSIMWjEXEIAo0dTGmIyWuLCvs+1rGe9AZ7CHMPiQUEbdadwV0fw==", + "license": "MIT", + "dependencies": { + "@rc-component/select": "~1.5.0", + "@rc-component/tree": "~1.1.0", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@rc-component/trigger": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz", + "integrity": "sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.2.0", + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.2.1", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/upload": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz", + "integrity": "sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==", + "license": "MIT", + "dependencies": { + "@rc-component/util": "^1.3.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/util": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.7.0.tgz", + "integrity": "sha512-tIvIGj4Vl6fsZFvWSkYw9sAfiCKUXMyhVz6kpKyZbwyZyRPqv2vxYZROdaO1VB4gqTNvUZFXh6i3APUiterw5g==", + "license": "MIT", + "dependencies": { + "is-mobile": "^5.0.0", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/virtual-list": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.0.2.tgz", + "integrity": "sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@rc-component/resize-observer": "^1.0.1", + "@rc-component/util": "^1.4.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "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/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", + "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "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/@swc/core": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.10.tgz", + "integrity": "sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.10", + "@swc/core-darwin-x64": "1.15.10", + "@swc/core-linux-arm-gnueabihf": "1.15.10", + "@swc/core-linux-arm64-gnu": "1.15.10", + "@swc/core-linux-arm64-musl": "1.15.10", + "@swc/core-linux-x64-gnu": "1.15.10", + "@swc/core-linux-x64-musl": "1.15.10", + "@swc/core-win32-arm64-msvc": "1.15.10", + "@swc/core-win32-ia32-msvc": "1.15.10", + "@swc/core-win32-x64-msvc": "1.15.10" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.10.tgz", + "integrity": "sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.10.tgz", + "integrity": "sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.10.tgz", + "integrity": "sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.10.tgz", + "integrity": "sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.10.tgz", + "integrity": "sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.10.tgz", + "integrity": "sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.10.tgz", + "integrity": "sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.10.tgz", + "integrity": "sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.10.tgz", + "integrity": "sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.10.tgz", + "integrity": "sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "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/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, + "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/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz", + "integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", + "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/type-utils": "8.53.1", + "@typescript-eslint/utils": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.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.53.1", + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", + "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "debug": "^4.4.3" + }, + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", + "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.53.1", + "@typescript-eslint/types": "^8.53.1", + "debug": "^4.4.3" + }, + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", + "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", + "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", + "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1", + "@typescript-eslint/utils": "8.53.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", + "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", + "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.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", + "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.53.1", + "@typescript-eslint/tsconfig-utils": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.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.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", + "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", + "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "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-swc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.2.tgz", + "integrity": "sha512-x+rE6tsxq/gxrEJN3Nv3dIV60lFflPj94c90b+NNo6n1QV1QQUTLoL0MpaOVasUZ0zqVBn7ead1B5ecx1JAGfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.47", + "@swc/core": "^1.13.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", + "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.18", + "ast-v8-to-istanbul": "^0.3.10", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "obug": "^2.1.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.0.18", + "vitest": "4.0.18" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.18", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.18", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "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/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-6.2.1.tgz", + "integrity": "sha512-ycw/XX7So4MdrwYKGfvZJdkGiCYUOSTebAIi+ejE95WJ138b11oy/iJg7iH0qydaD/B5sFd7Tz8XfPBuW7CRmw==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^8.0.1", + "@ant-design/cssinjs": "^2.0.3", + "@ant-design/cssinjs-utils": "^2.0.2", + "@ant-design/fast-color": "^3.0.0", + "@ant-design/icons": "^6.1.0", + "@ant-design/react-slick": "~2.0.0", + "@babel/runtime": "^7.28.4", + "@rc-component/cascader": "~1.11.0", + "@rc-component/checkbox": "~1.0.1", + "@rc-component/collapse": "~1.2.0", + "@rc-component/color-picker": "~3.0.3", + "@rc-component/dialog": "~1.8.0", + "@rc-component/drawer": "~1.4.0", + "@rc-component/dropdown": "~1.0.2", + "@rc-component/form": "~1.6.2", + "@rc-component/image": "~1.6.0", + "@rc-component/input": "~1.1.2", + "@rc-component/input-number": "~1.6.2", + "@rc-component/mentions": "~1.6.0", + "@rc-component/menu": "~1.2.0", + "@rc-component/motion": "~1.1.6", + "@rc-component/mutate-observer": "^2.0.1", + "@rc-component/notification": "~1.2.0", + "@rc-component/pagination": "~1.2.0", + "@rc-component/picker": "~1.9.0", + "@rc-component/progress": "~1.0.2", + "@rc-component/qrcode": "~1.1.1", + "@rc-component/rate": "~1.0.1", + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/segmented": "~1.3.0", + "@rc-component/select": "~1.5.0", + "@rc-component/slider": "~1.0.1", + "@rc-component/steps": "~1.2.2", + "@rc-component/switch": "~1.0.3", + "@rc-component/table": "~1.9.1", + "@rc-component/tabs": "~1.7.0", + "@rc-component/textarea": "~1.1.2", + "@rc-component/tooltip": "~1.4.0", + "@rc-component/tour": "~2.3.0", + "@rc-component/tree": "~1.1.0", + "@rc-component/tree-select": "~1.6.0", + "@rc-component/trigger": "^3.9.0", + "@rc-component/upload": "~1.1.0", + "@rc-component/util": "^1.7.0", + "clsx": "^2.1.1", + "dayjs": "^1.11.11", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "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/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", + "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "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", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "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/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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/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", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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", + "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/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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.278", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", + "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "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/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "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.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "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-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "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.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "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/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.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-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/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/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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.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/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "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", + "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/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/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/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/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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/immer": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz", + "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==", + "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", + "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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-mobile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "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/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", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "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/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "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": "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/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "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-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-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "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/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "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.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "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", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "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", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "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/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "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/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz", + "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.53.1", + "@typescript-eslint/parser": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1", + "@typescript-eslint/utils": "8.53.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "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/vitest": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "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/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "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" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..b703936d2 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "react-ts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier . --write", + "format:check": "prettier . --check", + "test": "vitest", + "test:ui": "vitest --ui", + "test:run": "vitest run", + "test:coverage": "vitest run --coverage" + }, + "dependencies": { + "@reduxjs/toolkit": "^2.11.2", + "antd": "^6.2.1", + "axios": "^1.13.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-redux": "^9.2.0", + "react-router-dom": "^6.30.3" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@types/react-redux": "^7.1.34", + "@typescript-eslint/eslint-plugin": "^8.53.1", + "@typescript-eslint/parser": "^8.53.1", + "@vitejs/plugin-react-swc": "^4.2.2", + "@vitest/coverage-v8": "^4.0.18", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "jsdom": "^27.4.0", + "prettier": "^3.8.1", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4", + "vitest": "^4.0.18" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 000000000..b9d355df2 --- /dev/null +++ b/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 000000000..3d37e1bc3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,31 @@ +import { useState } from 'react'; +import reactLogo from './assets/react.svg'; +import viteLogo from '/vite.svg'; +import './App.css'; + +function App() { + const [count, setCount] = useState(0); + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

Click on the Vite and React logos to learn more

+ + ); +} + +export default App; diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 000000000..08a3ac9e1 --- /dev/null +++ b/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 000000000..2239905c1 --- /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/tests/setupTests.ts b/src/tests/setupTests.ts new file mode 100644 index 000000000..7b0828bfa --- /dev/null +++ b/src/tests/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..a9b5a59ca --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "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..d32ff6820 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,4 @@ +{ + "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..8a67f62f4 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "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..6da11b5b2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..73b587b49 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react-swc'; + +export default defineConfig({ + plugins: [react()], + test: { + environment: 'jsdom', + setupFiles: ['./src/test/setupTests.ts'], + globals: true, + css: true, + }, +}); From 6203f0f0eff5445d02db61414cb2c549be67dcb5 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Sat, 24 Jan 2026 15:40:11 -0300 Subject: [PATCH 02/15] Organizing routes with react router v6 and creating a basic menu header --- src/App.css | 42 ------------- src/App.tsx | 31 ---------- src/app/routes/Router.tsx | 17 ++++++ src/components/AppLayout/AppLayout.tsx | 11 ++++ src/components/Header/Header.tsx | 27 ++++++++ src/index.css | 68 --------------------- src/main.tsx | 8 +-- src/pages/Home/Home.tsx | 7 +++ src/pages/Home/index.ts | 0 src/pages/PokemonDetails/PokemonDetails.tsx | 7 +++ src/pages/PokemonDetails/index.ts | 0 src/pages/Pokemons/Pokemons.tsx | 7 +++ src/pages/Pokemons/index.ts | 0 13 files changed, 80 insertions(+), 145 deletions(-) delete mode 100644 src/App.css delete mode 100644 src/App.tsx create mode 100644 src/app/routes/Router.tsx create mode 100644 src/components/AppLayout/AppLayout.tsx create mode 100644 src/components/Header/Header.tsx delete mode 100644 src/index.css create mode 100644 src/pages/Home/Home.tsx create mode 100644 src/pages/Home/index.ts create mode 100644 src/pages/PokemonDetails/PokemonDetails.tsx create mode 100644 src/pages/PokemonDetails/index.ts create mode 100644 src/pages/Pokemons/Pokemons.tsx create mode 100644 src/pages/Pokemons/index.ts diff --git a/src/App.css b/src/App.css deleted file mode 100644 index b9d355df2..000000000 --- a/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 3d37e1bc3..000000000 --- a/src/App.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { useState } from 'react'; -import reactLogo from './assets/react.svg'; -import viteLogo from '/vite.svg'; -import './App.css'; - -function App() { - const [count, setCount] = useState(0); - - return ( - <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

Click on the Vite and React logos to learn more

- - ); -} - -export default App; diff --git a/src/app/routes/Router.tsx b/src/app/routes/Router.tsx new file mode 100644 index 000000000..2ec7fadd9 --- /dev/null +++ b/src/app/routes/Router.tsx @@ -0,0 +1,17 @@ +import { createBrowserRouter } from 'react-router-dom'; +import { AppLayout } from '../../components/AppLayout/AppLayout'; +import { Pokemons } from '../../pages/Pokemons/Pokemons'; +import { PokemonDetails } from '../../pages/PokemonDetails/PokemonDetails'; +import { Home } from '../../pages/Home/Home'; + +export const router = createBrowserRouter([ + { + element: , + children: [ + { path: '/', element: }, + { path: '/pokemons', element: }, + { path: '/pokemon/:name', element: }, + { path: '*', element:
404 Not Found
}, + ], + }, +]); diff --git a/src/components/AppLayout/AppLayout.tsx b/src/components/AppLayout/AppLayout.tsx new file mode 100644 index 000000000..64c6faf86 --- /dev/null +++ b/src/components/AppLayout/AppLayout.tsx @@ -0,0 +1,11 @@ +import { Outlet } from "react-router-dom"; +import { Header } from "../Header/Header"; + +export function AppLayout() { + return ( +
+
+ +
+ ); +} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx new file mode 100644 index 000000000..09650b86b --- /dev/null +++ b/src/components/Header/Header.tsx @@ -0,0 +1,27 @@ +import type { MenuProps } from 'antd'; +import { Menu } from 'antd'; +import { Link, useLocation } from 'react-router-dom'; + +type MenuItem = Required['items'][number]; + +const items: MenuItem[] = [ + { + label: Home, + key: 'home', + }, + { + label: Pokémons, + key: 'pokemons', + }, +]; + +export function Header() { + const { pathname } = useLocation(); + const selectedKey = (() => { + if (pathname === '/') return ['home']; + if (pathname.startsWith('/pokemons') || pathname.startsWith('/pokemon')) return ['pokemons']; + return []; + })(); + + return ; +} diff --git a/src/index.css b/src/index.css deleted file mode 100644 index 08a3ac9e1..000000000 --- a/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/src/main.tsx b/src/main.tsx index 2239905c1..2b19851cf 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,10 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import './index.css'; -import App from './App.tsx'; +import { RouterProvider } from 'react-router-dom'; +import { router } from './app/routes/Router.tsx'; -createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById('root')!).render( - + , ); diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx new file mode 100644 index 000000000..b8d0f74c6 --- /dev/null +++ b/src/pages/Home/Home.tsx @@ -0,0 +1,7 @@ +export function Home() { + return ( +
+

Home

+
+ ); +} \ No newline at end of file diff --git a/src/pages/Home/index.ts b/src/pages/Home/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx new file mode 100644 index 000000000..09f437954 --- /dev/null +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -0,0 +1,7 @@ +export function PokemonDetails() { + return ( +
+

Pokemon X

+
+ ); +} \ No newline at end of file diff --git a/src/pages/PokemonDetails/index.ts b/src/pages/PokemonDetails/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/pages/Pokemons/Pokemons.tsx b/src/pages/Pokemons/Pokemons.tsx new file mode 100644 index 000000000..bb0f3c525 --- /dev/null +++ b/src/pages/Pokemons/Pokemons.tsx @@ -0,0 +1,7 @@ +export function Pokemons() { + return ( +
+

Pokemons

+
+ ); +} \ No newline at end of file diff --git a/src/pages/Pokemons/index.ts b/src/pages/Pokemons/index.ts new file mode 100644 index 000000000..e69de29bb From 8148ac25f0769fd16e5dec050e6f4e80f356fa2e Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Sat, 24 Jan 2026 18:02:55 -0300 Subject: [PATCH 03/15] feat: configure redux store and pokemon api integration --- src/app/store/hooks.ts | 6 ++ src/app/store/store.ts | 11 +++ src/features/pokemon/pokemonSlice.ts | 76 ++++++++++++++++++++ src/features/pokemon/pokemonThunks.ts | 28 ++++++++ src/main.tsx | 8 ++- src/pages/Home/Home.tsx | 31 ++++++++- src/pages/PokemonDetails/PokemonDetails.tsx | 53 ++++++++++++-- src/pages/Pokemons/Pokemons.tsx | 32 ++++++++- src/services/pokeapi.ts | 77 +++++++++++++++++++++ 9 files changed, 312 insertions(+), 10 deletions(-) create mode 100644 src/app/store/hooks.ts create mode 100644 src/app/store/store.ts create mode 100644 src/features/pokemon/pokemonSlice.ts create mode 100644 src/features/pokemon/pokemonThunks.ts create mode 100644 src/services/pokeapi.ts diff --git a/src/app/store/hooks.ts b/src/app/store/hooks.ts new file mode 100644 index 000000000..0353ea3f6 --- /dev/null +++ b/src/app/store/hooks.ts @@ -0,0 +1,6 @@ +import { useDispatch, useSelector } from 'react-redux'; +import type { TypedUseSelectorHook } from 'react-redux'; +import type { RootState, AppDispatch } from './store'; + +export const useAppDispatch = () => useDispatch(); +export const useAppSelector: TypedUseSelectorHook = useSelector; \ No newline at end of file diff --git a/src/app/store/store.ts b/src/app/store/store.ts new file mode 100644 index 000000000..340a89a52 --- /dev/null +++ b/src/app/store/store.ts @@ -0,0 +1,11 @@ +import { configureStore } from '@reduxjs/toolkit'; +import { pokemonReducer } from '../../features/pokemon/pokemonSlice'; + +export const store = configureStore({ + reducer: { + pokemon: pokemonReducer, + }, +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; \ No newline at end of file diff --git a/src/features/pokemon/pokemonSlice.ts b/src/features/pokemon/pokemonSlice.ts new file mode 100644 index 000000000..6643a9350 --- /dev/null +++ b/src/features/pokemon/pokemonSlice.ts @@ -0,0 +1,76 @@ +import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; +import type { PokemonDetails, PokemonListItem } from '../../services/pokeapi'; +import { fetchPokemonDetails, fetchPokemonPage } from './pokemonThunks'; + +type Status = 'idle' | 'loading' | 'succeeded' | 'failed'; + +type PokemonState = { + list: PokemonListItem[]; + total: number; + listStatus: Status; + listError: string | null; + + detailsByName: Record; + detailsStatusByName: Record; + detailsErrorByName: Record; +}; + +const initialState: PokemonState = { + list: [], + total: 0, + listStatus: 'idle', + listError: null, + + detailsByName: {}, + detailsStatusByName: {}, + detailsErrorByName: {}, +}; + +export const pokemonSlice = createSlice({ + name: 'pokemon', + initialState, + reducers: { + clearListError(state) { + state.listError = null; + }, + }, + extraReducers: (builder) => { + // List + builder + .addCase(fetchPokemonPage.pending, (state) => { + state.listStatus = 'loading'; + state.listError = null; + }) + .addCase(fetchPokemonPage.fulfilled, (state, action) => { + state.listStatus = 'succeeded'; + state.total = action.payload.count; + state.list = action.payload.results; + }) + .addCase(fetchPokemonPage.rejected, (state, action) => { + state.listStatus = 'failed'; + state.listError = action.payload ?? 'Failed to fetch pokémon list'; + }); + + // Details + builder + .addCase(fetchPokemonDetails.pending, (state, action) => { + const name = action.meta.arg.name.toLowerCase(); + state.detailsStatusByName[name] = 'loading'; + state.detailsErrorByName[name] = null; + }) + .addCase(fetchPokemonDetails.fulfilled, (state, action: PayloadAction) => { + const name = action.payload.name.toLowerCase(); + state.detailsByName[name] = action.payload; + state.detailsStatusByName[name] = 'succeeded'; + state.detailsErrorByName[name] = null; + }) + .addCase(fetchPokemonDetails.rejected, (state, action) => { + const name = action.meta.arg.name.toLowerCase(); + state.detailsStatusByName[name] = 'failed'; + state.detailsErrorByName[name] = action.payload ?? 'Failed to fetch pokémon details'; + }); + }, +}); + +export const { clearListError } = pokemonSlice.actions; +export const pokemonReducer = pokemonSlice.reducer; diff --git a/src/features/pokemon/pokemonThunks.ts b/src/features/pokemon/pokemonThunks.ts new file mode 100644 index 000000000..a8b49e150 --- /dev/null +++ b/src/features/pokemon/pokemonThunks.ts @@ -0,0 +1,28 @@ +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { getPokemonByName, getPokemonPage, type PokemonDetails, type PokemonListResponse } from '../../services/pokeapi'; + +export const fetchPokemonPage = createAsyncThunk< + PokemonListResponse, + { page: number; pageSize: number }, + { rejectValue: string } +>('pokemon/fetchPokemonPage', async ({ page, pageSize }, { rejectWithValue }) => { + try { + return await getPokemonPage({ page, pageSize }); + } catch (err) { + const message = err instanceof Error ? err.message : 'Failed to fetch pokémon list'; + return rejectWithValue(message); + } +}); + +export const fetchPokemonDetails = createAsyncThunk< + PokemonDetails, + { name: string }, + { rejectValue: string } +>('pokemon/fetchPokemonDetails', async ({ name }, { rejectWithValue }) => { + try { + return await getPokemonByName(name); + } catch (err) { + const message = err instanceof Error ? err.message : 'Failed to fetch pokémon details'; + return rejectWithValue(message); + } +}); diff --git a/src/main.tsx b/src/main.tsx index 2b19851cf..b78b7a776 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,9 +2,13 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { RouterProvider } from 'react-router-dom'; import { router } from './app/routes/Router.tsx'; +import { Provider } from 'react-redux'; +import { store } from './app/store/store.ts'; -createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById('root')!).render( - + + + , ); diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index b8d0f74c6..05ca61157 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -1,7 +1,34 @@ +import { useEffect } from 'react'; +import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; +import { fetchPokemonPage } from '../../features/pokemon/pokemonThunks'; +import { Row, Col, Card, Skeleton } from 'antd'; +import { Link } from 'react-router-dom'; + +const POKEMONS_PER_PAGE = 12; + export function Home() { + const dispatch = useAppDispatch(); + const { list, listStatus } = useAppSelector((state) => state.pokemon); + + useEffect(() => { + dispatch(fetchPokemonPage({ page: 1, pageSize: POKEMONS_PER_PAGE })); + }, [dispatch]); + return (
-

Home

+

Home

+ + + {listStatus === 'succeeded' && list.map((p) => ( + + + + + + ))} + {listStatus === 'loading' && } + {listStatus === 'failed' &&
Não foi possivel carregar
} +
); -} \ No newline at end of file +} diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index 09f437954..cca57ebed 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -1,7 +1,52 @@ +import { useEffect } from 'react'; +import { Card, Skeleton } from 'antd'; +import { useParams } from 'react-router-dom'; + +import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; +import { fetchPokemonDetails } from '../../features/pokemon/pokemonThunks'; + export function PokemonDetails() { + const dispatch = useAppDispatch(); + const { name = '' } = useParams(); + + const normalized = name.toLowerCase(); + + const details = useAppSelector((state) => state.pokemon.detailsByName[normalized]); + const status = useAppSelector((state) => state.pokemon.detailsStatusByName[normalized]); + const error = useAppSelector((state) => state.pokemon.detailsErrorByName[normalized]); + + useEffect(() => { + if (!normalized) return; + if (!details) { + dispatch(fetchPokemonDetails({ name: normalized })); + } + }, [dispatch, normalized, details]); + + if (status === 'loading' || !details) return ; + if (status === 'failed') return
{error}
; + return ( -
-

Pokemon X

-
+ +
+ {details.name} +
+ +
+ Types: {details.types.map((t) => t.type.name).join(', ')} +
+ +
+ Abilities: {details.abilities.map((a) => a.ability.name).join(', ')} +
+
); -} \ No newline at end of file +} diff --git a/src/pages/Pokemons/Pokemons.tsx b/src/pages/Pokemons/Pokemons.tsx index bb0f3c525..39a07a365 100644 --- a/src/pages/Pokemons/Pokemons.tsx +++ b/src/pages/Pokemons/Pokemons.tsx @@ -1,7 +1,35 @@ +import { Card, Col, Row, Skeleton } from 'antd'; +import { Link } from 'react-router-dom'; +import { fetchPokemonPage } from '../../features/pokemon/pokemonThunks'; +import { useEffect } from 'react'; +import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; + +const POKEMONS_PER_PAGE = 20; + export function Pokemons() { + const dispatch = useAppDispatch(); + const { list, listStatus } = useAppSelector((state) => state.pokemon); + + useEffect(() => { + dispatch(fetchPokemonPage({ page: 1, pageSize: POKEMONS_PER_PAGE })); + }, [dispatch]); + return (
-

Pokemons

+

Pokemons

+ + + {listStatus === 'succeeded' && + list.map((p) => ( + + + + + + ))} + {listStatus === 'loading' && } + {listStatus === 'failed' &&
Não foi possivel carregar
} +
); -} \ No newline at end of file +} diff --git a/src/services/pokeapi.ts b/src/services/pokeapi.ts new file mode 100644 index 000000000..843f2cb7e --- /dev/null +++ b/src/services/pokeapi.ts @@ -0,0 +1,77 @@ +import axios from 'axios'; + +export type PokemonListItem = { + name: string; + url: string; +}; + +export type PokemonListResponse = { + count: number; + next: string | null; + previous: string | null; + results: PokemonListItem[]; +}; + +export type PokemonDetails = { + id: number; + name: string; + sprites: { + front_default: string | null; + other?: { + ['official-artwork']?: { + front_default?: string | null; + }; + }; + }; + types: Array<{ + slot: number; + type: { name: string }; + }>; + abilities: Array<{ + ability: { name: string }; + is_hidden: boolean; + }>; + stats: Array<{ + base_stat: number; + stat: { name: string }; + }>; +}; + +const BASE_URL = 'https://pokeapi.co/api/v2'; +const api = axios.create({ + baseURL: BASE_URL, + timeout: 10_000, +}); + +export async function getPokemonPage(params?: { + page?: number; + pageSize?: number; +}): Promise { + const { page = 1, pageSize = 20 } = params || {}; + const offset = (page - 1) * pageSize; + + try { + const response = await api.get('/pokemon', { + params: { + limit: pageSize, + offset, + }, + }); + return response.data; + } catch (error) { + console.error('Error fetching Pokémon data:', error); + throw error; + } +} + +export async function getPokemonByName(name: string): Promise { + const normalized = name.trim().toLowerCase(); + + try { + const response = await api.get(`/pokemon/${normalized}`); + return response.data; + } catch (error) { + console.error(`Error fetching Pokémon data for ${name}:`, error); + throw error; + } +} From 52d406fc9307e9fa15292e60b0cd7be5f989b03a Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 01:05:10 -0300 Subject: [PATCH 04/15] feat(pokemon): add index store, local search and URL helpers --- .../pokemon/hooks/usePokemonIndexSearch.ts | 54 +++++++++++++++ .../hooks/usePokemonListQueryParams.ts | 67 +++++++++++++++++++ src/features/pokemon/pokemonSlice.ts | 39 ++++++----- src/features/pokemon/pokemonThunks.ts | 21 +++--- src/services/pokeapi.ts | 28 ++++++++ src/shared/utils/normalizeText.ts | 14 ++++ src/shared/utils/numbers.ts | 5 ++ src/shared/utils/searchParams.ts | 12 ++++ 8 files changed, 212 insertions(+), 28 deletions(-) create mode 100644 src/features/pokemon/hooks/usePokemonIndexSearch.ts create mode 100644 src/features/pokemon/hooks/usePokemonListQueryParams.ts create mode 100644 src/shared/utils/normalizeText.ts create mode 100644 src/shared/utils/numbers.ts create mode 100644 src/shared/utils/searchParams.ts diff --git a/src/features/pokemon/hooks/usePokemonIndexSearch.ts b/src/features/pokemon/hooks/usePokemonIndexSearch.ts new file mode 100644 index 000000000..a1ef88980 --- /dev/null +++ b/src/features/pokemon/hooks/usePokemonIndexSearch.ts @@ -0,0 +1,54 @@ +import { useMemo } from 'react'; +import type { PokemonIndexItem } from '../../../services/pokeapi'; +import { normalizeText } from '../../../shared/utils/normalizeText'; + +type Params = { + index: PokemonIndexItem[]; + query: string; + page: number; + pageSize: number; + defaultLimit?: number; +}; + +/** + * Handles local search and pagination over the Pokémon index. + * + * Why local and not via PokéAPI? + * - PokeAPI does not support partial search + * - Avoids excessive API requests + * - Keeps UI fast and predictable + * + * Modes: + * - default: returns a limited featured list + * - search: filters index and paginates results + */ +export function usePokemonIndexSearch({ index, query, page, pageSize, defaultLimit }: Params) { + const mode = query.trim() ? 'search' : 'default'; + const normalizedQuery = useMemo(() => normalizeText(query), [query]); + + const filtered = useMemo(() => { + if (mode === 'default') return index; + if (!normalizedQuery) return []; + return index.filter((p) => normalizeText(p.name).includes(normalizedQuery)); + }, [index, mode, normalizedQuery]); + + const defaultItems = useMemo(() => { + if (defaultLimit == null) return []; + return index.slice(0, defaultLimit); + }, [index, defaultLimit]); + + const total = mode === 'search' ? filtered.length : index.length; + const start = (page - 1) * pageSize; + const paged = useMemo(() => filtered.slice(start, start + pageSize), [filtered, start, pageSize]); + const hasMoreItems = mode === 'search' ? filtered.length > pageSize : false; + + return { + mode, + normalizedQuery, + filtered, + total, + paged, + defaultItems, + hasMoreItems, + }; +} diff --git a/src/features/pokemon/hooks/usePokemonListQueryParams.ts b/src/features/pokemon/hooks/usePokemonListQueryParams.ts new file mode 100644 index 000000000..5145bf615 --- /dev/null +++ b/src/features/pokemon/hooks/usePokemonListQueryParams.ts @@ -0,0 +1,67 @@ +import { useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { toPositiveInt } from '../../../shared/utils/numbers'; +import { buildPokemonListSearchParams } from '../../../shared/utils/searchParams'; + +type Options = { + withPage: boolean; + defaultPage?: number; +}; + +/** + * Centralizes Pokémon list URL state (q, page). + * + * Used by: + * - Home (search only) + * - Pokemons (search + pagination) + * + * Keeps input state in sync with URL navigation (back/forward). + */ +export function usePokemonListQueryParams(options: Options) { + const { withPage, defaultPage = 1 } = options; + + const [searchParams, setSearchParams] = useSearchParams(); + + const qParam = searchParams.get('q') ?? ''; + const pageParam = withPage ? toPositiveInt(searchParams.get('page'), defaultPage) : defaultPage; + + const [inputValue, setInputValue] = useState(qParam); + + useEffect(() => { + setInputValue(qParam); + }, [qParam]); + + function submit(next: string) { + const q = next.trim(); + + if (!withPage) { + setSearchParams(buildPokemonListSearchParams({ q })); + return; + } + + setSearchParams(buildPokemonListSearchParams({ q, page: defaultPage })); + } + + function clear() { + if (!withPage) { + setSearchParams(buildPokemonListSearchParams({})); + return; + } + setSearchParams(buildPokemonListSearchParams({ page: defaultPage })); + } + + function setPage(nextPage: number) { + if (!withPage) return; + setSearchParams(buildPokemonListSearchParams({ q: qParam, page: nextPage })); + } + + return { + qParam, + pageParam, + inputValue, + setInputValue, + submit, + clear, + setPage, + }; +} diff --git a/src/features/pokemon/pokemonSlice.ts b/src/features/pokemon/pokemonSlice.ts index 6643a9350..088721b90 100644 --- a/src/features/pokemon/pokemonSlice.ts +++ b/src/features/pokemon/pokemonSlice.ts @@ -1,14 +1,14 @@ import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; -import type { PokemonDetails, PokemonListItem } from '../../services/pokeapi'; -import { fetchPokemonDetails, fetchPokemonPage } from './pokemonThunks'; +import type { PokemonDetails, PokemonIndexItem } from '../../services/pokeapi'; +import { fetchPokemonDetails, fetchPokemonIndex } from './pokemonThunks'; type Status = 'idle' | 'loading' | 'succeeded' | 'failed'; type PokemonState = { - list: PokemonListItem[]; total: number; - listStatus: Status; - listError: string | null; + index: PokemonIndexItem[]; + indexStatus: Status; + indexError: string | null; detailsByName: Record; detailsStatusByName: Record; @@ -16,10 +16,10 @@ type PokemonState = { }; const initialState: PokemonState = { - list: [], total: 0, - listStatus: 'idle', - listError: null, + index: [], + indexStatus: 'idle', + indexError: null, detailsByName: {}, detailsStatusByName: {}, @@ -31,24 +31,23 @@ export const pokemonSlice = createSlice({ initialState, reducers: { clearListError(state) { - state.listError = null; + state.indexError = null; }, }, extraReducers: (builder) => { - // List + // Index builder - .addCase(fetchPokemonPage.pending, (state) => { - state.listStatus = 'loading'; - state.listError = null; + .addCase(fetchPokemonIndex.pending, (state) => { + state.indexStatus = 'loading'; + state.indexError = null; }) - .addCase(fetchPokemonPage.fulfilled, (state, action) => { - state.listStatus = 'succeeded'; - state.total = action.payload.count; - state.list = action.payload.results; + .addCase(fetchPokemonIndex.fulfilled, (state, action) => { + state.indexStatus = 'succeeded'; + state.index = action.payload; }) - .addCase(fetchPokemonPage.rejected, (state, action) => { - state.listStatus = 'failed'; - state.listError = action.payload ?? 'Failed to fetch pokémon list'; + .addCase(fetchPokemonIndex.rejected, (state, action) => { + state.indexStatus = 'failed'; + state.indexError = action.payload ?? 'Failed to fetch pokémon index'; }); // Details diff --git a/src/features/pokemon/pokemonThunks.ts b/src/features/pokemon/pokemonThunks.ts index a8b49e150..1632ae6c9 100644 --- a/src/features/pokemon/pokemonThunks.ts +++ b/src/features/pokemon/pokemonThunks.ts @@ -1,15 +1,20 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; -import { getPokemonByName, getPokemonPage, type PokemonDetails, type PokemonListResponse } from '../../services/pokeapi'; +import { + getPokemonByName, + getPokemonIndex, + type PokemonDetails, + type PokemonIndexItem, +} from '../../services/pokeapi'; -export const fetchPokemonPage = createAsyncThunk< - PokemonListResponse, - { page: number; pageSize: number }, +export const fetchPokemonIndex = createAsyncThunk< + PokemonIndexItem[], + void, { rejectValue: string } ->('pokemon/fetchPokemonPage', async ({ page, pageSize }, { rejectWithValue }) => { +>('pokemon/fetchPokemonIndex', async (_, { rejectWithValue }) => { try { - return await getPokemonPage({ page, pageSize }); + return await getPokemonIndex(); } catch (err) { - const message = err instanceof Error ? err.message : 'Failed to fetch pokémon list'; + const message = err instanceof Error ? err.message : 'Failed to fetch pokémon index'; return rejectWithValue(message); } }); @@ -25,4 +30,4 @@ export const fetchPokemonDetails = createAsyncThunk< const message = err instanceof Error ? err.message : 'Failed to fetch pokémon details'; return rejectWithValue(message); } -}); +}); \ No newline at end of file diff --git a/src/services/pokeapi.ts b/src/services/pokeapi.ts index 843f2cb7e..499c49e95 100644 --- a/src/services/pokeapi.ts +++ b/src/services/pokeapi.ts @@ -1,5 +1,10 @@ import axios from 'axios'; +export type PokemonIndexItem = { + id: number; + name: string; +}; + export type PokemonListItem = { name: string; url: string; @@ -75,3 +80,26 @@ export async function getPokemonByName(name: string): Promise { throw error; } } + +export function extractPokemonId(url: string): number { + const match = url.match(/\/pokemon\/(\d+)\//); + if (!match) return 0; + return Number(match[1]); +} + +export async function getPokemonIndex(): Promise { + try { + const response = await api.get('/pokemon', { + params: { limit: 2000, offset: 0 }, + }); + + return response.data.results + .map((p) => ({ + id: extractPokemonId(p.url), + name: p.name, + })) + .filter((p) => p.id > 0); + } catch { + throw new Error('Failed to fetch pokémon index'); + } +} \ No newline at end of file diff --git a/src/shared/utils/normalizeText.ts b/src/shared/utils/normalizeText.ts new file mode 100644 index 000000000..7541d016c --- /dev/null +++ b/src/shared/utils/normalizeText.ts @@ -0,0 +1,14 @@ +/** + * Normalizes text for search comparison. + * - Removes accents + * - Lowercases + */ +export function normalizeText(value: string) { + return value + .trim() + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/g, ''); +} \ No newline at end of file diff --git a/src/shared/utils/numbers.ts b/src/shared/utils/numbers.ts new file mode 100644 index 000000000..370311261 --- /dev/null +++ b/src/shared/utils/numbers.ts @@ -0,0 +1,5 @@ +export function toPositiveInt(value: string | null, fallback = 1) { + const n = Number(value); + if (!Number.isFinite(n) || n < 1) return fallback; + return Math.floor(n); +} \ No newline at end of file diff --git a/src/shared/utils/searchParams.ts b/src/shared/utils/searchParams.ts new file mode 100644 index 000000000..b7630116f --- /dev/null +++ b/src/shared/utils/searchParams.ts @@ -0,0 +1,12 @@ +/** + * Builds search params for Pokémon list routes. + * + * - Omits empty values + * - Ensures consistent query param structure + */ +export function buildPokemonListSearchParams(params: { q?: string; page?: number }) { + const sp: Record = {}; + if (params.q && params.q.trim()) sp.q = params.q.trim(); + if (params.page && params.page > 0) sp.page = String(params.page); + return sp; +} From 7f292d8bb6ad3ef77aeafbbc72a5f873eacc89c9 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 01:06:11 -0300 Subject: [PATCH 05/15] feat: add reusable search UI, image fallback and display formatting --- src/assets/pokemon_placeholder.png | Bin 0 -> 15869 bytes src/components/PokemonGrid/PokemonGrid.tsx | 29 +++++++++ src/components/PokemonImage/PokemonImage.tsx | 55 ++++++++++++++++++ .../PokemonSearch/PokemonSearchInput.tsx | 54 +++++++++++++++++ .../PokemonSearch/PokemonSearchResults.tsx | 49 ++++++++++++++++ src/components/PokemonSearch/index.ts | 7 +++ src/components/SearchBar/SearchBar.tsx | 24 ++++++++ src/shared/utils/formatPokemonName.ts | 24 ++++++++ 8 files changed, 242 insertions(+) create mode 100644 src/assets/pokemon_placeholder.png create mode 100644 src/components/PokemonGrid/PokemonGrid.tsx create mode 100644 src/components/PokemonImage/PokemonImage.tsx create mode 100644 src/components/PokemonSearch/PokemonSearchInput.tsx create mode 100644 src/components/PokemonSearch/PokemonSearchResults.tsx create mode 100644 src/components/PokemonSearch/index.ts create mode 100644 src/components/SearchBar/SearchBar.tsx create mode 100644 src/shared/utils/formatPokemonName.ts diff --git a/src/assets/pokemon_placeholder.png b/src/assets/pokemon_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..23852e61007417e15ddfcba4a6446260e6294167 GIT binary patch literal 15869 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 string; +}; + +export function PokemonGrid({ items, detailsPath }: Props) { + return ( + + {items.map((p) => ( + + + } + > + + + + + ))} + + ); +} diff --git a/src/components/PokemonImage/PokemonImage.tsx b/src/components/PokemonImage/PokemonImage.tsx new file mode 100644 index 000000000..5475bce0b --- /dev/null +++ b/src/components/PokemonImage/PokemonImage.tsx @@ -0,0 +1,55 @@ +import { useMemo, useState } from 'react'; +import placeholder from '../../assets/pokemon_placeholder.png'; + +type Props = { + id?: number | null; + name: string; + alt?: string; + height?: number; + padding?: number; + variant?: 'artwork' | 'sprite'; + style?: React.CSSProperties; +}; + +function getArtworkUrl(id: number) { + return `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/${id}.png`; +} + +function getSpriteUrl(id: number) { + return `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${id}.png`; +} + +export function PokemonImage({ + id, + name, + alt, + height = 180, + padding = 12, + variant = 'artwork', + style, +}: Props) { + const [attempt, setAttempt] = useState(0); + + const urls = useMemo(() => { + if (!id) return []; + const primary = variant === 'artwork' ? getArtworkUrl(id) : getSpriteUrl(id); + const secondary = variant === 'artwork' ? getSpriteUrl(id) : getArtworkUrl(id); + return [primary, secondary, placeholder]; + }, [id, variant]); + + const src = urls[attempt]; + + if (!src) return null; + + return ( + {alt { + setAttempt((prev) => (prev < urls.length - 1 ? prev + 1 : prev)); + }} + style={{ padding, height, objectFit: 'contain', ...style }} + /> + ); +} diff --git a/src/components/PokemonSearch/PokemonSearchInput.tsx b/src/components/PokemonSearch/PokemonSearchInput.tsx new file mode 100644 index 000000000..59eaf6a94 --- /dev/null +++ b/src/components/PokemonSearch/PokemonSearchInput.tsx @@ -0,0 +1,54 @@ +import { useEffect, useState } from 'react'; +import { SearchBar } from '../SearchBar/SearchBar'; + +type Props = { + placeholder?: string; + query: string; + onSubmitQuery: (q: string) => void; + onClear?: () => void; +}; + +/** + * Controlled search input for Pokémon search. + * + * Responsibilities: + * - Sync input value with URL state + * - Auto-clear search when input is emptied + * - Delegate actual search handling to parent + */ +export function PokemonSearchInput({ placeholder, query, onSubmitQuery, onClear }: Props) { + const [value, setValue] = useState(query); + + useEffect(() => { + setValue(query); + }, [query]); + + function handleChange(next: string) { + setValue(next); + + if (next === '') { + onSubmitQuery(''); + onClear?.(); + } + } + + function submit(raw: string) { + onSubmitQuery(raw.trim()); + } + + function clear() { + setValue(''); + onSubmitQuery(''); + onClear?.(); + } + + return ( + + ); +} diff --git a/src/components/PokemonSearch/PokemonSearchResults.tsx b/src/components/PokemonSearch/PokemonSearchResults.tsx new file mode 100644 index 000000000..80098b7ea --- /dev/null +++ b/src/components/PokemonSearch/PokemonSearchResults.tsx @@ -0,0 +1,49 @@ +import { Alert, Empty, Skeleton, Space, Typography } from 'antd'; +import type { PokemonIndexItem } from '../../services/pokeapi'; +import { PokemonGrid } from '../PokemonGrid/PokemonGrid'; + +const { Title } = Typography; + +type Props = { + title?: string; + loading: boolean; + error?: string | null; + items: PokemonIndexItem[]; + emptyText?: string; + showEmpty?: boolean; + extra?: React.ReactNode; + detailsPath: (name: string) => string; +}; + +export function PokemonSearchResults({ + title, + loading, + error, + items, + emptyText = 'No results found', + showEmpty = false, + extra, + detailsPath, +}: Props) { + if (loading) return ; + + if (error) { + return ; + } + + if (showEmpty && items.length === 0) { + return ; + } + + return ( + + {title ? ( + + {title} + + ) : null} + {items.length > 0 ? : null} + {extra} + + ); +} diff --git a/src/components/PokemonSearch/index.ts b/src/components/PokemonSearch/index.ts new file mode 100644 index 000000000..b79241936 --- /dev/null +++ b/src/components/PokemonSearch/index.ts @@ -0,0 +1,7 @@ +import { PokemonSearchInput } from './PokemonSearchInput'; +import { PokemonSearchResults } from './PokemonSearchResults'; + +export const PokemonSearch = { + Input: PokemonSearchInput, + Results: PokemonSearchResults, +}; diff --git a/src/components/SearchBar/SearchBar.tsx b/src/components/SearchBar/SearchBar.tsx new file mode 100644 index 000000000..761009ea5 --- /dev/null +++ b/src/components/SearchBar/SearchBar.tsx @@ -0,0 +1,24 @@ +import { Input } from 'antd'; + +type Props = { + value: string; + placeholder?: string; + onChange: (value: string) => void; + onSearch: (value: string) => void; + onClear?: () => void; +}; + +export function SearchBar({ value, placeholder, onChange, onSearch, onClear }: Props) { + return ( + onChange(e.target.value)} + onSearch={onSearch} + onClear={onClear} + /> + ); +} diff --git a/src/shared/utils/formatPokemonName.ts b/src/shared/utils/formatPokemonName.ts new file mode 100644 index 000000000..1b64f8cb3 --- /dev/null +++ b/src/shared/utils/formatPokemonName.ts @@ -0,0 +1,24 @@ +/** + * Formats Pokémon names for display. + * + * Examples: + * - "mr-mime" -> "Mr Mime" + * - "ho-oh" -> "Ho-Oh" + * - "nidoran-f" -> "Nidoran ♀" + */ +export function formatPokemonName(name: string): string { + if (!name) return ''; + + return name + .split('-') + .map((part) => { + // special cases + if (part === 'mr') return 'Mr'; + if (part === 'jr') return 'Jr'; + if (part === 'f') return '♀️'; + if (part === 'm') return '♂️'; + + return part.charAt(0).toUpperCase() + part.slice(1); + }) + .join(' '); +} From 7e1b30876c81c66a46e399de6203ffbec3a52d28 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 01:08:00 -0300 Subject: [PATCH 06/15] refactor: wire home and pokemons to shared search and index --- src/pages/Home/Home.tsx | 94 ++++++++++++++++----- src/pages/PokemonDetails/PokemonDetails.tsx | 15 +--- src/pages/Pokemons/Pokemons.tsx | 80 +++++++++++++----- 3 files changed, 135 insertions(+), 54 deletions(-) diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 05ca61157..4ce3f4b2a 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -1,34 +1,88 @@ import { useEffect } from 'react'; import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; -import { fetchPokemonPage } from '../../features/pokemon/pokemonThunks'; -import { Row, Col, Card, Skeleton } from 'antd'; +import { fetchPokemonIndex } from '../../features/pokemon/pokemonThunks'; +import { Space, Button } from 'antd'; import { Link } from 'react-router-dom'; +import Title from 'antd/es/typography/Title'; +import { usePokemonIndexSearch } from '../../features/pokemon/hooks/usePokemonIndexSearch'; +import Paragraph from 'antd/es/typography/Paragraph'; +import { PokemonSearch } from '../../components/PokemonSearch'; +import { usePokemonListQueryParams } from '../../features/pokemon/hooks/usePokemonListQueryParams'; -const POKEMONS_PER_PAGE = 12; +const DEFAULT_POKEMONS_LIMIT = 16; +const SEARCH_POKEMONS_LIMIT = 20; export function Home() { const dispatch = useAppDispatch(); - const { list, listStatus } = useAppSelector((state) => state.pokemon); + const { index, indexStatus, indexError } = useAppSelector((state) => state.pokemon); + const qp = usePokemonListQueryParams({ withPage: false }); + const search = usePokemonIndexSearch({ + index, + query: qp.qParam, + page: 1, + pageSize: SEARCH_POKEMONS_LIMIT, + defaultLimit: DEFAULT_POKEMONS_LIMIT, + }); useEffect(() => { - dispatch(fetchPokemonPage({ page: 1, pageSize: POKEMONS_PER_PAGE })); - }, [dispatch]); + if (indexStatus === 'idle') dispatch(fetchPokemonIndex()); + }, [dispatch, indexStatus]); + + const loading = indexStatus === 'loading'; + const error = indexStatus === 'failed' ? (indexError ?? 'Failed to load index') : null; + + const isSearching = search.mode === 'search'; + const items = isSearching ? search.paged : search.defaultItems; + + const showSeeAll = isSearching && search.filtered.length > SEARCH_POKEMONS_LIMIT; return ( -
-

Home

- - - {listStatus === 'succeeded' && list.map((p) => ( - - - - - - ))} - {listStatus === 'loading' && } - {listStatus === 'failed' &&
Não foi possivel carregar
} -
+
+ + + + Pokédex + + + Search and explore pokémon without reloading the page. + + + + { + qp.setInputValue(next); + qp.submit(next); + }} + onClear={qp.clear} + placeholder="Search all pokémon (contains)" + /> + + `/pokemon/${name}`} + extra={ + + {!isSearching && ( + + + + )} + + {showSeeAll ? ( + + + + ) : null} + + } + /> +
); } diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index cca57ebed..2a93c3262 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -4,6 +4,8 @@ import { useParams } from 'react-router-dom'; import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; import { fetchPokemonDetails } from '../../features/pokemon/pokemonThunks'; +import { PokemonImage } from '../../components/PokemonImage/PokemonImage'; +import { formatPokemonName } from '../../shared/utils/formatPokemonName'; export function PokemonDetails() { const dispatch = useAppDispatch(); @@ -26,18 +28,9 @@ export function PokemonDetails() { if (status === 'failed') return
{error}
; return ( - +
- {details.name} +
diff --git a/src/pages/Pokemons/Pokemons.tsx b/src/pages/Pokemons/Pokemons.tsx index 39a07a365..930d1b943 100644 --- a/src/pages/Pokemons/Pokemons.tsx +++ b/src/pages/Pokemons/Pokemons.tsx @@ -1,35 +1,69 @@ -import { Card, Col, Row, Skeleton } from 'antd'; -import { Link } from 'react-router-dom'; -import { fetchPokemonPage } from '../../features/pokemon/pokemonThunks'; -import { useEffect } from 'react'; +import { useEffect, useMemo } from 'react'; +import { Pagination, Space } from 'antd'; import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; +import { fetchPokemonIndex } from '../../features/pokemon/pokemonThunks'; +import { usePokemonIndexSearch } from '../../features/pokemon/hooks/usePokemonIndexSearch'; +import { PokemonSearch } from '../../components/PokemonSearch'; +import { usePokemonListQueryParams } from '../../features/pokemon/hooks/usePokemonListQueryParams'; -const POKEMONS_PER_PAGE = 20; +const PAGE_SIZE = 20; export function Pokemons() { const dispatch = useAppDispatch(); - const { list, listStatus } = useAppSelector((state) => state.pokemon); + const { index, indexStatus, indexError } = useAppSelector((s) => s.pokemon); + const qp = usePokemonListQueryParams({ withPage: true }); useEffect(() => { - dispatch(fetchPokemonPage({ page: 1, pageSize: POKEMONS_PER_PAGE })); - }, [dispatch]); + if (indexStatus === 'idle') dispatch(fetchPokemonIndex()); + }, [dispatch, indexStatus]); + + const search = usePokemonIndexSearch({ + index, + query: qp.qParam, + page: qp.pageParam, + pageSize: PAGE_SIZE, + }); + + const loading = indexStatus === 'loading'; + const error = indexStatus === 'failed' ? (indexError ?? 'Failed to load index') : null; + + const title = useMemo(() => { + if (!qp.qParam.trim()) return 'All pokémon'; + return `Results for “${qp.qParam}”`; + }, [qp.qParam]); return ( -
-

Pokemons

- - - {listStatus === 'succeeded' && - list.map((p) => ( - - - - - - ))} - {listStatus === 'loading' && } - {listStatus === 'failed' &&
Não foi possivel carregar
} -
+
+ + { + qp.setInputValue(next); + qp.submit(next); + }} + onClear={qp.clear} + placeholder="Search all pokémon (contains)" + /> + + `/pokemon/${name}`} + extra={ + + } + /> +
); } From ed83ae7826f8c67c7a3f49f7d27406a44929d6d5 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 18:00:43 -0300 Subject: [PATCH 07/15] refactor: centralize pokemon index preload --- src/components/AppLayout/AppLayout.tsx | 18 ++- src/pages/Home/Home.tsx | 9 +- src/pages/PokemonDetails/PokemonDetails.tsx | 167 +++++++++++++++++--- 3 files changed, 157 insertions(+), 37 deletions(-) diff --git a/src/components/AppLayout/AppLayout.tsx b/src/components/AppLayout/AppLayout.tsx index 64c6faf86..9728e3e5a 100644 --- a/src/components/AppLayout/AppLayout.tsx +++ b/src/components/AppLayout/AppLayout.tsx @@ -1,11 +1,21 @@ -import { Outlet } from "react-router-dom"; -import { Header } from "../Header/Header"; +import { Outlet } from 'react-router-dom'; +import { Header } from '../Header/Header'; +import { fetchPokemonIndex } from '../../features/pokemon/pokemonThunks'; +import { useEffect } from 'react'; +import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; export function AppLayout() { + const dispatch = useAppDispatch(); + const { indexStatus } = useAppSelector((state) => state.pokemon); + + useEffect(() => { + if (indexStatus === 'idle') dispatch(fetchPokemonIndex()); + }, [dispatch, indexStatus]); + return (
-
- +
+
); } diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 4ce3f4b2a..9c3e40cd4 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -1,6 +1,4 @@ -import { useEffect } from 'react'; -import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; -import { fetchPokemonIndex } from '../../features/pokemon/pokemonThunks'; +import { useAppSelector } from '../../app/store/hooks'; import { Space, Button } from 'antd'; import { Link } from 'react-router-dom'; import Title from 'antd/es/typography/Title'; @@ -13,7 +11,6 @@ const DEFAULT_POKEMONS_LIMIT = 16; const SEARCH_POKEMONS_LIMIT = 20; export function Home() { - const dispatch = useAppDispatch(); const { index, indexStatus, indexError } = useAppSelector((state) => state.pokemon); const qp = usePokemonListQueryParams({ withPage: false }); const search = usePokemonIndexSearch({ @@ -24,10 +21,6 @@ export function Home() { defaultLimit: DEFAULT_POKEMONS_LIMIT, }); - useEffect(() => { - if (indexStatus === 'idle') dispatch(fetchPokemonIndex()); - }, [dispatch, indexStatus]); - const loading = indexStatus === 'loading'; const error = indexStatus === 'failed' ? (indexError ?? 'Failed to load index') : null; diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index 2a93c3262..9ba7b3e26 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -1,45 +1,162 @@ -import { useEffect } from 'react'; -import { Card, Skeleton } from 'antd'; -import { useParams } from 'react-router-dom'; +import { useEffect, useMemo } from 'react'; +import { + Alert, + Button, + Card, + Descriptions, + Divider, + Progress, + Skeleton, + Space, + Tag, + Typography, +} from 'antd'; +import { useNavigate, useParams } from 'react-router-dom'; import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; import { fetchPokemonDetails } from '../../features/pokemon/pokemonThunks'; import { PokemonImage } from '../../components/PokemonImage/PokemonImage'; import { formatPokemonName } from '../../shared/utils/formatPokemonName'; +const { Title, Text } = Typography; + +function statPercent(baseStat: number) { + // Most Pokémon base stats fit within ~1..255 + const MAX = 255; + const pct = Math.round((baseStat / MAX) * 100); + return Math.max(0, Math.min(100, pct)); +} + export function PokemonDetails() { const dispatch = useAppDispatch(); - const { name = '' } = useParams(); + const navigate = useNavigate(); + const { name } = useParams<{ name: string }>(); + const normalized = name ? name.toLowerCase() : ''; - const normalized = name.toLowerCase(); + const details = useAppSelector((s) => s.pokemon.detailsByName[normalized]); + const status = useAppSelector((s) => s.pokemon.detailsStatusByName[normalized] ?? 'idle'); + const error = useAppSelector((s) => s.pokemon.detailsErrorByName[normalized] ?? null); - const details = useAppSelector((state) => state.pokemon.detailsByName[normalized]); - const status = useAppSelector((state) => state.pokemon.detailsStatusByName[normalized]); - const error = useAppSelector((state) => state.pokemon.detailsErrorByName[normalized]); + const displayName = useMemo( + () => formatPokemonName(details?.name ?? normalized), + [details?.name, normalized], + ); useEffect(() => { if (!normalized) return; - if (!details) { + + if (!details && status === 'idle') { dispatch(fetchPokemonDetails({ name: normalized })); } - }, [dispatch, normalized, details]); + }, [dispatch, normalized, details, status]); + + if (!normalized) { + return ; + } - if (status === 'loading' || !details) return ; - if (status === 'failed') return
{error}
; + if (status === 'failed') { + return ( +
+ + + + + +
+ ); + } + + if (!details) { + return ( +
+ + + +
+ ); + } return ( - -
- -
- -
- Types: {details.types.map((t) => t.type.name).join(', ')} -
- -
- Abilities: {details.abilities.map((a) => a.ability.name).join(', ')} -
-
+
+ + + + + + + + + + + {displayName} + + #{details.id} + + +
+ +
+
+ + + + + {details.types + .slice() + .sort((a, b) => a.slot - b.slot) + .map((t) => ( + {t.type.name} + ))} + + + + + + {details.abilities.map((a) => ( + + {a.ability.name} + {a.is_hidden ? ' (hidden)' : ''} + + ))} + + + + + + + + Base stats + + + + {details.stats.map((s) => { + const label = s.stat.name.replaceAll('-', ' '); + const pct = statPercent(s.base_stat); + + return ( +
+ + {label} + {s.base_stat} + + +
+ ); + })} +
+
+
+
+
); } From 361ea46cab55e92be6435af28fc1f4aa5a813a8e Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 18:01:06 -0300 Subject: [PATCH 08/15] feat: improve pokemon details UI and error handling --- src/pages/Pokemons/Pokemons.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/pages/Pokemons/Pokemons.tsx b/src/pages/Pokemons/Pokemons.tsx index 930d1b943..c5b512f2c 100644 --- a/src/pages/Pokemons/Pokemons.tsx +++ b/src/pages/Pokemons/Pokemons.tsx @@ -1,7 +1,6 @@ -import { useEffect, useMemo } from 'react'; +import { useMemo } from 'react'; import { Pagination, Space } from 'antd'; -import { useAppDispatch, useAppSelector } from '../../app/store/hooks'; -import { fetchPokemonIndex } from '../../features/pokemon/pokemonThunks'; +import { useAppSelector } from '../../app/store/hooks'; import { usePokemonIndexSearch } from '../../features/pokemon/hooks/usePokemonIndexSearch'; import { PokemonSearch } from '../../components/PokemonSearch'; import { usePokemonListQueryParams } from '../../features/pokemon/hooks/usePokemonListQueryParams'; @@ -9,14 +8,9 @@ import { usePokemonListQueryParams } from '../../features/pokemon/hooks/usePokem const PAGE_SIZE = 20; export function Pokemons() { - const dispatch = useAppDispatch(); const { index, indexStatus, indexError } = useAppSelector((s) => s.pokemon); const qp = usePokemonListQueryParams({ withPage: true }); - useEffect(() => { - if (indexStatus === 'idle') dispatch(fetchPokemonIndex()); - }, [dispatch, indexStatus]); - const search = usePokemonIndexSearch({ index, query: qp.qParam, From 8f3cf590a7587703d07384049ca675dceade599e Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Tue, 27 Jan 2026 18:56:59 -0300 Subject: [PATCH 09/15] test: add unit tests for search, utils and hooks --- package-lock.json | 15 ++++ package.json | 1 + src/shared/utils/formatPokemonName.ts | 20 ++++-- src/tests/components/SearchBar.test.tsx | 72 +++++++++++++++++++ src/tests/hooks/usePokemonIndexSearch.test.ts | 32 +++++++++ src/tests/utils/formatPokemonName.test.ts | 17 +++++ src/tests/utils/normalizeText.test.ts | 16 +++++ src/tests/utils/numbers.test.ts | 21 ++++++ src/tests/utils/searchParams.test.ts | 21 ++++++ vitest.config.ts | 2 +- 10 files changed, 210 insertions(+), 7 deletions(-) create mode 100644 src/tests/components/SearchBar.test.tsx create mode 100644 src/tests/hooks/usePokemonIndexSearch.test.ts create mode 100644 src/tests/utils/formatPokemonName.test.ts create mode 100644 src/tests/utils/normalizeText.test.ts create mode 100644 src/tests/utils/numbers.test.ts create mode 100644 src/tests/utils/searchParams.test.ts diff --git a/package-lock.json b/package-lock.json index e348f2435..163dcb3cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@eslint/js": "^9.39.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/node": "^24.10.1", "@types/react": "^19.2.5", "@types/react-dom": "^19.2.3", @@ -2748,6 +2749,20 @@ } } }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", diff --git a/package.json b/package.json index b703936d2..3d8603d33 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@eslint/js": "^9.39.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/node": "^24.10.1", "@types/react": "^19.2.5", "@types/react-dom": "^19.2.3", diff --git a/src/shared/utils/formatPokemonName.ts b/src/shared/utils/formatPokemonName.ts index 1b64f8cb3..3d35f0dd5 100644 --- a/src/shared/utils/formatPokemonName.ts +++ b/src/shared/utils/formatPokemonName.ts @@ -4,20 +4,28 @@ * Examples: * - "mr-mime" -> "Mr Mime" * - "ho-oh" -> "Ho-Oh" - * - "nidoran-f" -> "Nidoran ♀" + * - "nidoran-f" -> "Nidoran ♀️" + * - "nidoran-m" -> "Nidoran ♂️" */ -export function formatPokemonName(name: string): string { - if (!name) return ''; +const KEEP_HYPHEN_NAMES = new Set(['ho-oh', 'porygon-z', 'jangmo-o', 'hakamo-o', 'kommo-o']); - return name +export function formatPokemonName(slug: string) { + if (!slug) return ''; + + if (KEEP_HYPHEN_NAMES.has(slug)) { + return slug + .split('-') + .map((p) => p.charAt(0).toUpperCase() + p.slice(1)) + .join('-'); + } + + return slug .split('-') .map((part) => { - // special cases if (part === 'mr') return 'Mr'; if (part === 'jr') return 'Jr'; if (part === 'f') return '♀️'; if (part === 'm') return '♂️'; - return part.charAt(0).toUpperCase() + part.slice(1); }) .join(' '); diff --git a/src/tests/components/SearchBar.test.tsx b/src/tests/components/SearchBar.test.tsx new file mode 100644 index 000000000..b5f1b7de0 --- /dev/null +++ b/src/tests/components/SearchBar.test.tsx @@ -0,0 +1,72 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useState } from 'react'; + +import { SearchBar } from '../../components/SearchBar/SearchBar'; + +function ControlledSearchBar(props: { + initialValue?: string; + placeholder?: string; + onSearch?: (value: string) => void; + onClear?: () => void; +}) { + const [value, setValue] = useState(props.initialValue ?? ''); + + return ( + props.onSearch?.(v)} + onClear={props.onClear} + /> + ); +} + +describe('SearchBar', () => { + it('updates value when typing (controlled)', async () => { + const user = userEvent.setup(); + + render(); + + const input = screen.getByPlaceholderText('Search...'); + await user.type(input, 'pikachu'); + + expect((input as HTMLInputElement).value).toBe('pikachu'); + }); + + it('calls onSearch when pressing Enter', async () => { + const user = userEvent.setup(); + const onSearch = vi.fn(); + + render(); + + const input = screen.getByPlaceholderText('Search...'); + await user.type(input, 'raichu{enter}'); + + expect(onSearch).toHaveBeenCalledTimes(1); + expect(onSearch).toHaveBeenCalledWith('raichu'); + }); + + it('clears input when clicking the clear (X) button', async () => { + const user = userEvent.setup(); + const onClear = vi.fn(); + + render(); + + const input = screen.getByPlaceholderText('Search...') as HTMLInputElement; + expect(input.value).toBe('abc'); + + const clearBtn = document.querySelector( + 'button.ant-input-clear-icon', + ) as HTMLButtonElement | null; + expect(clearBtn).not.toBeNull(); + + await user.click(clearBtn!); + + expect(input.value).toBe(''); + + expect(onClear).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/tests/hooks/usePokemonIndexSearch.test.ts b/src/tests/hooks/usePokemonIndexSearch.test.ts new file mode 100644 index 000000000..113eea8f7 --- /dev/null +++ b/src/tests/hooks/usePokemonIndexSearch.test.ts @@ -0,0 +1,32 @@ +import { describe, it, expect } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import { usePokemonIndexSearch } from '../../features/pokemon/hooks/usePokemonIndexSearch'; + +const index = [ + { id: 1, name: 'bulbasaur', url: '' }, + { id: 2, name: 'ivysaur', url: '' }, + { id: 25, name: 'pikachu', url: '' }, + { id: 26, name: 'raichu', url: '' }, +]; + +describe('usePokemonIndexSearch', () => { + it('returns default mode when query is empty', () => { + const { result } = renderHook(() => + usePokemonIndexSearch({ index, query: '', page: 1, pageSize: 2, defaultLimit: 2 }), + ); + + expect(result.current.mode).toBe('default'); + expect(result.current.defaultItems).toHaveLength(2); + }); + + it('filters and paginates when query is present', () => { + const { result } = renderHook(() => + usePokemonIndexSearch({ index, query: 'chu', page: 1, pageSize: 1 }), + ); + + expect(result.current.mode).toBe('search'); + expect(result.current.filtered.map((p) => p.name)).toContain('pikachu'); + expect(result.current.total).toBe(result.current.filtered.length); + expect(result.current.paged).toHaveLength(1); + }); +}); diff --git a/src/tests/utils/formatPokemonName.test.ts b/src/tests/utils/formatPokemonName.test.ts new file mode 100644 index 000000000..1a948c0ac --- /dev/null +++ b/src/tests/utils/formatPokemonName.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { formatPokemonName } from '../../shared/utils/formatPokemonName'; + +describe('formatPokemonName', () => { + it('capitalizes and replaces dashes', () => { + expect(formatPokemonName('mr-mime')).toBe('Mr Mime'); + }); + + it('keeps hyphen for special names', () => { + expect(formatPokemonName('ho-oh')).toBe('Ho-Oh'); + expect(formatPokemonName('porygon-z')).toBe('Porygon-Z'); + }); + + it('handles empty', () => { + expect(formatPokemonName('')).toBe(''); + }); +}); diff --git a/src/tests/utils/normalizeText.test.ts b/src/tests/utils/normalizeText.test.ts new file mode 100644 index 000000000..efd8eaf8d --- /dev/null +++ b/src/tests/utils/normalizeText.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { normalizeText } from '../../shared/utils/normalizeText'; + +describe('normalizeText', () => { + it('lowercases and trims', () => { + expect(normalizeText(' Pikachu ')).toBe('pikachu'); + }); + + it('removes accents', () => { + expect(normalizeText('Pókémón')).toBe('pokemon'); + }); + + it('handles empty', () => { + expect(normalizeText('')).toBe(''); + }); +}); diff --git a/src/tests/utils/numbers.test.ts b/src/tests/utils/numbers.test.ts new file mode 100644 index 000000000..fbe530fc1 --- /dev/null +++ b/src/tests/utils/numbers.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from 'vitest'; +import { toPositiveInt } from '../../shared/utils/numbers'; + +describe('toPositiveInt', () => { + it('returns fallback for null', () => { + expect(toPositiveInt(null, 1)).toBe(1); + }); + + it('returns fallback for NaN/invalid', () => { + expect(toPositiveInt('abc', 2)).toBe(2); + }); + + it('floors decimals and keeps positive', () => { + expect(toPositiveInt('3.9', 1)).toBe(3); + }); + + it('returns fallback for <= 0', () => { + expect(toPositiveInt('0', 5)).toBe(5); + expect(toPositiveInt('-10', 5)).toBe(5); + }); +}); diff --git a/src/tests/utils/searchParams.test.ts b/src/tests/utils/searchParams.test.ts new file mode 100644 index 000000000..c98a77334 --- /dev/null +++ b/src/tests/utils/searchParams.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from 'vitest'; +import { buildPokemonListSearchParams } from '../../shared/utils/searchParams'; + +describe('buildPokemonListSearchParams', () => { + it('omits empty q and keeps page', () => { + const p = buildPokemonListSearchParams({ q: '', page: 1 }); + expect(p).toEqual({ page: '1' }); + }); + + it('sets q and page', () => { + const p = buildPokemonListSearchParams({ q: 'pi', page: 2 }); + expect(p).toEqual({ q: 'pi', page: '2' }); + }); +}); + +describe('buildPokemonListSearchParams', () => { + it('omits empty q and keeps page', () => { + const p = buildPokemonListSearchParams({ q: '', page: 1 }); + expect(p).toEqual({ page: '1' }); + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts index 73b587b49..a59946d9d 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ plugins: [react()], test: { environment: 'jsdom', - setupFiles: ['./src/test/setupTests.ts'], + setupFiles: ['./src/tests/setupTests.ts'], globals: true, css: true, }, From 5438c6c1d069434be746830487bfa44daa786e1d Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Wed, 28 Jan 2026 16:25:01 -0300 Subject: [PATCH 10/15] perf: optimize image loading to improve LCP --- src/components/PokemonGrid/PokemonGrid.tsx | 4 ++-- src/components/PokemonImage/PokemonImage.tsx | 7 +++++-- src/pages/Home/Home.tsx | 6 +++--- src/pages/PokemonDetails/PokemonDetails.tsx | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/PokemonGrid/PokemonGrid.tsx b/src/components/PokemonGrid/PokemonGrid.tsx index 3a63d86ca..3e5919dce 100644 --- a/src/components/PokemonGrid/PokemonGrid.tsx +++ b/src/components/PokemonGrid/PokemonGrid.tsx @@ -12,12 +12,12 @@ type Props = { export function PokemonGrid({ items, detailsPath }: Props) { return ( - {items.map((p) => ( + {items.map((p, index) => ( } + cover={} > diff --git a/src/components/PokemonImage/PokemonImage.tsx b/src/components/PokemonImage/PokemonImage.tsx index 5475bce0b..43c9f2b56 100644 --- a/src/components/PokemonImage/PokemonImage.tsx +++ b/src/components/PokemonImage/PokemonImage.tsx @@ -8,6 +8,7 @@ type Props = { height?: number; padding?: number; variant?: 'artwork' | 'sprite'; + priority?: boolean style?: React.CSSProperties; }; @@ -26,6 +27,7 @@ export function PokemonImage({ height = 180, padding = 12, variant = 'artwork', + priority, style, }: Props) { const [attempt, setAttempt] = useState(0); @@ -45,11 +47,12 @@ export function PokemonImage({ {alt { setAttempt((prev) => (prev < urls.length - 1 ? prev + 1 : prev)); }} - style={{ padding, height, objectFit: 'contain', ...style }} + style={{ padding, height, objectFit: 'contain', aspectRatio: '1 / 1', ...style }} /> ); } diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 9c3e40cd4..f66e18f78 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -1,15 +1,15 @@ import { useAppSelector } from '../../app/store/hooks'; -import { Space, Button } from 'antd'; +import { Space, Button, Typography } from 'antd'; import { Link } from 'react-router-dom'; -import Title from 'antd/es/typography/Title'; import { usePokemonIndexSearch } from '../../features/pokemon/hooks/usePokemonIndexSearch'; -import Paragraph from 'antd/es/typography/Paragraph'; import { PokemonSearch } from '../../components/PokemonSearch'; import { usePokemonListQueryParams } from '../../features/pokemon/hooks/usePokemonListQueryParams'; const DEFAULT_POKEMONS_LIMIT = 16; const SEARCH_POKEMONS_LIMIT = 20; +const { Title, Paragraph } = Typography; + export function Home() { const { index, indexStatus, indexError } = useAppSelector((state) => state.pokemon); const qp = usePokemonListQueryParams({ withPage: false }); diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index 9ba7b3e26..3530c5411 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -104,7 +104,7 @@ export function PokemonDetails() {
- +
From f885968d4da73990ecf0d952243e6743450863d8 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Wed, 28 Jan 2026 18:01:46 -0300 Subject: [PATCH 11/15] chore: setup global styles, fonts and app metadata --- index.html | 24 ++++++++++++++++-- public/favicon.svg | 9 +++++++ public/fonts/Luckiest-Guy-Regular.woff2 | Bin 0 -> 17360 bytes public/fonts/Nunito-Variable.woff2 | Bin 0 -> 121364 bytes public/vite.svg | 1 - src/assets/react.svg | 1 - src/main.tsx | 12 ++++++++- src/styles/fonts.css | 17 +++++++++++++ src/styles/global.css | 31 ++++++++++++++++++++++++ 9 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 public/favicon.svg create mode 100644 public/fonts/Luckiest-Guy-Regular.woff2 create mode 100644 public/fonts/Nunito-Variable.woff2 delete mode 100644 public/vite.svg delete mode 100644 src/assets/react.svg create mode 100644 src/styles/fonts.css create mode 100644 src/styles/global.css diff --git a/index.html b/index.html index 3da6db1df..a618db6f3 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,29 @@ - + - react-ts + + LooqDex + + + +
diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 000000000..06e9e4883 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/fonts/Luckiest-Guy-Regular.woff2 b/public/fonts/Luckiest-Guy-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a1c865f32707a7d20466eb40e257bd329eda6ac7 GIT binary patch literal 17360 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 oZ#mff^lJCp7}nlS_s?s_5Fj)TT=iJOfPXd?HEb
diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 09650b86b..d69300b32 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,27 +1,116 @@ -import type { MenuProps } from 'antd'; -import { Menu } from 'antd'; +import { Button, Drawer, Menu, type MenuProps, Grid } from 'antd'; +import { CloseOutlined, MenuOutlined } from '@ant-design/icons'; import { Link, useLocation } from 'react-router-dom'; +import { useMemo, useState } from 'react'; -type MenuItem = Required['items'][number]; +const { useBreakpoint } = Grid; -const items: MenuItem[] = [ - { - label: Home, - key: 'home', - }, - { - label: Pokémons, - key: 'pokemons', - }, -]; +type MenuItem = Required['items'][number]; export function Header() { const { pathname } = useLocation(); - const selectedKey = (() => { + const screens = useBreakpoint(); + const isMobile = !screens.md; + + const [open, setOpen] = useState(false); + + const selectedKeys = useMemo(() => { if (pathname === '/') return ['home']; if (pathname.startsWith('/pokemons') || pathname.startsWith('/pokemon')) return ['pokemons']; return []; - })(); + }, [pathname]); + + const items: MenuItem[] = [ + { + key: 'home', + label: ( + + + Home + + + ), + onClick: () => setOpen(false), + }, + { + key: 'pokemons', + label: ( + + + Pokédex + + + ), + onClick: () => setOpen(false), + }, + ]; + + if (isMobile) { + return ( +
+
+ + Looqbox + + +
+ + setOpen(false)} + size="100vh" + closable={false} + styles={{ body: { padding: 0 } }} + > +
+
+ Looqbox +
+ + +
+
+
+ ); + } + + return ( +
+ + + + + Home + + + + + - return ; + + + + Pokédex + + + + +
+ ); } diff --git a/src/components/PokemonGrid/PokemonGrid.tsx b/src/components/PokemonGrid/PokemonGrid.tsx index 3e5919dce..b63e4cddc 100644 --- a/src/components/PokemonGrid/PokemonGrid.tsx +++ b/src/components/PokemonGrid/PokemonGrid.tsx @@ -11,9 +11,9 @@ type Props = { export function PokemonGrid({ items, detailsPath }: Props) { return ( - + {items.map((p, index) => ( - + { setAttempt((prev) => (prev < urls.length - 1 ? prev + 1 : prev)); }} - style={{ padding, height, objectFit: 'contain', aspectRatio: '1 / 1', ...style }} + width={width} + height={height} + style={{ padding, width, height, objectFit: 'contain', aspectRatio: '1 / 1', ...style }} /> ); } diff --git a/src/components/PokemonSearch/PokemonSearchInput.tsx b/src/components/PokemonSearch/PokemonSearchInput.tsx index 59eaf6a94..c58d284f8 100644 --- a/src/components/PokemonSearch/PokemonSearchInput.tsx +++ b/src/components/PokemonSearch/PokemonSearchInput.tsx @@ -43,12 +43,14 @@ export function PokemonSearchInput({ placeholder, query, onSubmitQuery, onClear } return ( - +
+ +
); } diff --git a/src/components/PokemonSearch/PokemonSearchResults.tsx b/src/components/PokemonSearch/PokemonSearchResults.tsx index 80098b7ea..f7cdbb03a 100644 --- a/src/components/PokemonSearch/PokemonSearchResults.tsx +++ b/src/components/PokemonSearch/PokemonSearchResults.tsx @@ -1,26 +1,42 @@ import { Alert, Empty, Skeleton, Space, Typography } from 'antd'; import type { PokemonIndexItem } from '../../services/pokeapi'; import { PokemonGrid } from '../PokemonGrid/PokemonGrid'; +import emptySearchImg from '../../assets/icons/search_empty_icon.svg'; -const { Title } = Typography; +const { Title, Text } = Typography; type Props = { title?: string; loading: boolean; error?: string | null; items: PokemonIndexItem[]; - emptyText?: string; showEmpty?: boolean; extra?: React.ReactNode; detailsPath: (name: string) => string; }; +export function SearchEmptyState() { + return ( + + + No Pokémon Found + + Try adjusting your search or filters + + } + className='pokemon-search-empty-state' + /> + ); +} + export function PokemonSearchResults({ title, loading, error, items, - emptyText = 'No results found', showEmpty = false, extra, detailsPath, @@ -28,11 +44,11 @@ export function PokemonSearchResults({ if (loading) return ; if (error) { - return ; + return ; } if (showEmpty && items.length === 0) { - return ; + return ; } return ( diff --git a/src/main.tsx b/src/main.tsx index 787fdcf46..6d1b1a1f8 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -14,6 +14,15 @@ createRoot(document.getElementById('root')!).render( theme={{ token: { fontFamily: 'Nunito, system-ui, sans-serif', + colorPrimary: '#ff6d1b', + colorInfo: '#ff6d1b', + borderRadius: 12, + }, + components: { + Button: { + colorPrimaryHover: '#ff833b', + colorPrimaryActive: '#e85f14', + }, }, }} > diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index f66e18f78..0c56a140f 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -30,14 +30,14 @@ export function Home() { const showSeeAll = isSearching && search.filtered.length > SEARCH_POKEMONS_LIMIT; return ( -
+
- - Pokédex + <Title level={2} style={{ margin: 0 }} className='section-title'> + Discover the Pokémon World - - Search and explore pokémon without reloading the page. + + Search for Pokémon, explore their types, and dive into their details.
Start here or view the complete Pokédex.
@@ -48,11 +48,11 @@ export function Home() { qp.submit(next); }} onClear={qp.clear} - placeholder="Search all pokémon (contains)" + placeholder="Search by name (e.g., pikachu, mr mime)" /> `/pokemon/${name}`} extra={ - + {!isSearching && ( - + )} {showSeeAll ? ( - + ) : null} diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index 3530c5411..ac916b7f5 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -51,7 +51,14 @@ export function PokemonDetails() { }, [dispatch, normalized, details, status]); if (!normalized) { - return ; + return ( + + ); } if (status === 'failed') { @@ -64,6 +71,7 @@ export function PokemonDetails() { showIcon title="Failed to load Pokémon details" description={error ?? 'Unknown error'} + className="looq-alert" /> - - - -
- ); - } + if (!species && speciesStatus === 'idle') { + dispatch(fetchPokemonSpecies({ name: normalized })); + } - if (!details) { - return ( -
- - - -
- ); - } + if (species?.evolutionChainUrl && !evolution && evolutionStatus === 'idle') { + dispatch( + fetchPokemonEvolutionChain({ + name: normalized, + evolutionChainUrl: species.evolutionChainUrl, + }), + ); + } + }, [ + dispatch, + normalized, + details, + detailsStatus, + species, + speciesStatus, + evolution, + evolutionStatus, + ]); + + const getPokemonIdByName = useMemo(() => { + const map = new Map(); + for (const p of index) map.set(p.name.toLowerCase(), p.id); + + return (pokemonName: string) => map.get(pokemonName.toLowerCase()) ?? null; + }, [index]); return ( -
- - - - - - - - - - - {displayName} - - #{details.id} - - -
- -
-
- - - - - {details.types - .slice() - .sort((a, b) => a.slot - b.slot) - .map((t) => ( - {t.type.name} - ))} - - - - - - {details.abilities.map((a) => ( - - {a.ability.name} - {a.is_hidden ? ' (hidden)' : ''} - - ))} - - - - - - - - Base stats - - - - {details.stats.map((s) => { - const label = s.stat.name.replaceAll('-', ' '); - const pct = statPercent(s.base_stat); - - return ( -
- - {label} - {s.base_stat} - - -
- ); - })} -
-
-
-
-
+ navigate(-1)} + getPokemonIdByName={getPokemonIdByName} + details={{ + data: details, + status: detailsStatus, + error: detailsError, + }} + species={{ + data: species, + status: speciesStatus, + error: speciesError, + }} + evolution={{ + data: evolution, + status: evolutionStatus, + error: evolutionError, + }} + /> ); } diff --git a/src/pages/PokemonDetails/PokemonDetailsView.tsx b/src/pages/PokemonDetails/PokemonDetailsView.tsx new file mode 100644 index 000000000..9f3fbf762 --- /dev/null +++ b/src/pages/PokemonDetails/PokemonDetailsView.tsx @@ -0,0 +1,205 @@ +import { Alert, Button, Card, Divider, Skeleton, Space, Typography } from 'antd'; + +import { PokemonImage } from '../../components/PokemonImage/PokemonImage'; +import { formatPokemonName } from '../../shared/utils/formatPokemonName'; +import { dmToMeters, hgToKg, padDex } from './utils'; +import { StatsRings } from './components/StatsRings'; +import { EvolutionRow } from './components/EvolutionRow'; +import { PokemonTypeTag } from '../../components/PokemonTypeTag'; +import type { PokemonType } from '../../shared/pokemon/types'; + +const { Title, Text, Paragraph } = Typography; + +export type Status = 'idle' | 'loading' | 'succeeded' | 'failed'; + +export type DetailsBlock = { + data: T | undefined; + status: Status; + error: string | null; +}; + +export type PokemonDetailsViewProps = { + normalized: string; + + details: DetailsBlock<{ + id: number; + name: string; + height: number; + weight: number; + types: Array<{ slot: number; type: { name: PokemonType } }>; + abilities: Array<{ ability: { name: string }; is_hidden: boolean }>; + stats: Array<{ base_stat: number; stat: { name: string } }>; + }>; + + species: DetailsBlock<{ + description: string; + captureRate: number | null; + }>; + + evolution: DetailsBlock; + + displayName: string; + onBack: () => void; + + getPokemonIdByName: (name: string) => number | null; +}; + +export function PokemonDetailsView({ + normalized, + details, + species, + evolution, + displayName, + onBack, + getPokemonIdByName, +}: PokemonDetailsViewProps) { + if (!normalized) { + return ( + + ); + } + + const anyFailed = + details.status === 'failed' || species.status === 'failed' || evolution.status === 'failed'; + + const anyError = details.error ?? species.error ?? evolution.error ?? 'Unknown error'; + + if (anyFailed) { + return ( +
+ + + + + +
+ ); + } + + if (!details.data) { + return ( +
+ +
+ ); + } + + const d = details.data; + const topTypes = d.types + .slice() + .sort((a, b) => a.slot - b.slot) + .map((t) => t.type.name); + + const description = species.data?.description ?? ''; + const captureRate = species.data?.captureRate ?? null; + + return ( +
+ +
+ +
+ +
+
+ +
+ +
+ {padDex(d.id)} + + + {displayName} + + + + {topTypes.map((t) => ( + + ))} + + + {species.status === 'loading' ? ( + + ) : ( + + {description || 'No description available.'} + + )} + +
+
+ Height + {dmToMeters(d.height)} +
+ +
+ Weight + {hgToKg(d.weight)} +
+
+ + + + + Abilities + + +
+ {d.abilities.map((a) => ( +
+ {formatPokemonName(a.ability.name)} + {a.is_hidden ? ' (hidden)' : ''} +
+ ))} +
+
+
+ +
+ +
+ + + + + Evolution + + + {evolution.status === 'loading' ? ( + + ) : evolution.data?.length ? ( + + ) : ( + No evolution data available. + )} +
+
+ ); +} diff --git a/src/pages/PokemonDetails/components/EvolutionRow.tsx b/src/pages/PokemonDetails/components/EvolutionRow.tsx new file mode 100644 index 000000000..4a857515c --- /dev/null +++ b/src/pages/PokemonDetails/components/EvolutionRow.tsx @@ -0,0 +1,37 @@ +import { Link } from 'react-router-dom'; +import { PokemonImage } from '../../../components/PokemonImage/PokemonImage'; +import { formatPokemonName } from '../../../shared/utils/formatPokemonName'; + +type Props = { + names: string[]; + getPokemonIdByName: (name: string) => number | null; +}; + +export function EvolutionRow({ names, getPokemonIdByName }: Props) { + const evolutionsImagesSize: number[] = [100, 160, 200]; + + return ( +
+ {names.map((name, index) => { + const id = getPokemonIdByName(name); + + return ( +
+ + + +
{formatPokemonName(name)}
+ + + {index < names.length - 1 &&
} +
+ ); + })} +
+ ); +} diff --git a/src/pages/PokemonDetails/components/StatsRings.tsx b/src/pages/PokemonDetails/components/StatsRings.tsx new file mode 100644 index 000000000..0b4ea0fa7 --- /dev/null +++ b/src/pages/PokemonDetails/components/StatsRings.tsx @@ -0,0 +1,73 @@ +import { Progress, Typography } from 'antd'; +import { buildStatMap, statPercent, captureRatePercent } from '../utils'; + +const { Title } = Typography; + +type Stat = { + base_stat: number; + stat: { name: string }; +}; + +type Props = { + stats: Stat[]; + captureRate: number | null; +}; + +export function StatsRings({ stats, captureRate }: Props) { + const statMap = buildStatMap(stats); + + const hp = statMap.get('hp') ?? 0; + const atk = statMap.get('attack') ?? 0; + const def = statMap.get('defense') ?? 0; + const spa = statMap.get('special-attack') ?? 0; + const spd = statMap.get('special-defense') ?? 0; + const spe = statMap.get('speed') ?? 0; + + return ( + <> +
+ + + + + + +
+ +
+ + Capture Rate + + + (captureRate == null ? '—' : `${captureRatePercent(captureRate)}%`)} + /> +
+ + ); +} + +type StatRingProps = { + label: string; + value: number; +}; + +function StatRing({ label, value }: StatRingProps) { + return ( +
+ String(value)} + className={`stat-ring--${label.toLowerCase().replace(' ', '-')}`} + /> +
{label}
+
+ ); +} diff --git a/src/pages/PokemonDetails/index.ts b/src/pages/PokemonDetails/index.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/pages/PokemonDetails/utils.ts b/src/pages/PokemonDetails/utils.ts new file mode 100644 index 000000000..e1062d02d --- /dev/null +++ b/src/pages/PokemonDetails/utils.ts @@ -0,0 +1,29 @@ +export function clampPercent(v: number) { + return Math.max(0, Math.min(100, v)); +} + +export function statPercent(baseStat: number) { + return clampPercent(Math.round((baseStat / 255) * 100)); +} + +export function captureRatePercent(captureRate: number) { + return clampPercent(Math.round((captureRate / 255) * 100)); +} + +export function dmToMeters(dm: number) { + return `${(dm / 10).toFixed(1)}m`; +} + +export function hgToKg(hg: number) { + return `${(hg / 10).toFixed(1)}kg`; +} + +export function padDex(id: number) { + return `#${String(id).padStart(3, '0')}`; +} + +export function buildStatMap(stats: Array<{ base_stat: number; stat: { name: string } }>) { + const map = new Map(); + for (const s of stats) map.set(s.stat.name, s.base_stat); + return map; +} diff --git a/src/services/pokeapi.ts b/src/services/pokeapi.ts index 499c49e95..59b2dc89e 100644 --- a/src/services/pokeapi.ts +++ b/src/services/pokeapi.ts @@ -37,13 +37,15 @@ export type PokemonDetails = { is_hidden: boolean; }>; stats: Array<{ - base_stat: number; + base_stat: number; stat: { name: string }; }>; + height: number; + weight: number; }; const BASE_URL = 'https://pokeapi.co/api/v2'; -const api = axios.create({ +export const api = axios.create({ baseURL: BASE_URL, timeout: 10_000, }); @@ -102,4 +104,4 @@ export async function getPokemonIndex(): Promise { } catch { throw new Error('Failed to fetch pokémon index'); } -} \ No newline at end of file +} diff --git a/src/shared/pokemon/typeIcons.ts b/src/shared/pokemon/typeIcons.ts new file mode 100644 index 000000000..303a318c8 --- /dev/null +++ b/src/shared/pokemon/typeIcons.ts @@ -0,0 +1,41 @@ +import type { PokemonType } from './types'; + +import normal from '../../assets/icons/types/normal.svg'; +import fire from '../../assets/icons/types/fire.svg'; +import water from '../../assets/icons/types/water.svg'; +import electric from '../../assets/icons/types/electric.svg'; +import grass from '../../assets/icons/types/grass.svg'; +import ice from '../../assets/icons/types/ice.svg'; +import fighting from '../../assets/icons/types/fighting.svg'; +import poison from '../../assets/icons/types/poison.svg'; +import ground from '../../assets/icons/types/ground.svg'; +import flying from '../../assets/icons/types/flying.svg'; +import psychic from '../../assets/icons/types/psychic.svg'; +import bug from '../../assets/icons/types/bug.svg'; +import rock from '../../assets/icons/types/rock.svg'; +import ghost from '../../assets/icons/types/ghost.svg'; +import dragon from '../../assets/icons/types/dragon.svg'; +import dark from '../../assets/icons/types/dark.svg'; +import steel from '../../assets/icons/types/steel.svg'; +import fairy from '../../assets/icons/types/fairy.svg'; + +export const typeIconSrc: Record = { + normal, + fire, + water, + electric, + grass, + ice, + fighting, + poison, + ground, + flying, + psychic, + bug, + rock, + ghost, + dragon, + dark, + steel, + fairy, +}; diff --git a/src/shared/pokemon/types.ts b/src/shared/pokemon/types.ts new file mode 100644 index 000000000..0e3e72a06 --- /dev/null +++ b/src/shared/pokemon/types.ts @@ -0,0 +1,26 @@ +export const POKEMON_TYPES = [ + 'normal', + 'fire', + 'water', + 'electric', + 'grass', + 'ice', + 'fighting', + 'poison', + 'ground', + 'flying', + 'psychic', + 'bug', + 'rock', + 'ghost', + 'dragon', + 'dark', + 'steel', + 'fairy', +] as const; + +export type PokemonType = (typeof POKEMON_TYPES)[number]; + +export function isPokemonType(v: string): v is PokemonType { + return (POKEMON_TYPES as readonly string[]).includes(v); +} diff --git a/src/shared/utils/normalizeText.ts b/src/shared/utils/normalizeText.ts index 7541d016c..e8f183fdc 100644 --- a/src/shared/utils/normalizeText.ts +++ b/src/shared/utils/normalizeText.ts @@ -11,4 +11,8 @@ export function normalizeText(value: string) { .replace(/[\u0300-\u036f]/g, '') .replace(/\s+/g, '-') .replace(/[^a-z0-9-]/g, ''); +} + +export function normalize(name: string) { + return name.trim().toLowerCase(); } \ No newline at end of file diff --git a/src/styles/components/_components.css b/src/styles/components/_components.css index 9a10bfb83..2f7ea0131 100644 --- a/src/styles/components/_components.css +++ b/src/styles/components/_components.css @@ -2,3 +2,5 @@ @import './search.css'; @import './cards.css'; @import './pokemon-grid.css'; +@import './pokemon-details.css'; +@import './type-tag.css'; \ No newline at end of file diff --git a/src/styles/components/pokemon-details.css b/src/styles/components/pokemon-details.css new file mode 100644 index 000000000..1440418f7 --- /dev/null +++ b/src/styles/components/pokemon-details.css @@ -0,0 +1,224 @@ +.pokemon-details-card { + position: relative; + border-radius: 22px; + padding: 72px 84px; +} + +.pokemon-details-card .back-btn-container { + position: absolute; + left: 32px; + top: 28px; +} + +.back-btn-container path { + transition: all 0.3s ease; +} + +.back-btn-container:hover path, +.back-btn-container:focus path { + fill: #ff6d1b; +} + +.pokemon-details-top { + display: grid; + grid-template-columns: 1.1fr 1fr; + gap: 24px; + align-items: start; +} + +.pokemon-details-image { + display: flex; + justify-content: center; + align-items: center; + min-height: 260px; +} + +.pokemon-details-title { + font-family: 'Luckiest Guy', system-ui, sans-serif; + font-size: clamp(44px, 5vw, 64px) !important; + line-height: 1; + letter-spacing: 1px; + color: #ffcb05 !important; + -webkit-text-stroke: 2px #2a75bb; + letter-spacing: -2px !important; + margin: 0 !important; +} + +.pokemon-details-info .ant-typography-secondary { + font-size: 14px !important; +} + +.pokemon-details-description { + margin: 20px 0 0 !important; + max-width: 420px; + color: #4b4b4b; + font-weight: 600; + font-size: 16px; +} + +.pokemon-details-metrics { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-top: 12px; +} + +.metric { + background: #f6f8fc; + border-radius: 10px; + padding: 10px 12px; + display: flex; + justify-content: space-between; +} + +.pokemon-details-abilities { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-top: 8px; +} + +.ability-pill { + background: #f6f8fc; + border-radius: 10px; + padding: 10px 12px; + text-align: center; + font-weight: 700; +} + +.pokemon-details-stats { + margin: 80px 0; + display: grid; + grid-template-columns: 1fr 260px; + gap: 24px; + align-items: start; +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(3, minmax(120px, 1fr)); + gap: 18px; +} + +.stat-ring--hp .ant-progress-circle-path { + stroke: #34c677 !important; +} + +.stat-ring--speed .ant-progress-circle-path { + stroke: #ffcc03 !important; +} + +.stat-ring--attack .ant-progress-circle-path { + stroke: #ef2139 !important; +} + +.stat-ring--defense .ant-progress-circle-path { + stroke: #fe7571 !important; +} + +.stat-ring--special-attack .ant-progress-circle-path { + stroke: #bd5bf6 !important; +} + +.stat-ring--special-defense .ant-progress-circle-path { + stroke: #2aaaed !important; +} + +.ant-progress-circle-path { + stroke: red !important; +} + +.stat-ring { + display: grid; + justify-items: center; + gap: 8px; +} + +.stat-label { + font-weight: 800; + color: #3a3a3a; +} + +.capture-rate { + display: grid; + justify-items: center; + gap: 14px; +} + +.capture-rate .ant-progress-circle-path { + stroke: #ff6d1b !important; +} + +.evolution-row { + display: flex; + justify-content: center; + align-items: flex-end; + gap: 60px; + padding: 14px 0; + flex-wrap: wrap; +} + +.evolution-item { + display: flex; + align-items: center; + gap: 16px; +} + +.evolution-arrow { + font-size: 28px; + font-weight: 800; + color: #2a2a2a; +} + +.evolution-label { + text-align: center; + font-weight: 800; + margin-top: 6px; +} + +@media (max-width: 900px) { + .pokemon-details-card { + padding: 60px 40px; + } + + .pokemon-details-top { + grid-template-columns: 1fr; + } + + .pokemon-details-stats { + grid-template-columns: 1fr; + } + + .stats-grid { + grid-template-columns: repeat(2, minmax(120px, 1fr)); + } +} + +@media (max-width: 768px) { + .pokemon-details-card { + padding: 32px 16px; + } + + .pokemon-details-metrics, + .pokemon-details-abilities, + .stats-grid, + .evolution-item { + display: flex !important; + flex-direction: column; + } + + .evolution-row { + align-items: center !important; + gap: 20px !important; + flex-direction: column; + } + + .evolution-arrow { + rotate: 90deg; + } + + .pokemon-details-card .back-btn-container { + left: 16px; + top: 16px; + } +} diff --git a/src/styles/components/type-tag.css b/src/styles/components/type-tag.css new file mode 100644 index 000000000..96338b36c --- /dev/null +++ b/src/styles/components/type-tag.css @@ -0,0 +1,36 @@ +.type-tag { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 10px; + background: none; +} + +.type-tag__icon { + width: 16px; + height: 16px; + display: block; +} + +.type-tag__text { + font-size: 14px; + font-weight: 700; +} + +.type-tag--fire { color: #FF8713; } +.type-tag--water { color: #68B5E5; } +.type-tag--electric { color: #FFC700; } +.type-tag--grass { color: #34C677; } +.type-tag--ice { color: #77D3C3; } +.type-tag--fighting { color: #E80011; } +.type-tag--poison { color: #C645E1; } +.type-tag--ground { color: #D17F46; } +.type-tag--flying { color: #9FB9EB; } +.type-tag--psychic { color: #FE7571; } +.type-tag--bug { color: #A2C629; } +.type-tag--rock { color: #D4AD30; } +.type-tag--ghost { color: #7272D2; } +.type-tag--dragon { color: #0A6DCA; } +.type-tag--dark { color: #5D5F6A; } +.type-tag--steel { color: #5AA7AA; } +.type-tag--fairy { color: #F29FE5; } \ No newline at end of file From e65d4d3708c56764563e32fc79bf11a7dd3df819 Mon Sep 17 00:00:00 2001 From: CaueFidelis Date: Thu, 29 Jan 2026 10:29:04 -0300 Subject: [PATCH 14/15] chore: lint, format, build optimizations and UI/perf fixes --- index.html | 15 ---- src/app/routes/Router.tsx | 17 +++-- src/app/store/hooks.ts | 2 +- src/app/store/store.ts | 2 +- src/components/Header/Header.tsx | 66 +++++++++++------- src/components/PokemonGrid/PokemonGrid.tsx | 18 +++-- src/components/PokemonImage/PokemonImage.tsx | 2 +- .../PokemonSearch/PokemonSearchResults.tsx | 12 +++- .../pokemon/hooks/usePokemonDetailsData.ts | 2 +- src/features/pokemon/pokemonSlice.ts | 30 ++++---- src/features/pokemon/pokemonThunks.ts | 6 +- .../pokemon/selectors/pokemonSelectors.ts | 2 +- src/pages/Home/Home.tsx | 21 +++--- src/pages/PokemonDetails/PokemonDetails.tsx | 2 +- .../PokemonDetails/PokemonDetailsView.tsx | 15 +++- src/pages/Pokemons/Pokemons.tsx | 4 +- src/services/pokeapi.ts | 5 +- src/shared/utils/normalizeText.ts | 2 +- src/shared/utils/numbers.ts | 2 +- src/styles/components/_components.css | 2 +- src/styles/components/header.css | 48 +++++++------ src/styles/components/type-tag.css | 68 ++++++++++++++----- src/styles/fonts.css | 8 +-- src/styles/global.css | 2 +- src/styles/theme.css | 2 +- vite.config.ts | 12 ++++ 26 files changed, 232 insertions(+), 135 deletions(-) diff --git a/index.html b/index.html index a618db6f3..c13fad115 100644 --- a/index.html +++ b/index.html @@ -10,21 +10,6 @@ name="description" content="LooqDex — a Pokémon browser built for the Looqbox Frontend Challenge. Search, paginate and view details using the PokeAPI." /> - - -
diff --git a/src/app/routes/Router.tsx b/src/app/routes/Router.tsx index 2ec7fadd9..6974f5aa3 100644 --- a/src/app/routes/Router.tsx +++ b/src/app/routes/Router.tsx @@ -1,17 +1,20 @@ +import { lazy, Suspense } from 'react'; import { createBrowserRouter } from 'react-router-dom'; import { AppLayout } from '../../components/AppLayout/AppLayout'; -import { Pokemons } from '../../pages/Pokemons/Pokemons'; -import { PokemonDetails } from '../../pages/PokemonDetails/PokemonDetails'; -import { Home } from '../../pages/Home/Home'; + +const Home = lazy(() => import('../../pages/Home/Home')); +const Pokemons = lazy(() => import('../../pages/Pokemons/Pokemons')); +const PokemonDetails = lazy(() => import('../../pages/PokemonDetails/PokemonDetails')); + +const withSuspense = (node: React.ReactNode) => }>{node}; export const router = createBrowserRouter([ { element: , children: [ - { path: '/', element: }, - { path: '/pokemons', element: }, - { path: '/pokemon/:name', element: }, - { path: '*', element:
404 Not Found
}, + { path: '/', element: withSuspense() }, + { path: '/pokemons', element: withSuspense() }, + { path: '/pokemon/:name', element: withSuspense() }, ], }, ]); diff --git a/src/app/store/hooks.ts b/src/app/store/hooks.ts index 0353ea3f6..accbf6dbf 100644 --- a/src/app/store/hooks.ts +++ b/src/app/store/hooks.ts @@ -3,4 +3,4 @@ import type { TypedUseSelectorHook } from 'react-redux'; import type { RootState, AppDispatch } from './store'; export const useAppDispatch = () => useDispatch(); -export const useAppSelector: TypedUseSelectorHook = useSelector; \ No newline at end of file +export const useAppSelector: TypedUseSelectorHook = useSelector; diff --git a/src/app/store/store.ts b/src/app/store/store.ts index 340a89a52..8aaad8b3f 100644 --- a/src/app/store/store.ts +++ b/src/app/store/store.ts @@ -8,4 +8,4 @@ export const store = configureStore({ }); export type RootState = ReturnType; -export type AppDispatch = typeof store.dispatch; \ No newline at end of file +export type AppDispatch = typeof store.dispatch; diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index d69300b32..bcb63686c 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -2,11 +2,46 @@ import { Button, Drawer, Menu, type MenuProps, Grid } from 'antd'; import { CloseOutlined, MenuOutlined } from '@ant-design/icons'; import { Link, useLocation } from 'react-router-dom'; import { useMemo, useState } from 'react'; +import looqBoxLogo from '../../assets/icons/looqbox_logo.svg'; const { useBreakpoint } = Grid; type MenuItem = Required['items'][number]; +const desktopItems: MenuItem[] = [ + { + key: 'home', + className: 'menu-item-first', + label: ( + + + Home + + + ), + }, + { + key: '__logo', + className: 'menu-logo', + label: ( + + ), + }, + { + key: 'pokemons', + className: 'menu-item-last', + label: ( + + + Pokédex + + + ), + }, +]; + export function Header() { const { pathname } = useLocation(); const screens = useBreakpoint(); @@ -50,7 +85,7 @@ export function Header() {
- Looqbox + Looqbox
} - className='pokemon-search-empty-state' + className="pokemon-search-empty-state" /> ); } @@ -44,7 +44,15 @@ export function PokemonSearchResults({ if (loading) return ; if (error) { - return ; + return ( + + ); } if (showEmpty && items.length === 0) { diff --git a/src/features/pokemon/hooks/usePokemonDetailsData.ts b/src/features/pokemon/hooks/usePokemonDetailsData.ts index 9293b6e34..9a72f09d7 100644 --- a/src/features/pokemon/hooks/usePokemonDetailsData.ts +++ b/src/features/pokemon/hooks/usePokemonDetailsData.ts @@ -153,4 +153,4 @@ export function usePokemonDetailsData(name: string) { stats, captureRate, }; -} \ No newline at end of file +} diff --git a/src/features/pokemon/pokemonSlice.ts b/src/features/pokemon/pokemonSlice.ts index 71123eb81..3ef2b6f22 100644 --- a/src/features/pokemon/pokemonSlice.ts +++ b/src/features/pokemon/pokemonSlice.ts @@ -98,12 +98,15 @@ export const pokemonSlice = createSlice({ state.speciesStatusByName[key] = 'loading'; state.speciesErrorByName[key] = null; }) - .addCase(fetchPokemonSpecies.fulfilled, (state, action: ReturnType) => { - const key = action.meta.arg.name.toLowerCase(); - state.speciesByName[key] = action.payload; - state.speciesStatusByName[key] = 'succeeded'; - state.speciesErrorByName[key] = null; - }) + .addCase( + fetchPokemonSpecies.fulfilled, + (state, action: ReturnType) => { + const key = action.meta.arg.name.toLowerCase(); + state.speciesByName[key] = action.payload; + state.speciesStatusByName[key] = 'succeeded'; + state.speciesErrorByName[key] = null; + }, + ) .addCase(fetchPokemonSpecies.rejected, (state, action) => { const key = action.meta.arg.name.toLowerCase(); state.speciesStatusByName[key] = 'failed'; @@ -117,12 +120,15 @@ export const pokemonSlice = createSlice({ state.evolutionStatusByName[key] = 'loading'; state.evolutionErrorByName[key] = null; }) - .addCase(fetchPokemonEvolutionChain.fulfilled, (state, action: ReturnType) => { - const key = action.meta.arg.name.toLowerCase(); - state.evolutionByName[key] = action.payload; - state.evolutionStatusByName[key] = 'succeeded'; - state.evolutionErrorByName[key] = null; - }) + .addCase( + fetchPokemonEvolutionChain.fulfilled, + (state, action: ReturnType) => { + const key = action.meta.arg.name.toLowerCase(); + state.evolutionByName[key] = action.payload; + state.evolutionStatusByName[key] = 'succeeded'; + state.evolutionErrorByName[key] = null; + }, + ) .addCase(fetchPokemonEvolutionChain.rejected, (state, action) => { const key = action.meta.arg.name.toLowerCase(); state.evolutionStatusByName[key] = 'failed'; diff --git a/src/features/pokemon/pokemonThunks.ts b/src/features/pokemon/pokemonThunks.ts index 42dead3ce..d3665d2dd 100644 --- a/src/features/pokemon/pokemonThunks.ts +++ b/src/features/pokemon/pokemonThunks.ts @@ -6,7 +6,11 @@ import { type PokemonIndexItem, } from '../../services/pokeapi'; import { getEvolutionChainByUrl, getPokemonSpeciesByName } from './api/pokemonApi'; -import { flattenEvolutionNames, toSpeciesStored, type PokemonSpeciesStored } from './utils/pokemonTransforms'; +import { + flattenEvolutionNames, + toSpeciesStored, + type PokemonSpeciesStored, +} from './utils/pokemonTransforms'; export const fetchPokemonIndex = createAsyncThunk< PokemonIndexItem[], diff --git a/src/features/pokemon/selectors/pokemonSelectors.ts b/src/features/pokemon/selectors/pokemonSelectors.ts index 3cbe24f02..fc8fe4e3a 100644 --- a/src/features/pokemon/selectors/pokemonSelectors.ts +++ b/src/features/pokemon/selectors/pokemonSelectors.ts @@ -1,4 +1,4 @@ -import type { RootState } from "../../../app/store/store"; +import type { RootState } from '../../../app/store/store'; export function selectPokemonIdByName(state: RootState, name: string): number | null { const normalized = name.trim().toLowerCase(); diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index 0c56a140f..d3fea31c6 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -10,7 +10,7 @@ const SEARCH_POKEMONS_LIMIT = 20; const { Title, Paragraph } = Typography; -export function Home() { +export default function Home() { const { index, indexStatus, indexError } = useAppSelector((state) => state.pokemon); const qp = usePokemonListQueryParams({ withPage: false }); const search = usePokemonIndexSearch({ @@ -30,14 +30,16 @@ export function Home() { const showSeeAll = isSearching && search.filtered.length > SEARCH_POKEMONS_LIMIT; return ( -
+
- + <Title level={2} style={{ margin: 0 }} className="section-title"> Discover the Pokémon World - - Search for Pokémon, explore their types, and dive into their details.
Start here or view the complete Pokédex. + + Search for Pokémon, explore their types, and dive into their details. +
+ Start here or view the complete Pokédex.
@@ -57,19 +59,20 @@ export function Home() { error={error} items={items} showEmpty={isSearching} - emptyText="No matches found" detailsPath={(name) => `/pokemon/${name}`} extra={ - + {!isSearching && ( - + )} {showSeeAll ? ( - + ) : null} diff --git a/src/pages/PokemonDetails/PokemonDetails.tsx b/src/pages/PokemonDetails/PokemonDetails.tsx index c9c71124b..ae50f71ce 100644 --- a/src/pages/PokemonDetails/PokemonDetails.tsx +++ b/src/pages/PokemonDetails/PokemonDetails.tsx @@ -12,7 +12,7 @@ import { formatPokemonName } from '../../shared/utils/formatPokemonName'; import type { Status } from './PokemonDetailsView'; import { PokemonDetailsView } from './PokemonDetailsView'; -export function PokemonDetails() { +export default function PokemonDetails() { const dispatch = useAppDispatch(); const navigate = useNavigate(); const { name } = useParams<{ name: string }>(); diff --git a/src/pages/PokemonDetails/PokemonDetailsView.tsx b/src/pages/PokemonDetails/PokemonDetailsView.tsx index 9f3fbf762..6da63ad57 100644 --- a/src/pages/PokemonDetails/PokemonDetailsView.tsx +++ b/src/pages/PokemonDetails/PokemonDetailsView.tsx @@ -108,9 +108,18 @@ export function PokemonDetailsView({
-