From 90a1259edd3ebf467d04c65e48e7a8178dfc03d2 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Fri, 31 Oct 2025 21:58:17 -0500 Subject: [PATCH 01/66] React update 1 --- .eslintrc.cjs | 27 + .gitignore | 24 + README.md | 8 - index.html | 13 + package-lock.json | 4815 ++++++++++++++++++++++++++++++++++++ package.json | 26 + src/components/App/App.css | 42 + src/components/App/App.jsx | 35 + src/index.css | 1 + src/main.jsx | 10 + src/vendor/normalize.css | 351 +++ vite.config.js | 10 + 12 files changed, 5354 insertions(+), 8 deletions(-) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/components/App/App.css create mode 100644 src/components/App/App.jsx create mode 100644 src/index.css create mode 100644 src/main.jsx create mode 100644 src/vendor/normalize.css create mode 100644 vite.config.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..cb6f9aa --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,27 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parserOptions: { ecmaVersion: "latest", sourceType: "module" }, + settings: { react: { version: "18.2" } }, + plugins: ["react-refresh"], + rules: { + "react/jsx-no-target-blank": "off", + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + "react/prop-types": 0, + }, + overrides: [ + { + files: ["*.js", "*.jsx"], + }, + ], +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /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/README.md b/README.md index fe35399..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,9 +1 @@ -# WTWR (What to Wear?) -## About the project - -The idea of the application is pretty simple - we make a call to an API, which then responds with the daily weather forecast. We collect the weather data, process it, and then based on the forecast, we recommend suitable clothing to the user. - -## Links - -- [Figma Design](https://www.figma.com/file/DTojSwldenF9UPKQZd6RRb/Sprint-10%3A-WTWR) diff --git a/index.html b/index.html new file mode 100644 index 0000000..0c589ec --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e2f010c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4815 @@ +{ + "name": "se_project_react", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "se_project_react", + "version": "0.0.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "vite": "^5.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@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.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.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.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "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/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "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/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/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "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/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-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", + "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/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/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/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/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/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.8.22", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.22.tgz", + "integrity": "sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "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.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "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.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "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==", + "dev": true, + "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.30001752", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz", + "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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/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/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "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-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "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.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "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==", + "dev": true, + "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.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/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": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-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": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", + "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react/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/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.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": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.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/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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "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-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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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/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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "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/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/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/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "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/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/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/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "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.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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/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/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.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-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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/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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "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/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "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/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fdca050 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "se_project_react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --open", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "vite": "^5.3.1" + } +} diff --git a/src/components/App/App.css b/src/components/App/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/components/App/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/components/App/App.jsx b/src/components/App/App.jsx new file mode 100644 index 0000000..b8b8473 --- /dev/null +++ b/src/components/App/App.jsx @@ -0,0 +1,35 @@ +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.jsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..9039f8a --- /dev/null +++ b/src/index.css @@ -0,0 +1 @@ +@import url(./vendor/normalize.css); diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..7c8840a --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./components/App/App.jsx"; +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root")).render( + + + +); diff --git a/src/vendor/normalize.css b/src/vendor/normalize.css new file mode 100644 index 0000000..bb6e2a7 --- /dev/null +++ b/src/vendor/normalize.css @@ -0,0 +1,351 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..f0078e4 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + port: 3000, + }, +}); From af2a378deb6be140d0474a57de49d1955c6f81d3 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Fri, 31 Oct 2025 22:10:28 -0500 Subject: [PATCH 02/66] React update 2 --- index.html | 4 ++-- src/components/App/App.css | 42 -------------------------------------- src/components/App/App.jsx | 35 ++++--------------------------- 3 files changed, 6 insertions(+), 75 deletions(-) diff --git a/index.html b/index.html index 0c589ec..534c8ab 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,10 @@ - + - Vite + React + WTWR
diff --git a/src/components/App/App.css b/src/components/App/App.css index b9d355d..e69de29 100644 --- a/src/components/App/App.css +++ b/src/components/App/App.css @@ -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/components/App/App.jsx b/src/components/App/App.jsx index b8b8473..73ee16e 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -1,35 +1,8 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import { useState } from "react"; +import "./App.css"; function App() { - const [count, setCount] = useState(0) - - return ( - <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

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

-
-

- Click on the Vite and React logos to learn more -

- - ) + return <>; } -export default App +export default App; From c1e3e56f2b3b9bd4cc855a23813d17d6dfe2417f Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 3 Nov 2025 03:17:40 -0600 Subject: [PATCH 03/66] Project 9 video 4 --- README.md | 1 - src/assets/avatar.svg | 10 ++++++++++ src/assets/logo.svg | 3 +++ src/components/App/App.css | 5 +++++ src/components/App/App.jsx | 11 ++++++++++- src/components/Footer/Footer.css | 0 src/components/Footer/Footer.jsx | 5 +++++ src/components/Header/Header.css | 16 ++++++++++++++++ src/components/Header/Header.jsx | 31 +++++++++++++++++++++++++++++++ src/components/Main/Main.css | 0 src/components/Main/Main.jsx | 5 +++++ 11 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/assets/avatar.svg create mode 100644 src/assets/logo.svg create mode 100644 src/components/Footer/Footer.css create mode 100644 src/components/Footer/Footer.jsx create mode 100644 src/components/Header/Header.css create mode 100644 src/components/Header/Header.jsx create mode 100644 src/components/Main/Main.css create mode 100644 src/components/Main/Main.jsx diff --git a/README.md b/README.md index 8b13789..e69de29 100644 --- a/README.md +++ b/README.md @@ -1 +0,0 @@ - diff --git a/src/assets/avatar.svg b/src/assets/avatar.svg new file mode 100644 index 0000000..5c3f624 --- /dev/null +++ b/src/assets/avatar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7ba8a40 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/App/App.css b/src/components/App/App.css index e69de29..a28c6c8 100644 --- a/src/components/App/App.css +++ b/src/components/App/App.css @@ -0,0 +1,5 @@ +.app { + margin: 0 auto; + max-width: 1360px; + padding: 32px 20px 24px; +} diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 73ee16e..14128d4 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -1,8 +1,17 @@ import { useState } from "react"; +import Header from "../Header/Header"; +import Main from "../Main/Main"; +import Footer from "../Footer/Footer"; import "./App.css"; function App() { - return <>; + return ( +
+
+
+
+
+ ); } export default App; diff --git a/src/components/Footer/Footer.css b/src/components/Footer/Footer.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx new file mode 100644 index 0000000..c4c1537 --- /dev/null +++ b/src/components/Footer/Footer.jsx @@ -0,0 +1,5 @@ +function Footer() { + return <>; +} + +export default Footer; diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css new file mode 100644 index 0000000..31ff9f7 --- /dev/null +++ b/src/components/Header/Header.css @@ -0,0 +1,16 @@ +.header { + display: flex; +} + +.header__logo { + margin-right: 24px; +} + +.header__add-clothes-btn { + margin-left: auto; + margin-right: 20px; +} + +.header__username { + margin-right: 12px; +} diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx new file mode 100644 index 0000000..c55440e --- /dev/null +++ b/src/components/Header/Header.jsx @@ -0,0 +1,31 @@ +import logo from "../../assets/logo.svg"; +import avatar from "../../assets/avatar.svg"; +import "./Header.css"; +function Header() { + const now = new Date(); + const dateStr = now.toLocaleDateString("default", { + month: "long", + day: "numeric", + }); + + return ( +
+ WTWR logo +

+ , New York + +

+ +

Terrence Tegegne

+ Terrence Tegegne's Avatar +
+ ); +} + +export default Header; diff --git a/src/components/Main/Main.css b/src/components/Main/Main.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx new file mode 100644 index 0000000..31c515f --- /dev/null +++ b/src/components/Main/Main.jsx @@ -0,0 +1,5 @@ +function Main() { + return <>; +} + +export default Main; From 7aae829f1bddca71ec14f3d4c5538a72be973353 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 3 Nov 2025 09:55:42 -0600 Subject: [PATCH 04/66] Project 9 Video 5 --- src/assets/cloudy.svg | 10 +++ src/components/App/App.jsx | 4 +- src/components/ItemCard/ItemCard.css | 0 src/components/ItemCard/ItemCard.jsx | 5 ++ src/components/Main/Main.jsx | 15 +++- src/components/WeatherCard/WeatherCard.jsx | 5 ++ src/utils/defaultClothingItems.js | 100 +++++++++++++++++++++ 7 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/assets/cloudy.svg create mode 100644 src/components/ItemCard/ItemCard.css create mode 100644 src/components/ItemCard/ItemCard.jsx create mode 100644 src/components/WeatherCard/WeatherCard.jsx create mode 100644 src/utils/defaultClothingItems.js diff --git a/src/assets/cloudy.svg b/src/assets/cloudy.svg new file mode 100644 index 0000000..fae1a1d --- /dev/null +++ b/src/assets/cloudy.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 14128d4..61efb22 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -2,13 +2,15 @@ import { useState } from "react"; import Header from "../Header/Header"; import Main from "../Main/Main"; import Footer from "../Footer/Footer"; +import { defaultClothingItems } from "../../utils/defaultClothingItems"; import "./App.css"; function App() { + const [clothingItems, setClothingItems] = useState(defaultClothingItems); return (
-
+
); diff --git a/src/components/ItemCard/ItemCard.css b/src/components/ItemCard/ItemCard.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/ItemCard/ItemCard.jsx b/src/components/ItemCard/ItemCard.jsx new file mode 100644 index 0000000..c95378b --- /dev/null +++ b/src/components/ItemCard/ItemCard.jsx @@ -0,0 +1,5 @@ +function ItemCard({ data }) { + return <>{data.name}; +} + +export default ItemCard; diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index 31c515f..c40ee52 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -1,5 +1,16 @@ -function Main() { - return <>; +import WeatherCard from "../WeatherCard/WeatherCard"; +import ItemCard from "../ItemCard/ItemCard"; + +function Main({ clothingItems }) { + return ( +
+ +

Today is 75° F / You may want to wear:

+ {clothingItems.map((item) => { + return ; + })} +
+ ); } export default Main; diff --git a/src/components/WeatherCard/WeatherCard.jsx b/src/components/WeatherCard/WeatherCard.jsx new file mode 100644 index 0000000..2bec800 --- /dev/null +++ b/src/components/WeatherCard/WeatherCard.jsx @@ -0,0 +1,5 @@ +function WeatherCard() { + return <>; +} + +export default WeatherCard; diff --git a/src/utils/defaultClothingItems.js b/src/utils/defaultClothingItems.js new file mode 100644 index 0000000..e679e3f --- /dev/null +++ b/src/utils/defaultClothingItems.js @@ -0,0 +1,100 @@ +const defaultClothingItems = [ + { + _id: 1, + name: "Boot", + weather: "cold", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Boot.png?etag=0953a2ea59f1c6ebc832fabacdc9c70e", + }, + { + _id: 2, + name: "Cap", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Cap.png?etag=f3dad389b22909cafa73cff9f9a3d591", + }, + { + _id: 3, + name: "Coat", + weather: "cold", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Coat.png?etag=298717ed89d5e40b1954a1831ae0bdd4", + }, + { + _id: 4, + name: "Dress", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Dress.png?etag=1f9cd32a311ab139cab43494883720bf", + }, + { + _id: 5, + name: "Hoodie", + weather: "cold", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Hoodie.png?etag=5f52451d0958ccb1016c78a45603a4e8", + }, + { + _id: 6, + name: "Jacket", + weather: "cold", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Jacket.png?etag=f4bb188deaa25ac84ce2338be2d404ad", + }, + { + _id: 7, + name: "Jeans", + weather: "warm", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Jeans.png?etag=58345e8bef1ce5f95ac882e71d309e6c", + }, + { + _id: 8, + name: "Loafers", + weather: "warm", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Loafers.png?etag=dc2d6e1ca7b297597406e35c40aef030", + }, + { + _id: 9, + name: "Sandals", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sandals.png?etag=9bea85a77c0306586d2b71a33b626d41", + }, + { + _id: 10, + name: "Scarf", + weather: "cold", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Scarf.png?etag=74efbee93810c926b5507e862c6cb76c", + }, + { + _id: 11, + name: "Shorts", + weather: "Hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Shorts.png?etag=d728c496643f610de8d8fea92dd915ba", + }, + { + _id: 12, + name: "Skirt", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Skirt.png?etag=27a6bea7e1b63218820d615876fa31d1", + }, + { + _id: 13, + name: "Sneakers", + weather: "warm", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sneakers.png?etag=3efeec41c1c78b8afe26859ca7fa7b6f", + }, + { + _id: 14, + name: "Sunglasses", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sunglasses.png?etag=a1bced9e331d36cb278c45df51150432", + }, + { + _id: 15, + name: "Sweatshirt", + weather: "warm", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sweatshirt.png?etag=008a9674757bea2e0bdb31242e364be0", + }, + { + _id: 16, + name: "T-Shirt", + weather: "hot", + link: "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/T-Shirt.png?etag=44ed1963c44ab19cd2f5011522c5fc09", + }, +]; + +export { defaultClothingItems }; From c457893f7e09dbfa114b15778b7a9914803cc7b9 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Sun, 9 Nov 2025 12:13:06 -0600 Subject: [PATCH 05/66] Project 9 video 9 --- src/ItemModal/ItemModal.css | 57 ++++++++++++++++++ src/ItemModal/ItemModal.jsx | 20 ++++++ src/ModalWithForm/ModalWithForm.css | 0 src/ModalWithForm/ModalWithForm.jsx | 23 +++++++ src/components/App/App.jsx | 17 +++++- src/components/Header/Header.jsx | 10 ++- src/components/ItemCard/ItemCard.css | 19 ++++++ src/components/ItemCard/ItemCard.jsx | 15 ++++- src/components/Main/Main.css | 8 +++ src/components/Main/Main.jsx | 9 ++- src/components/WeatherCard/WeatherCard.css | 22 +++++++ src/components/WeatherCard/WeatherCard.jsx | 10 ++- src/index.css | 1 + src/vendor/fonts/CabinetGrotesk-Black.woff | Bin 0 -> 22652 bytes src/vendor/fonts/CabinetGrotesk-Bold.woff | Bin 0 -> 23348 bytes .../fonts/CabinetGrotesk-Extrabold.woff | Bin 0 -> 23520 bytes .../fonts/CabinetGrotesk-Extralight.woff | Bin 0 -> 23224 bytes src/vendor/fonts/CabinetGrotesk-Light.woff | Bin 0 -> 23180 bytes src/vendor/fonts/CabinetGrotesk-Medium.woff | Bin 0 -> 23052 bytes src/vendor/fonts/CabinetGrotesk-Regular.woff | Bin 0 -> 23300 bytes src/vendor/fonts/CabinetGrotesk-Thin.woff | Bin 0 -> 22340 bytes src/vendor/fonts/fonts.css | 15 +++++ 22 files changed, 217 insertions(+), 9 deletions(-) create mode 100644 src/ItemModal/ItemModal.css create mode 100644 src/ItemModal/ItemModal.jsx create mode 100644 src/ModalWithForm/ModalWithForm.css create mode 100644 src/ModalWithForm/ModalWithForm.jsx create mode 100644 src/components/WeatherCard/WeatherCard.css create mode 100644 src/vendor/fonts/CabinetGrotesk-Black.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Bold.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Extrabold.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Extralight.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Light.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Medium.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Regular.woff create mode 100644 src/vendor/fonts/CabinetGrotesk-Thin.woff create mode 100644 src/vendor/fonts/fonts.css diff --git a/src/ItemModal/ItemModal.css b/src/ItemModal/ItemModal.css new file mode 100644 index 0000000..dc86f45 --- /dev/null +++ b/src/ItemModal/ItemModal.css @@ -0,0 +1,57 @@ +.modal { + font-family: "Cabinet Grotesk", sans-serif; + font-weight: 700; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + display: flex; + padding: 0 10px; + visibility: hidden; + opacity: 0; + transition: visibility 0s linear 0.5s opacity 0.5s linear; + background-color: rgba(0, 0, 0, 0.5); +} + +.modal_is-opened { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} + +.modal__container { + position: relative; + border-radius: 16px; + overflow: hidden; +} + +.modal__container_type_form { + padding: 28px 28px 36px; + max-width: 496px; + width: 100%; + background-color: #fff; +} + +.modal__image { + display: block; +} + +.modal__close-btn { + position: absolute; + top: 24px; + right: 24px; +} + +.modal__footer { + background-color: #fff; +} + +.modal__text { + margin: 0; +} + +.modal__title { +} diff --git a/src/ItemModal/ItemModal.jsx b/src/ItemModal/ItemModal.jsx new file mode 100644 index 0000000..7312474 --- /dev/null +++ b/src/ItemModal/ItemModal.jsx @@ -0,0 +1,20 @@ +import "./ItemModal.css"; + +function ItemModal({ card, isOpen }) { + return ( +
+
+ + {card.name} +
+

{card.name}

+

{card.weather}

+
+
+
+ ); +} + +export default ItemModal; diff --git a/src/ModalWithForm/ModalWithForm.css b/src/ModalWithForm/ModalWithForm.css new file mode 100644 index 0000000..e69de29 diff --git a/src/ModalWithForm/ModalWithForm.jsx b/src/ModalWithForm/ModalWithForm.jsx new file mode 100644 index 0000000..0ae47fc --- /dev/null +++ b/src/ModalWithForm/ModalWithForm.jsx @@ -0,0 +1,23 @@ +function ModalWithForm({ isOpen, children, handleSubmit }) { + return ( +
+
+

New garment

+ +
+ {children} +
+ +
+
+ ); +} + +export default ModalWithForm; diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 61efb22..05e1a80 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -4,14 +4,29 @@ import Main from "../Main/Main"; import Footer from "../Footer/Footer"; import { defaultClothingItems } from "../../utils/defaultClothingItems"; import "./App.css"; +import ItemModal from "../ItemModal/ItemModal"; +import ModalWithForm from "../ModalWithForm/ModalWithForm"; function App() { const [clothingItems, setClothingItems] = useState(defaultClothingItems); + const [activeModal, setActiveModal = useState("")]; + const [selectedCard, setSelectedCard = useState({})]; + function handleOpenItemModal (card) { + setActiveModal ("item-modal"); + setSelectedCard (card); + } + function handleOpenAddGarmentModal (card) { + setActiveModal ("add-garment-modal"); + } return (
-
+
+ + +

TEXT

+
); } diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index c55440e..ba54a15 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -1,7 +1,7 @@ import logo from "../../assets/logo.svg"; import avatar from "../../assets/avatar.svg"; import "./Header.css"; -function Header() { +function Header({ handleOpenAddGarmentModal }) { const now = new Date(); const dateStr = now.toLocaleDateString("default", { month: "long", @@ -17,7 +17,13 @@ function Header() { {dateStr}

- + +

Terrence Tegegne

{data.name}; +import "./ItemCard.css"; + +function ItemCard({ data, onCardClick }) { + function handleOpenCard() { + onCardClick(data); + } + + return ( +
  • +

    {data.name}

    + {data.name} +
  • + ); } export default ItemCard; diff --git a/src/components/Main/Main.css b/src/components/Main/Main.css index e69de29..1e60fe0 100644 --- a/src/components/Main/Main.css +++ b/src/components/Main/Main.css @@ -0,0 +1,8 @@ +.main__card-list { + display: flex; + flex-wrap: wrap; + gap: 20px; + padding: 0; + margin: 0; + list-style-type: none; +} diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index c40ee52..dcaabd1 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -1,14 +1,17 @@ import WeatherCard from "../WeatherCard/WeatherCard"; import ItemCard from "../ItemCard/ItemCard"; +import "./Main.css"; function Main({ clothingItems }) { return (

    Today is 75° F / You may want to wear:

    - {clothingItems.map((item) => { - return ; - })} +
      + {clothingItems.map((item) => { + return ; + })} +
    ); } diff --git a/src/components/WeatherCard/WeatherCard.css b/src/components/WeatherCard/WeatherCard.css new file mode 100644 index 0000000..8449ff5 --- /dev/null +++ b/src/components/WeatherCard/WeatherCard.css @@ -0,0 +1,22 @@ +.weather-card { + height: 80px; + overflow: hidden; + border-radius: 12px; + position: relative; +} + +.weather-card__image { + width: 100%; + height: 100%; + object-fit: cover; + object-position: right top; +} + +.weather-card__temp { + position: absolute; + bottom: 20px; + left: 16px; + font-size: 36px; + line-height: 1.1; + margin: 0; +} diff --git a/src/components/WeatherCard/WeatherCard.jsx b/src/components/WeatherCard/WeatherCard.jsx index 2bec800..184781f 100644 --- a/src/components/WeatherCard/WeatherCard.jsx +++ b/src/components/WeatherCard/WeatherCard.jsx @@ -1,5 +1,13 @@ +import cloudy from "../../assets/cloudy.svg"; +import "./WeatherCard.css"; + function WeatherCard() { - return <>; + return ( +
    + Cloudy weather +

    75° F

    +
    + ); } export default WeatherCard; diff --git a/src/index.css b/src/index.css index 9039f8a..7e165de 100644 --- a/src/index.css +++ b/src/index.css @@ -1 +1,2 @@ @import url(./vendor/normalize.css); +@import url(./vendor/fonts/fonts.css); diff --git a/src/vendor/fonts/CabinetGrotesk-Black.woff b/src/vendor/fonts/CabinetGrotesk-Black.woff new file mode 100644 index 0000000000000000000000000000000000000000..82df9417cc40085d5d388d60abe04d36fd321487 GIT binary patch literal 22652 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 literal 0 HcmV?d00001 diff --git a/src/vendor/fonts/CabinetGrotesk-Bold.woff b/src/vendor/fonts/CabinetGrotesk-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..dd85b382635fc5af1481b08fac1440293c666ffd GIT binary patch literal 23348 zcmZr%bC4%ZkR9#VwryKG#&2xfwr6&1+qP}n_Ks~^w_n`-c^UbtqhGwt?2d}Aj;xM$ zlM@q@Q&yG(0@7jyf(80#Nn!tu|DOqqi4g(;K^Ox8@jwFs$)qMlt8|Hrh>8IL3EBVC zNBzSXHZxYUxV)UwKkgF<2|XCSA?i)t>#`-{eVZ}b(cc1KfSZV2cj6nT(C|e%- z9k2BtKj%LK*8WqHf-csu073;ItsGdH|Bca?{dfr=im+MyCs|wv@h7JIb4LtRO%0I^ z1SAgxJP!o)pUz;xY-6x*qOWgh7`4BzZx=2f>i{zf(*-k55EL}969{>SWoSCr02uVf z4*j^vj{&nFZ4r|U6%&&@@DMYXWg1iw8g>eZY!mL^yt!{gCyFL)$|HsdtPeK9D21l~ zGc48>94$00N6C;|>e4abh6&(?DK?M`T%wD%j*cRO76AdauOBPW$Zj}yAbi@R(E3qC zm}nT-0Eha)z!9COx)4K%cYn9w+7W!3?&6VO@2|Gn{|ZNUt|bjSHztKRAmF?j{*{*J zH2OOlGC*34;7+#O@ z+K{VPRt<+f{4)eaVAL@twKl6pmFy$SF@qWo7YeB-VOP#eGw1n{SWAy@}hqT->c6Ap=ZO#&8#y{GIV6$}n{UW994cH#!e zHa|ttJ8+dJE*X)n)X5~LAzhg0IqoTrS(K9DlXK5hvADQ_zvqYBm-GS2tN|FmG$yh> zSn$k$dMo-A%&<$`LfK=dmsv3xy%!m7#?c^Nr-SbekfND|m%CBUzfo_PA#|=y|8AkV zI=lV6kZi&87)GtfaU^ZB2fN(GM^kd{??Sn*hyb_gq*(;;ZN?$PO=Db~OCW-{Y?OZx zk=^4#g_B>(OIZ8L-4q-tWQ?Rz_iQ)cs;j{8n`AFqG-DDidB(e9AK3VkJb$6w%OHud z5f7AxWX|y^Bojqbp|M+<0&q6TpX&J?Kuc6oXDS#(w;Iw~$AY@i3==NNK{Aq+|I8P6!U zPN2TmQIYE`dn)FkQR`9fFRGs-k2`(7{Hc??31s%m2G@6zJmPL>;%5#4yQfY3YJ$(t z(+jY#Ox-p&r#o6Kdy5?=VS)hEsJO1>SVOdJMyDx|#-N|D^xM`a#6CsQ zW)-`qWzJ?b92Er>mwD%81)XG7x?~lu=|$^lwO>#2aLcMPbjo;W{c>ROB1kf@^%W%{ z6*cV}MHAZOVFknCWm>YNYQRJl?L-CXgsfA|d=yR7E_ijD49@jJidWMy z{8gKr7yeves`Eb6mb2%CIRohQO4j>5p46QPHFE_g%u(>S{PT!Hiia4JUNn4 zs$L>oy^z&fUJOmy_ejYgS>7R8Ss{B)^=efnd)^gq5lLr`>T2ot)iRgPJlQi%3SWd_ zuHk9$q`}c{m}5n-W_h}1MRP`FA$NK9iY2&7xuA)q!i#wMEJVwH>$)jW;13zBFYLdU z3l#_O@V~XW`U64`bsQN8_Jy8@XRb2P0)2fMF99+vjf9etH~^YlJ|LlxbR3fUw7k?R zh7ywzf{_NKAk9g2Do1X1ktHj2d->ke>#HuvYc`e9DQi{r0gzoR) z{Folg<x~DIA7YXP zqd{b&!IIGsGEvc@(vqPN6VnAha8BC939O)US~_HNB50f;i(mC)xair4iTH`}aYXF% zUh2l40N1Iy!!SxsKXprOOQ|VmIpNA2@Z=l?s51qP@p?(7_MG|hbR-1@CaQE2*eawZ zDUp)Y-~Oro`^&U@Cd#M(JUKlM74N_%?(w^1j)$6!i)%o=zq9?Ea${IwC&(MN**jyM zUu^n62cPbt8}jk-9*%jsyJLGSI5QxOww>R`1oepOzht62Ya$W=ot^D_u9_9TOm-A|~0EcM7OyUCNy+_!a^6F;oUP3n?lN4cUpwSrf5_ zyZR;MpBIt$OVYIg|FF9QgIj@UYNF^jk@ubE{CNyYY6A+4CC95I2W)n7z8TgC|N>-vlJhCPfrC=4+U&I+$RL}bPxZiVT z3yiHnH&RGuZOqQG2#bZa&%p7WSpp`k1U1bJC02+WB}RrBRWMbQ78Nx#guaZ7f((bB zwq3AC3OfACEnz8H3atp+g$l}WgcF;vuLwt8)Do4WT!>b_W5~6oj(uL*T9#{&XT}l*7NS6snr)$#)d2ZBf$u+SSm^=-pWwLF6tr=rtO?{|N&#LWDF$!z! zvdiKn>6f=D$={f=t1Yg2Tnb7$4GK$otZGV2L*>?*9gC2NkdT&^n`Zk{FbF58?Fj(8 zY6F&)2$zwN9GjAs%9i{R^Fhu=6fIwhY^p9|-53uFD>@BYQ?DTBrlDq`BO-}(WnuB} zK~FH+Cl(tbH4z&!p8H)wUC5$n#B%Vkuy3TONX)W8TyT0p%0)y*%}1WDY0j9&P1S&9 zA09Er2;LBe^~bcKzm<3ewoQc8=C2F)|FmrupI0q&YB+mJupm)FcvRJ?I{h25e5=8if#3&EJz~z$B6rD-azk#nbdBl}6MIB$bwtXHKX}%0ng9 zh@ST?H)aunC`zDHbjFlyVKOHX5|1;E1;b00cqVejm3+=DKp{^s!Y#nAh(GLts`#BS z37MTBRUM4IhhSVG=lxDa*UxHzjDiKxe90{pPM&77Ih0tlZaz#qsvcv{f{t2Xwuwpcnr+*Q< zViUS#XIfq=xuQ7BBevuR;Ul=@htyoG#D-pgDUou}+zaHixH-Gf17b#`Jg^W9BDIJ) zQNg4yD@49?&=itoG@=a|0ufD65#$jGYD`=@STHdw91%xQ2=NklJ`tn`;Sf<$1R`E` zHKdFvB~re2P>HmB3K*O)B`}dvkRxJ*_!w9|AV@uk8Br=RPdx|~(nipnLdaR93aP-T z1D6O(2nmu&f*Ua(lN2vVo>XWavYAcT1acfHBU~O;=mK%We@-_@3bDYb8!ulK@=C}Y zK}ZX6fv^cbpE0Pc5G+Uv$x(cvKak9=SVE}!S%f4W0bA}OMF9;0PAjYPlOSqLt zfjpc%o!o;w6X2ST%h*nHV3KXz(!kHGrV&P~*rKXRy-9CNpQbzIP9CE%aA{DH4l@OF zO!rXv7hp@@ni!jiG2S{sbJW{lT7|cn>0&lo$7Bue6~rfv@x!n#0Ps-iUz%^KJ(FLY zFF}zJ1{?qy0g-^z3|q!6Ne+db{odT^k3D7!hOq({YLzhkKDvh3vtERpB zD1X7-2Ka7)c(F5NRU@p2d56V@@rNacMTd=sy@u_eeJWL} zLz=M{EgdUuswcFv&6npiS3J!xsH#ykXKndXPoz*`p?8`0>P+oXm>2= zEqaE$6W^#Fq>tUEa?^Wl7CU4lGFfbDTH1GxMKfP)zRefcQfxMBY;s%hZG1Mto8as+ zm)JXP6trwMU2G;db#1+BuOeIQHorGicV?<|LS0p_-dk{1Y?V8quAnz;%v(!!Tsobu zYFa;*Vw&t$d#t=#pAR-Lnpa!&c6_xy0SJ^pTIw3k_4W;?278u!274xZR(p0x#!S=1^Tf-N)jYR&OKsk;S?uCHpE{DuF8e74j-o)H-ZRPu-U7mYJ5h6^bq@ zPqNWVR!bbqvrBUp3ZD+)fD7_3Rv}+P6`>#i(^W1UlGdXK9fU4WIUJB1s z=U*f#;M(WbwBR?LTVFeuHMX~v8pWZC2;3+8126Y;m&m-l#7SQe#}LzqPqr_L9?17R z+iIgmJ{%gZ;~Y8QLF~wqgpM#2q2g~(Fnj<;b}1h)*RwFg2$Xg-P#5}meRZvjht1x5LFDfYO zCoshu!y#@|ke|;ygOMa~JrSM+YB-410x&e#);+_a9;2jek}}Jr_JTCOjq6>^f=lMAHLB?q*X`Dx zO`F@&N?`Fv9fNo2Jm!Z zIEvJUWv`5~u_@Be*=h7Uvj5-wyT7rFBIEoM2)%nn~oMQe5f@>lh<_2l}xqE&1&(svVHTvaU2=|Gx6(QRcu+DP{{&kok zeclVdFC^3KV=d&m1f`Hp<NE26hM9AM-P<1H*g2af4~{ zs=|KuEQhxO16JdCpct0@bOl_#<93~L!>1ylE^6`Fi|<9_fqExWt2G*25}~WW{fGt# zbAyoPGrSy(Xu!+Dcdg~JBwG=51QGKPW9}H#)KvK7SJgt`HK|UW#*DZ5+Q5zbvMM|t z>&Sx`MbMF%0lRrih|+etFLwi#w|#&9&0g3aX z#tzjj$X_g9eCuMmHq5%N`b47=n-EMv)wnth;a1TOy=(OKkr(!vS`Th#qA7AE-G9P9 z8PsjVW9odvYez;Wv7rVCfxdn>M`FMa(xJYi?Wen|J}7aJf$rEWBu1w0Ui+fp1)rAa z4N6PUf8zHB8E(0L?^WbE>b^Bmgs&pT z<4U+k(i5!B?F}Z_t=C%AR4`iXK40sK`VQgJO&VE^g$rRoXR*oe(w$aPZ8dvsH(Q>9 zJy=er#!(H&GN?7b><3|KE*Gk>Mt5A$`BET$m3lT%l(Q zhF*Z~+*cLAX;-@{Yr$sjd`FMcUcY58^#MJIHw3{u7fCCxl1AI4&@NY@wb+Dh#-aJC z@u&NNb{sPWiH)+`2&?kaLs;)>ugNn@I2pO)w}osWPD!1a11F+1`C*z=hJMe3_D$i9 z8}Jt!SO(dxI4exi8sOY_{qoCTKa*&K*W_3)3Yg!LJd^_uW1RdjEP4_ofB+V~F)U1| zXuU_O=x!Ijb*eP!5VnHGT{+>c-d(x*h@lazeAFJn4-%^>l>UzgcYE(&$fqqrYvQVm zFMBZUhp@nosZoRi17(upJF)tp15dO1zfL>kdg%sEI$@h~EWI+-DJrX=?I1uffRjFcR|=7(F;yIy-61pwbYBYBx6 z%`3*fv7%$^C(j#=pe?%C?J_(1cbyi5{V$ ztRyNWN|qaXKbsKwR5POf$#sNZQBSQ2Qq`9NtHxn6k+>M)tv_dmjg(M;#fK9v8#CTm zW;iUoPI2f*58Zo|1xz|92l2b8+Na%{=xESGV>>^8LZq~TF~$jFHl*Wa7Q6Ilj>J`V z$X9@-gk4u6e+c0X%MBtpo36BJp_s2DprDWdyo!z1Jokt~joT zz}GT}e&hfz6jT1o6+=@v)ONJm6&gP?Z7;LLw!4U1r}^bQ^1}fX!9thMY&)1Uhy2)b zfgbp#KY7MZ_&d!8OMpJ2f--*_&vxm#CoEL<$4xoA&qzWR7T%vA*&Y*D07d*(u74<( zlQRI6Ys!)6wt(Q9=PCGF6?$a{8A|Km?%UF|Grmq3{|Y7e!oD2Sm|~Y;<<-;3R}K2A zSalssa7&qc7d_fZ#J=d7{YP34f*tTCO#p#T`c6UI97w}&UG*dan>QSdMZElCMd{33 z0hQ-4SK`3*>#XLFUbk4MaWf)D-)qnnfty@*FqZr!*AF~+`AVdxsv=#c$h=R;SX?Ca zZnkYY8$N)CMK>sPO(C89m4kz~l4%n1#$^}`3sY-1k}YHf7613%^aw{P^9-M?Y1C4_D?y&94d1mO(dVeLhNL2zL!GL+X1xe zvN~BxV}9HY4+i0a?)uJXYI;$8GHFypK8S6J4wr+Ux0xY2K`dv#J^9b!O#^Uf4}i0| zd~PhbwnV`iYQht@!~iwF!b2uQ4@7y_Kz)BT`onmgILWxXk$&;+k(b&^ZNxQ=Byf%~ z7-!20#2ZVk?b@L9KSMiN-sdRrDUV+wa2eTcR6yOFOKhNI>U9Vq7>w(A@61KYUFWvl zzQ46we0|73<5Sz`*e{CV+M8WMWqR$gy;CD~@L}pPFDRC=Xv5~slt6%6eTl|v3c&8n z4l_VOn7Z(G#-;1~~c@`+qVfvQI@Wt){#8`nLMJOXC*T5Z|pc zb_wf=hA--O-EY$CPpth`dqSh-cy7T9k$*ROeQ9oXkcI-azTJ6B-cAd!X7JYao5R6z z%OgHRXEU@!QIp1FlGQW%vz6T8O}u!5!|Lulnww#KtYG(gS{p`f%Z45X174VgnW6mH z(hqzMZt$jxoFz-}V(s8^P~{Bh2CbG|-{1 z7bWxMBSox{uN+AX+ha21@Q{LTWr$XmW^(6br?=2y`{(L$n&6iX&-3aXMpkyfDZU?Sc+_D_htz@B_Ci=Bl66h587j&w zOplc+z0gRW$%rqHSleVrY8GNFl07wfbr!J?-~F$)-`yV;DCD4d6X0fZ__K(68U37J zG?z6&)t3(}tFx&XX2r$mfZ5qqAR4{K`d7i`^Y5lYU!TD4kV6YWquUAc!7+8Ab~xVx z0UY80w7|@MuEb%D&&B)q47Z9-g=CQiEf!mn110Xl*FP2Bvn432GXR9LxxZbLSH!~k`sG6NJ9M0(<7cDgvHK}PFUH3cwg8%7A1Zu7fMea)Y8_}HiUUh9D9PHE0QTDtQS&Y75t-dLrjGU>=bkJ!#0udF(Fn4+TUOdabk$?LR6iA zsEjRVuhmlNxSFe4&t%PAds-j2DqJQR-2VzzC=~)#8Rzmq%77)_q8I2fF->6P;#|@? z(!=r_oeL0U_A9;bGud;sf5KYsp(`F`+x(qD6g#%wq*nH?inI&YXW!UqQ32OFHbsm3 zVhxCrVlvM~XZqP9hxOPZXMQt}Gii)4RbO4T$dVE686h~29c=z^c<;P<|lEoZ(MCg7w_f%+^Q+5ky!u8_AI3(0vh)UUCefey(VIJp>J)`&29mR7DQNnToH z;C)_t@uGl53n@TAXekp^*O1qgbU1!7w{_g=(-e|M2n85>xLcvsx=oxUw|Q$kU}MtW zU53geX+c*@j7le&uD!Jn|M>PqE{E66K=WwmPq_gKxrz)AjeSy=A^gw%+4DrCkgz|T^FA;6^f+ieU?Xazz z!QWK46jElv z8Y&=Em=0X6uK$|W6vcK(pjr+@-{H~H;=A%+uFx+2-uX59t0Lf~l)s3j$Aa3aQQt_n zgqn?p!hY^>FjbLtdpm09`TcJ0Hy>`z{d}bp$7QjUn|4mMN7`%_Ej5jVLUB<^^tygp z-OO3T>$sd>)fnH7)5t*VK@&{2*X2~^tC3-zmCR>xXeuvey|k7y*C$oW>B)W?b1%2e zdh-6DC_P}#;+A0AG%6iUSw7Pv`i|`To=9qLDVw-E@FFba-4H5j>FFppr`+es(y@9o zZv6MxM=q2nF>YLRwywj&@pnX}+6%?&D?kpD1{L?9GNoadrZ=}!n^KaqXnN;i>pi#< zI#ttFM^(E^qnV_ZQ{_N>>L}Isc(q2G)9v~*SacvN+Y$bd+Y|?3P!Nh56IeHhf1Gh& zlp7I^P8`T5Ahqt5NRBqk7Z}d@`|%fT-@cLBLb`be7b1*-3Et1A&{ML_z#0p{+`!QK zkEhV5|9dC|yf&v6K1PFVn`cOS0$09g-G*sVX7e&$tH3XKkUbfMp7+Cw{lS40y|k>L zK8?iXqU;M$OA*Q@2o_8@`c~dBkKQEyL`C!@l^WCuqJ9mYM2WNyX_N}FicYUba`f&> zashYm!^>pF{*TT;|Jo&e-(c0{KE}@8L`h?!=3WX7nGv89Fk2xq)cd{h&hs1sZojvs zo+T!y;F}WWyNAZow{orq41n|X=Q>{KOD*#K+AE!ttEFrXP28+bop<(aM0b|_H4hOt z6^WJ-{*X1zx{_-Cc5@4(S^6$}cKEp5c!b)p-7I%iJBe1S<mKWUfY& zWw)5O7hKWA&1z1KAFlGn85S<<(!o;F#{k#*V^wu?>Ey&I1BaEAysB$K-xu)rMB*;A z?1shAQ(#H}th1*m<{Q-M?4R|Wj>$^>vPM^GEUBy}z270u=MYi6S&wF68b7&5P1K-! ztoC^n!4ND(rCAR_Hln=tu{T|tRBNluy1{q(*OBNJ80EQx<=I>~C~9Jw-s&dRb-7zMbfkML+NQbS0C)ZC5TSXr@9GE&}%g+bt=hms}B8Ydv4u_ z9k2G$GWri;QCdklk5eKxtAusla!+=qDx<`eGX_jxqfD(HNx!mk#aI}N8jkhkb zkV^EpN4s8aByXV6m^Wcb+}$H&&Sv=(e%lYnHfd6Ow@nLn2Ez-W;IN$;ZAQY%qIkM@ zB{0m*zejAk@sq5u$MLxdXY4{%&66F zHtM8(>@T8*koVqMN{BgL%UU-qE`#vj1^^U>1=BYW%vTcKWGL(m&4eo1aXk?^}DFGy=99$jvvof5y+t$~#k{ zkOKlt#l0ZSURGC^D%t7jzkAd{h4`?jb3F)8cCnU+2b&rAm)=ntk1`P4Fn7`0x+&-_ z_fL1lxB>KVblLP#w?Hg!=bvbA?G^Kj3n3%surHU4`1^WsCr%!>KUlbgkR{HgEgvX;X8VFAad`+sz@NVanF}C4 zAXoHN-k?zD&Vx|uiC6ZvBxw9eLi3XFUwP{Gpz>KL${~PDcYeE3bSzFV7}ISwpN`N$5!otY-elJ_~mf2m#z+$nuMBHHdA11Pf&{L=mei7q$ z__jkdv?db7Jy!;ESk>tH-wbkpb>PPfsN3G;3&s$G2{xuRe$-CTk_mEz&8e6&_;FX zJRGi+tN(OojNYVgB3&=TTkc;0PP52S8;s8w=;!1fzVy1RPQ%?|Eo1q7T-+l*!sh-E z?E`v+ppN#J6QH>*`;-Ni(ZBU=ti$OXNI6uR#+{nR_ZSF(J5YRM8F_*UI8=4K3f^6I zr5Cc>V6oSRzg|x{eqj@5BJmj(MdYPkGinzqO@fo-^Z0diogYo!mn)HriNK?bA*Fvs zWi+P7sC9d~c%QfZ!6JGFX~mr=e^(F?whBXMZ>*cz!#fkd#O*+0+pBRd72j`V@LkWt z8br3ci6bf$g4dBov-E}-{U^Zq&A5Pzwd<@ZoU*&Z~KBE3R-14Hka_I}Eb z*ifp65GoxRfq=l1DnphXYk-z=ya4&4X^V z|7*N1{pV~W+{+9(7H&Hj!A78jUp*m}o6k%&YFFUC;q!GyV^OKmOiV^%)2m1D7FyrC zRU6i~7M()T1vms>-Vc$(nMe!6s4j3OX#wxtBl}B`oz8CLuliFR#35;Ar(jFY5F%F+ z8T08dC@6bW8%AJt9sQrxD;vtI{N)=PT9b-h|M`?4qngg!-}5O8=qEGh)QmoqV!H<^c0j>g>8;jekq2u6pp3bvg2@-qC&Q{juoAhVGhJcxe{>itZL zNEHzupCFK`ChZjc)raSQ9p$bcFtVq z^a`|U+b7q~Qp--LOs5OjJy&(XWiqqzppZ-oTYM{N3QkO%WtPI=)-OJVs(8b#q$A~M zQprC;{`fCv`YT>QdTovAs*OlK2F+Zu{3O`-$?Gu=X|qm3SUX?6dNF?EWBn*dYxdV) zH<6BF7M2#2eIh;&$-y>xt;^{;`0dxoLxc>$fw_6O%Y`^&zKY?WI1pVe*%k111?ass zr@sEyPW%eB!!D2QE_Ve^n zh+meQ)$sUe!Q z2k9atyG{hmzI=zK)nGW#xFCdVR>MGpY{_9)#+`p$B?xu$n!4+BxV4AR5H?G=kF!Yf zj)x)#ey2|pntvM%8>|;rodS!5(mG+m4|g~Rsw^wraY|8)IC@x;gclLZISM?4gn(!*-v%Bq!8l&ndkD2HBfx`ki_$}k6VOy| z5bE?EhhBV%q{wPiL*c_``fKOu_klan-YdG<@ zxD5ypV|drD%_TpXFo;k*0g^T5+bmrG76r6(c3g)jSe1tZMRX9(b|&^IfvJvS z1vwx0-Es0cGnm?%qq5T$muas~s5BP+vlew>lbOMk!-?1W?RlvzUi;jW!;faBPq`hw z*XsM@fa*fq0~N!JFWnE#qoB>}jW&r1`!m6cuR1?4?QSRvlUqBgx~21Tbs1rmc6Wsu ziC*~qMS0O1+kCF7SpU#r&tE4-P&r!-W6%aplb!R@y}s5ne;I->c*Yyu`ho*B$=R4i zKN8l%SOACTvi=!5f<#OKoN^~OuEhaOA3XSJ)*VT*>1;1XurHI(@Qk|TBr$nsR!Y;DLNAH&82_YCo!lI+KH@tPJ}Nv)Jc_?3 z^+@q<@y`Fu_+(I>el{6xV6q18%-9-NZBSc-xU_nPkp{>B&`P8heN3;W8m4Ou$y`U% zUlDyvPm3@sDdm%Ba#|9a9c_<9e z7b|2&*>yG__smj#)f#l0O@||vFF4R=sOG2sw$PLc>GT*~+|fNuLQDT5cne9dgoajm zKo3Ld?|Ax^kx&&ycXz(FR2B9&IsL*E8XDV|j#(U)l^&&DedTZ2^H-4zcyQoKIwht; z&9UW^db}}pLK*GPSz6jhnY%(S*@9l-uEAsF3nF>d=x6ChW-JHPkYavLFq$!m4;*!~ zF^NoI@Ii;93MNPxbVoRiiJ@diJdh^Z7HT52__i6k!A2VoW!Z0ia`veo)vwccF`}3! z?i2^H!nx&JzqO49lw`wl^O?2)cFo}HUBW7$64XGa)}1i8`g3wy;7*@Q5Y>T%moBq7 zqVc+x(wzDwF z`wJ*#8T(EgP62zN-xlm3P_@VroW>`{W=&J3VfiZ-YEiap1SJIX7V`J=%#{lC7TWu! z&iM#+)SE}m$R}@b&4l||31%K{0NUpw3Cs2wQJOXI$if~?@c@|a_+Iyq#l33l_D~_|0H+zs0#tIp? z>sa62#|xPSGL)er!j9Z~5%?_2pS0PyeyZShXt0V zo%!IXUWeL#NVM`8ldW0i)451#al3amNS+vdE4VTEvOtOmBw*9|cXgmV5v8Ai-}Dp&y4px7^<*=@yMl9~v^#;TKNBJ{_w$+q!cYa~|) z_et1!NeQk{mUO!a&*I05bL*0(Z|Zi$g`>;hZ?X)=53zYy@V~od=qJ37^tDn8ljnU0 z>&{F4pcwx7IApp08KL7C{pt9;EOw*bqCf9KW+$eoe7oOS>iuac+87(1q~pqd`H}6} zbMAbTLs6~Uz7+jRmrMe>n&84=ol+9naSc(;%hYjdN$m9b^7HO z?4zpt@~Eo=6pv`3zYEzq#4^i@tJmu}8?QxOhtln6!Je7+r1MuOy5P+9MOWsnr#j=6 z0Z_5Ob#>9}d)KpF82WNr^V}-li-Kyn-Hz!lgLPsVY<|9q#CmO^6Xm5j{6})faT_h9 z^3+up<5Z<701(O*99nm`><3O`T1-A%hO!uW0ruf?t%RnPD^GC{?su$GfwXbhL@jtJ1`kAZN4JC)HvE}f_7ceZz z?oEAGl-b{9vC9gYRY5OOF_++LA4FB2;!!OQa913XgWhaoQTP*TAG#h_$L*Lg!6|Lk z2GeM@7z^Ec1HSSaZAx7L!tqfaUHPY;%-@R`?5Ey^=!9Vb>qz;Vi_HR##$(Vi&s$Dm zMHMbxXdvxPt9PeI{1@)oWNAq){Wy|72pH4kL&~vn1uP6W9E4jk!Fszi=8H>U?w@4n zqSD_W&vQ>nm;^%;E@N{-(|?Bn9F%WDhU*k$yNbV*l;|0i*hT5+ig}q=rQkm8Kgk zGVsoaZb>QlJ5~NIC+Xu=a`J0+V}BR6miT+uow02(jjES1SYr%)1O2cNe3+k?mTh*N zK8IqG`uZM|?6E0VV=mVe$&0>54rgR%vhrmo8ETLPVSL-wr}PMYr`M5Kt@5L;JiI4p z;LJXcjZTx!S0CUEnq13Yr$aq&DGcSfc{UTThu#ADoad(&pAHCA#b9;l;!N&Kttw)+ z6`Vd1R%qkV|8jYpV>*2szs)aJTo}0cTz30_(=YPI7+lW^Xgf&h^e_pK8L6r|7YJ&H zW!#x^Imq1g_EaiBg2L`BXH~PzynV|!_3U+KtW!zWp9jId2mZO~+hcP;U2Xrw4KZHoUopb{L3X){fZaDC@&Inx&WIi-QRv}SJ5*5RI|VEglfIl4?~Tm zIPM5BRJCc3Zv2NRWGPTnTFM!|4wXHUMU;2knRwwyzh5xzZfldxtBS&4S>%9bTO5jm ze=(t(dmu+QeaEbixM`APKaV_qXsHf=#f2iOhecXBd{0(K$o7Xz{6NqQe7VOBKQEtq zmjuBsEUGIXrkZjvA%CLHIBmmlT)x8=PKS9a+d`Z9^XIE5GOZ5b1Wcu~0tr;nx`&0sL*nClPFXuivMfo(lGqsBf7#Q}o%#H?<4SH7DJat zH++@x2|~Dg1*&(2`NkBsTez*H6DPO^H2%zkn=b@Ho~3wkCZJesR7n#eC8*mK*bZ)# zqgguKYAvs;Yt6J#u{Ar&JO5b1C!2+{1XM%LZ_I zMVTA*k4O~X75l0-#1jS_@|aE+e-Ua~TwUA$38)%Z<%xB4;vlskgCE3QLwDn@ftuw0 zg1Db1i~?+46Psh~(bBSGhxTL{Pl9&lgdP~7Rv15OFisp~AE}3Z#)TRbH;&^WnQqLJ z|7~NgP(PCeMpRt6a=fCh?s$TqUqnKnkV}5z6+B4l&fYcrV*JD$(ji~JMBBfgt=_z& zruIa}jBVl%V|$w4K{px}S>pUu-aPqa8Yili!qt^W51mq-i#lsRa6*`Ww&qSSb84;P ze|#Upa@S@tuXE4l`KtT^GDZ!uKm0jP<2qPDEVQ;{>~PZE3tSvv46)KG)|aeXCqS6| z#MZ(YkrOj*1WsHr%%dxYV_26+2dz^LbgI$5Cy_2%y5x0X6#sc>%^4RgH*fAv7^NW> zL8fRvQjSp%dq_^Q3f?e13*z)#gcZb2Oqdy0%$Ap}I=Eb;fbYQZ^|#b8h4D^5#D;_z zuJjckJQ_vZh@1N;q7g`Y1#sfwC^wLB#C#x_EB0W9FlWGQDs)gQQcE`#2-)MASsN;H ztJNI;xb9gXEOKH=5LwN5DfolX`XFh2oA@v!MsCbidiiy!r67Br!Jenu&w4YW)H*9j z)O)Q9bPge%Ll_szMI$HL2?GD|HLfV1Wi2LOuvG|KGW1&wF0JKtg5idG6f3 zGkbUT&U0tqoXAPaQeR!DuzSz`LsfY4xhI~k!ZSvmf0kOPwWMN2{SG?1wTcG}>W>~W zXaIWXkbY>%dxesm0)?lacp49)6YCzZEYkC9RLSH1t3zo^3sbEC5f97 zwV9(7*=PpHA!eG+cLfTN8xXnY-As$0$Gi+%Z6oI7t3cT*WR1BhLJGLEL`~F2UDZrG zXg}883+bl5$j-VN*+namT~&?j=4QEB+FhNbbmC{^fC5korduBv?3y{>8r){D&6m=* z041P3=$iD0=?8<}$?GU_Fz5{i#uy5Y1|yPl_DCBabe4i0!LGsHvKAZ|^o*_k!A;f= z3EvNnq#p)O2u_Pf9|@ka{_M1m)4r6_W@BF%Tpo{J%e~gpOM^S2C-B@C-y!VRgLi{x zf|r6x0aon$I3NoB?BM(0*VwlpSYmx;P#x5Uyr2~3gaxt|wg^jNt9{rtwo1d@t=~61 zIP6V75DX2EMvsu9yzr!W-WlP!v2}5HWq3XPE#X~Z4gCY)v2d)cMT?^4@x154S7KlH zaEf`}4Bt=O82dgCKMkkjn-l&Rmc@6JhZV84GOP*LM?sVkA%|1}3@i;fy>``X-migTvbg9iRHqS`YBW%vl zARpb*Jk!lH-0Xv}oo+Jypu0)T#E-T(Kbjt+EIbzyA1w)O5xQfe1G8;(KlAKio)*~X zz-%`V-2)HWVp;?@#ymgCw0Wonq0KJAMw`7%*ukFIXnR&5Jo>L&j15=Otz_Cf>uj_# zXo8(Ee~$T^Vxt{)Ff{h8LTAhJDYT}_w2f}#&qOzJ*gD@?USsVWaK2ndW(435!;RZYBwBaW1gP6{eS%$MU0395(w~C~R9pzJzXUF>`Hn zk|6+rStsm zpf5N@E{u}BT#jM0*Qs-@9}Er$$AVEwf1pdj)ph5){u25oWig(vozZzJRFPV%qrJ^# zGHrR7Z2Xkz$#~4PmS<5`;7eCyIT;g_gE(T5A98bpo9HIFscss!)C?4F0_W_BZhLeZ zcNVCHN)Y_MiSYaG==NxAJn@qNPa>Wp#xMnpe(I)6a#$}YfmH(9gRU`3!R}yRds>yy zZjkAlgbwn}ZflyFRs_BaTO^+tB;RdUy)E))dn@*Kg3{b%HwDjY?gM4GkJ;@ew%bkB zT+%Rb0=QOkC7bQ*`c4C9gA2jsTfEn)+SseW&ONh-nVn&FrrFzLH|PC#=iLuhZw)jI z)zKPZI7w&dTwSayb-ixUU3x%|iO9htB69d2%g)_Ghy8@ckB<>oPErG-t19kKVkNf3X}n|po!DxiX;tpgWb38XE)5%ASPU$;L7ROyY)d{ z&=oOp-SjHtZW^Q4b)ddQj&#jk za~6`nP)PlaHpP(X8?8mEwxZ8r( z%sG^PC^!rp4vqjvf}_CE;23Z$IF7l)z;G}Ej0B^IdptM+oCr<=CxcVKso*qlIyeKI z3C;qex$kUn4mcN_hwprF0k{xc1TF@bfJ?z;;Bs&UxC&eit_9bD>%k4+M(}^&CU7&j z1>6d51Gj@ac+Q>RE^s%v2iyzp1NVamz=Pl+<~|G_0gr+)%1H-^@FanGOqrutW9B?kUk{EZ;-wEylcY}Mtz2H7@KX?E<2*&V?v0xk+4<_)e ziC_|#45skhsbCs-4ZIF=m5Xlfe^yKGC<0eq0^Cg7h4CV|NyC|sgQYWhfv zOSQLl6wPn+t7J`%t14gNSNgR|X@03+LzhQ9YrZz_7peYMK<1rauXJW+N`Aes_O<9A z{36yW1^ySmLLzz-SyKYA22iOjHowfe48K~eKKA`d%+*A)=KpJYp_H=jWaGNt#)>03 z)*ku!cD;tkwa5p40r^?Ny5I9F@y{c6P0D>0hGa_}v+G%4rJu)2d2heOSBv>vmk|{& z`y;G!V$iE4E3l_yTdsNXmYR(bp@OLMc}5L+k^j|y&E75d&-;)30_73;3C581VwvK+S|D)lYraqk* zHkZmFBgxpG8~^6ZA~Ckca)M8m%?4wyrb1*ZT5s$AoiiX!)>yCQz_Kua$T_0XZ(XDI zjC-psyJFRqtgmX58P(QB#u%m4@Y4EslyhT(pF}G2`}vsg zq=2hRztT>XRW@sm#o-rUyr*&fG;n788uO&gPMy4%#h+XM61iS$*4xUWYoYy>+VaR_ zWNhRe?2W(oe=5_)LXZUlVA^&jSsCo~&*a!*+ZnrHvnP@5Aek$RU5R8g)=jpbBj@ii z?+HJdtIzywJTMP_eCOXrD*c;E=h}GU%VE(g%(+9d^F{u-x-2JBg*_=lj>=4fCkcDM zWvqPz5$45jFq3=>@_7J_PvJ&!uEinFut7mE|0vGIvB*T$IJ@EL3Q zsWr~hBh?n$a-EEk{NmUhxhZFX8d^R5*Gg^aNhV>{ZT|f_uEv|)?V9+EwcN0W<;hc@ zQ#Q%t96Ra7==3DV8~molJha%@fv>=~H7#f$@-le5#Q(r*SK3~d`Pp`I{eqWYhS-bZ ze79pi;;#w#6I9d_w@QHMYl&P#Un^=G&ph7#b7HTs418;&RVo3=FPYUw_16A|@K5Pq zZFTp=ud_2E%f9~BlGg4@X}0fc8s_)kTF=z2oL2>E0#w3slB_x%tocHm*?P`~MtA$u!a&*<-eB$g>Ycnl#YxrlU$$GN<2^r%W;k(Rtp%UNQ z;778ONv&krjtCFEf4za)nP+?VGj%@QR}-r;{%y~p)%|J#rKP^u@(P- zUW}}up6t8PaO0QT+h(Mt_`XLf=*!G5waxzufpDERU^k{&tLI{wH>1mj8ntS!p{m4_R*KPMNa!MpT%;N(BmJ9QF&) z-`0QL!5{ys(PspYt6eVtjJ`;pZ5WSE8$v-?Wdxg8IJjig$(VbGHI? zB{5gQ(@%Lyjg8K*SR0fH-|F07?=SCd6sf(Wj_Rs5+5zdPozz{O)Dzjy{yVk51|vN* zL|5axR^R9XeW#`ROly!|Rg3(ljjmK>Zhv=(%Xd9pZ`a)QMT%U1q?H@!2DxJQA9tuL zafiE6u8lj@o#u9QXCS5SB6p4J=5BR&x_#Z<$U*L2cb_}hJ>VX6-QB}TPd5wcW&cNw zkTjFMl#b*pfrQFHB4r|bDhp|9|KD-SLprJv(iq9dQ-FkOf^<+J5~?XutY%0fHAf27 z0&!}oBJOU5?4e>LSKA=1RHD|3)D8*M9?4NhBv2=$ojN1gmd%#xX8+UO6=|;BkPPjP zBv|8KtZ{Fov-UwUwJ*|)oFB;igOGN%2QAebDYE}VCDb1Y#D3r(f+TdPjwKVvX{7S) z|5Kq()LDu&TIZ^%{jbXDTEyu(q@%9aO=RI_-HzuDJ;?lrkPdoSkMe$x=_xWWM&rrA z(|T1-{3n16OwsGS`x|cyK=Y7nEkLqWj$~^Ql5PBGY5XX1q03d^ z@?2vzhat_BVgD&hxE8Jjqx`=NyMybjEZ4>DpiHHIjxC2!HD-KqB_;m<& zPuEjBx?V717r542B@VWsVHsDI+#v1d;2aSScZaKuJHj2I*6v7mB=%A6DD0!% zF+@Ao4Oa^{!j06naB~#%VW+lnuv5Fk&WqH^UFEo44gTt&vD= zkc8SIFgwZV&^Vo=E=Zv5k!G9|rL3_V5@;91SdM2mB->aXY7ZnWh3ngm!-=Ak4 zfCR99h(cp?y0JOZD0u9Q#}Pcf0{cp28(kH1I%Y7V55ZlR!rg)`aJQ-6MiP1l3G^j-YC}2y4-(N*#(3I|lmo0KSr>)Bb*i3?+s0Gdwr$(iQ`>e& z9sR*Swx?~|(S&2$6O5;_Q@MF)U97dwsa-qU2uS27eTCPz|Io2yFIYBj3E73SRuof> z9H18dkY1B>=ss-3&>Uuu9x*J3U1LWN$>BBl_g_*0;qdT@A(14KNgtIqVC>S?n(?nN!IB z44*K3&hV9zWpj&pYk6RSBg>b!Y{jVnTXQSGHoOyHTRsS|9bYY9S-PBG00+qaRqYf@ z0w5xW8HQC1lMPc0EvI2DnTFXU<45B{KCu=j!XytQlYEdfDF);LBAsfq<~OCQzPf6* zHo1b}yUV@j-t#7U?Y;H^7J56p5B&Q6z!(?PKjt$8hS>xVH?lz0#WY}qAu&IuIr}m=pLde zxiq8+EPYy7KE!1W^rx~K>^gKJtRJ=La{K#)szXOk~U^aoDp;vD`v?8&9BavER z#G4QW;SLIYr4SI1gvbm#=)l80i2B`_%*XUO^KtwwV>uO{pzjs*Ho_<9Qw6V`~WklL7w*FX@}NpkMUYN54Ur`T5FplRr@flfbA*5X^qxJ z^ICw1Xd2xbkcF(~xzYUAiav2jtF;A8CzDp?<5iK075tI)OeVRsDl=0%h|rR@bfhai z>B~TdGLo@OWGXY6%R&k%Wd&>4z!pRvq7h;|vhy~?D~Pj*^T@Jy8F3YH9dQ$J8*vx$ zG2&Ci=ZG(n-a>jC5wYE2o8zHd<4qkXll|6sBvXfmmepkX;P{GxIQ~HRR-N`H4GATW z2DDeTGB)-br;$TLTGEl83}hq|na*4mQ_3nfu#KViWobCVHH!9!-?KPlK& z0eIS_(*uwoI}iroKRwUZ+TMM(ZQDNEwr#6)wr$(CZ5wlcW|G4iRrOW(Af2kDTYkq2 z0HB@*umX^-xKrxlLz#l7Wf0>B^b9TH^8kE^v);S=q&{O5K6Kt?96(3-y@-j87)#(O zc@B?BbG#{)aHlhhYwEFf1$r9+&RX}1XBPi=@PxdIXXPopCHEm#QV=ach*QN7Aa_tC zzs2A!?9<#D@`#^1Z}I;aia@wtOR;JS-cp+oteWB>etTV=;eID^ueyvo)ippJL6q|h z0z6d_=M-W6y3GIfNvzNL%I4IUMzJ2lS?uIwjFg(lsqUAVZoDxV@y}0)R8cs(|zMdA*a#};ZXb|`1H{v@V z_kK;C;eFO+|21(paPM%*kFTY!dr};p*962!eL%MIta+YT0oZru4yV%;qX!)|?48dv wx&3AhFwPjZR$XJbvBFqmB+Kva62^hll(~M_kp8nZ^^D#%3i+=C8ING00OC5ps{jB1 literal 0 HcmV?d00001 diff --git a/src/vendor/fonts/CabinetGrotesk-Extrabold.woff b/src/vendor/fonts/CabinetGrotesk-Extrabold.woff new file mode 100644 index 0000000000000000000000000000000000000000..46adfad28adc58689d1a3539c5bd7839bdd99b6c GIT binary patch literal 23520 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 diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 05e1a80..a634ad6 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -9,24 +9,87 @@ import ModalWithForm from "../ModalWithForm/ModalWithForm"; function App() { const [clothingItems, setClothingItems] = useState(defaultClothingItems); - const [activeModal, setActiveModal = useState("")]; - const [selectedCard, setSelectedCard = useState({})]; - function handleOpenItemModal (card) { - setActiveModal ("item-modal"); - setSelectedCard (card); + const [activeModal, setActiveModal] = useState(""); + const [selectedCard, setSelectedCard] = useState({}); + function handleOpenItemModal(card) { + setActiveModal("item-modal"); + setSelectedCard(card); } - function handleOpenAddGarmentModal (card) { - setActiveModal ("add-garment-modal"); + function handleOpenAddGarmentModal(card) { + setActiveModal("add-garment-modal"); } return (
    -
    +
    - -

    TEXT

    -
    + +
    + +
    +
    + Select the weather type: + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    ); } diff --git a/src/components/ItemCard/ItemCard.jsx b/src/components/ItemCard/ItemCard.jsx index 0212f25..0fe79fc 100644 --- a/src/components/ItemCard/ItemCard.jsx +++ b/src/components/ItemCard/ItemCard.jsx @@ -5,10 +5,18 @@ function ItemCard({ data, onCardClick }) { onCardClick(data); } + function handleOpenCard() { + onCardClick(data); + } return (
  • {data.name}

    - {data.name} + {data.name}
  • ); } diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index dcaabd1..168afa8 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -2,14 +2,20 @@ import WeatherCard from "../WeatherCard/WeatherCard"; import ItemCard from "../ItemCard/ItemCard"; import "./Main.css"; -function Main({ clothingItems }) { +function Main({ clothingItems, handleOpenItemModal }) { return (

    Today is 75° F / You may want to wear:

      {clothingItems.map((item) => { - return ; + return ( + + ); })}
    From 44cc425477d719a2872c7e18879323bef5958064 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Sun, 9 Nov 2025 13:58:55 -0600 Subject: [PATCH 07/66] Project 9 Part 11 --- src/components/App/App.jsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index a634ad6..d8fbd12 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -18,12 +18,24 @@ function App() { function handleOpenAddGarmentModal(card) { setActiveModal("add-garment-modal"); } + + function handleCloseItemModal(card) { + setActiveModal(""); + } + + function handleCloseAddGarmentModal(card) { + setActiveModal(""); + } return (
    -
    +
    From 400f76a3fefa41a4468790a0743cd01a0ad9aa29 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Tue, 11 Nov 2025 09:29:44 -0600 Subject: [PATCH 08/66] Sprint 9 update 1 --- src/{ => components}/ItemModal/ItemModal.css | 0 src/{ => components}/ItemModal/ItemModal.jsx | 0 src/{ => components}/ModalWithForm/ModalWithForm.css | 0 src/{ => components}/ModalWithForm/ModalWithForm.jsx | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => components}/ItemModal/ItemModal.css (100%) rename src/{ => components}/ItemModal/ItemModal.jsx (100%) rename src/{ => components}/ModalWithForm/ModalWithForm.css (100%) rename src/{ => components}/ModalWithForm/ModalWithForm.jsx (100%) diff --git a/src/ItemModal/ItemModal.css b/src/components/ItemModal/ItemModal.css similarity index 100% rename from src/ItemModal/ItemModal.css rename to src/components/ItemModal/ItemModal.css diff --git a/src/ItemModal/ItemModal.jsx b/src/components/ItemModal/ItemModal.jsx similarity index 100% rename from src/ItemModal/ItemModal.jsx rename to src/components/ItemModal/ItemModal.jsx diff --git a/src/ModalWithForm/ModalWithForm.css b/src/components/ModalWithForm/ModalWithForm.css similarity index 100% rename from src/ModalWithForm/ModalWithForm.css rename to src/components/ModalWithForm/ModalWithForm.css diff --git a/src/ModalWithForm/ModalWithForm.jsx b/src/components/ModalWithForm/ModalWithForm.jsx similarity index 100% rename from src/ModalWithForm/ModalWithForm.jsx rename to src/components/ModalWithForm/ModalWithForm.jsx From ea8a9fea2d62435f0b885884839db041f501e9b4 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 12 Nov 2025 15:44:41 -0600 Subject: [PATCH 09/66] Project 9 update 2 --- src/components/App/App.css | 1 + src/components/Header/Header.css | 7 +++++++ src/components/Header/Header.jsx | 10 ++++------ src/components/ItemCard/ItemCard.css | 5 +++++ src/components/ModalWithForm/ModalWithForm.jsx | 2 +- src/components/WeatherCard/WeatherCard.css | 1 + 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/components/App/App.css b/src/components/App/App.css index a28c6c8..363b86b 100644 --- a/src/components/App/App.css +++ b/src/components/App/App.css @@ -2,4 +2,5 @@ margin: 0 auto; max-width: 1360px; padding: 32px 20px 24px; + font-family: Cabinet Grotesk, sans-serif; } diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css index 31ff9f7..e85f322 100644 --- a/src/components/Header/Header.css +++ b/src/components/Header/Header.css @@ -9,8 +9,15 @@ .header__add-clothes-btn { margin-left: auto; margin-right: 20px; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; + font-size: 20px; + line-height: 24px; + color: rgba(0, 0, 0, 1); } .header__username { margin-right: 12px; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; } diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index ba54a15..7314a44 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -11,12 +11,10 @@ function Header({ handleOpenAddGarmentModal }) { return (
    WTWR logo -

    - , New York - -

    + +

    , New York

    @@ -84,7 +84,7 @@ function App() { value="warm" /> @@ -97,7 +97,7 @@ function App() { value="cold" /> diff --git a/src/components/Footer/Footer.css b/src/components/Footer/Footer.css index c7c8663..8abfd6d 100644 --- a/src/components/Footer/Footer.css +++ b/src/components/Footer/Footer.css @@ -1,10 +1,11 @@ .footer { font-family: Cabinet Grotessk, sans-serif; font-weight: 500; - display: block; - margin: 0; - padding: 0; + margin: 15px; + padding: 15px; font-size: 16px; color: rgba(0, 0, 0, 1); + display: flex; justify-content: space-between; + width: 100%; } diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx index e0b8b5e..ef650af 100644 --- a/src/components/Footer/Footer.jsx +++ b/src/components/Footer/Footer.jsx @@ -1,7 +1,14 @@ import "./footer.css"; function Footer() { - return
    Developed by Nicholas Amos 2025
    ; + return ( +
    +
    + Developed by Nicholas Amos + 2025 +
    +
    + ); } export default Footer; diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css index 946086e..8e69398 100644 --- a/src/components/Header/Header.css +++ b/src/components/Header/Header.css @@ -14,8 +14,6 @@ font-size: 20px; line-height: 24px; color: rgba(0, 0, 0, 1); - padding-bottom: 10px; - gap: 20px; background: transparent; border: none; } @@ -28,10 +26,10 @@ } .header__place { - margin: 20px; + padding-top: 5px; } .header__dateTime { - margin: 0; - padding: 0; + margin-top: 21px; + margin-right: 3px; } diff --git a/src/components/ItemCard/ItemCard.css b/src/components/ItemCard/ItemCard.css index d455ba8..fc73468 100644 --- a/src/components/ItemCard/ItemCard.css +++ b/src/components/ItemCard/ItemCard.css @@ -18,10 +18,12 @@ color: rgba(0, 0, 0, 0.6); text-align: center; line-height: 20px; + background-color: rgba(255, 255, 255, 1); + border-radius: 4px; } .card__image { width: 100%; object-fit: cover; - border-radius: 1px; + border-radius: 16px; } diff --git a/src/components/ItemModal/ItemModal.css b/src/components/ItemModal/ItemModal.css index 9225651..5491e10 100644 --- a/src/components/ItemModal/ItemModal.css +++ b/src/components/ItemModal/ItemModal.css @@ -49,13 +49,17 @@ .modal__footer { background-color: #fff; - margin-left: 32px; margin-bottom: 32px; - margin-top: 20px; + padding: 32px; + border-radius: 16px; } .modal__text { margin: 0; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; + font-size: 20px; + color: rgba(0, 0, 0, 1); } .modal__title { diff --git a/src/components/Main/Main.css b/src/components/Main/Main.css index 624f533..c189fdb 100644 --- a/src/components/Main/Main.css +++ b/src/components/Main/Main.css @@ -6,4 +6,5 @@ margin: 0; list-style-type: none; justify-content: center; + border-radius: 20px; } From 089a24d98f8ed50f87eceae3f56aad66acdeae85 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Sun, 23 Nov 2025 20:27:24 -0600 Subject: [PATCH 15/66] Project 10 video 2 --- src/components/App/App.jsx | 11 ++++++++++- src/utils/constants.js | 3 +++ src/utils/weatherApi.js | 11 +++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/utils/constants.js create mode 100644 src/utils/weatherApi.js diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 2ee7b64..a5a6908 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import Header from "../Header/Header"; import Main from "../Main/Main"; import Footer from "../Footer/Footer"; @@ -6,6 +6,7 @@ import { defaultClothingItems } from "../../utils/defaultClothingItems"; import "./App.css"; import ItemModal from "../ItemModal/ItemModal"; import ModalWithForm from "../ModalWithForm/ModalWithForm"; +import { getWeatherData } from "../../utils/weatherApi"; function App() { const [clothingItems, setClothingItems] = useState(defaultClothingItems); @@ -26,6 +27,14 @@ function App() { function handleCloseAddGarmentModal(card) { setActiveModal(""); } + + useEffect(() => { + getWeatherData() + .then((res) => { + console.log(data); + }) + .catch(console.error); + }, []); return (
    { + return res.ok + ? res.json() + : Promise.reject("Error from weather API: ${res.status}"); + }); +} From e0052f604f7ab5178ba8b3a2830a46970b6c0397 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Sun, 23 Nov 2025 20:53:31 -0600 Subject: [PATCH 16/66] Project 10 video 3 --- src/components/App/App.jsx | 7 +++++-- src/components/Header/Header.jsx | 4 ++-- src/components/Main/Main.jsx | 8 +++++--- src/components/WeatherCard/WeatherCard.jsx | 4 ++-- src/utils/weatherApi.js | 22 +++++++++++++++++----- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index a5a6908..9d8aee9 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -12,6 +12,7 @@ function App() { const [clothingItems, setClothingItems] = useState(defaultClothingItems); const [activeModal, setActiveModal] = useState(""); const [selectedCard, setSelectedCard] = useState({}); + const [weatherData, setWeatherData] = useState({ name: "", temp: "0" }); function handleOpenItemModal(card) { setActiveModal("item-modal"); setSelectedCard(card); @@ -30,18 +31,20 @@ function App() { useEffect(() => { getWeatherData() - .then((res) => { - console.log(data); + .then((data) => { + setWeatherData(data); }) .catch(console.error); }, []); return (
    {dateStr} -

    , New York

    +

    , {weatherData.city}

    -

    Terrence Tegegne

    - Terrence Tegegne's Avatar +
    + WTWR logo + +

    , {weatherData.city}

    +
    +
    + + +

    Terrence Tegegne

    + Terrence Tegegne's Avatar +
    ); } diff --git a/src/components/ToggleSwitch/ToggleSwitch.css b/src/components/ToggleSwitch/ToggleSwitch.css new file mode 100644 index 0000000..41fb04d --- /dev/null +++ b/src/components/ToggleSwitch/ToggleSwitch.css @@ -0,0 +1,37 @@ +.toggle-switch { + width: 56px; + height: 28; + border: 2px solid #7e7e7e; + border-radius: 20px; + padding: 0 10px; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + position: relative; + z-index: 0; +} + +.toggle-switch__checkbox { + visibility: hidden; + position: absolute; +} + +.toggle-switch__circle { + position: absolute; + top: -2px; + left: -2px; + width: 28px; + height: 28px; + border-radius: 50%; + background-color: #000; + z-index: -1; +} + +.toggle-switch__value { + color: #7e7e7e; + font-size: 14px; + line-height: 1; + font-weight: 700; + font-family: Cabinet Grotesk, sans-serif; +} diff --git a/src/components/ToggleSwitch/ToggleSwitch.jsx b/src/components/ToggleSwitch/ToggleSwitch.jsx new file mode 100644 index 0000000..401ca4a --- /dev/null +++ b/src/components/ToggleSwitch/ToggleSwitch.jsx @@ -0,0 +1,18 @@ +import "./ToggleSwitch.css"; + +function ToggleSwitch() { + return ( + + ); +} + +export default ToggleSwitch; From a24240a706dca461f3d731184ed922a3fc0894b9 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 24 Nov 2025 22:29:35 -0600 Subject: [PATCH 18/66] Project 10 video 5 --- src/components/ToggleSwitch/ToggleSwitch.css | 13 +++++++++++++ src/components/ToggleSwitch/ToggleSwitch.jsx | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/components/ToggleSwitch/ToggleSwitch.css b/src/components/ToggleSwitch/ToggleSwitch.css index 41fb04d..3774ab4 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.css +++ b/src/components/ToggleSwitch/ToggleSwitch.css @@ -28,6 +28,11 @@ z-index: -1; } +.toggle-switch__checkbox:checked + .toggle-switch__circle { + right: -2px; + left: unset; +} + .toggle-switch__value { color: #7e7e7e; font-size: 14px; @@ -35,3 +40,11 @@ font-weight: 700; font-family: Cabinet Grotesk, sans-serif; } + +.toggle-switch__checkbox:checked ~ .toggle-switch__value_right { + color: #fff; +} + +.toggle-switch__checkbox:not(:checked) ~ .toggle-switch__value_left { + color: #fff; +} diff --git a/src/components/ToggleSwitch/ToggleSwitch.jsx b/src/components/ToggleSwitch/ToggleSwitch.jsx index 401ca4a..3243a76 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.jsx +++ b/src/components/ToggleSwitch/ToggleSwitch.jsx @@ -1,12 +1,24 @@ +import { useState } from "react"; import "./ToggleSwitch.css"; function ToggleSwitch() { + const [tempUnit, setTempUnit] = useState("F"); + + function handleChange() { + if (tempUnit == "F") { + setTempUnit("C"); + } else { + setTempUnit("F"); + } + } + return (
    ); diff --git a/src/components/ClothesSection/ClothesSection.jsx b/src/components/ClothesSection/ClothesSection.jsx index a99d5ea..f80c22e 100644 --- a/src/components/ClothesSection/ClothesSection.jsx +++ b/src/components/ClothesSection/ClothesSection.jsx @@ -1,12 +1,21 @@ import "./ClothesSection.css"; import ItemCard from "../ItemCard/ItemCard"; -function ClothesSection({ clothingItems, handleOpenItemModal }) { +function ClothesSection({ + clothingItems, + handleOpenItemModal, + handleOpenAddGarmentModal, +}) { return (
    Your items - +
      {clothingItems.map((item) => { diff --git a/src/components/Profile/Profile.jsx b/src/components/Profile/Profile.jsx index 7a7bde2..2ec60be 100644 --- a/src/components/Profile/Profile.jsx +++ b/src/components/Profile/Profile.jsx @@ -2,11 +2,19 @@ import "./Profile.css"; import SideBar from "../SideBar/Sidebar"; import ClothesSection from "../ClothesSection/ClothesSection"; -function Profile({ clothingItems }) { +function Profile({ + clothingItems, + handleOpenAddGarmentModal, + handleOpenItemModal, +}) { return (
      - +
      ); } From 4fb7f6d1b8279e793b7aff0d0ff40cb240bc1735 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 8 Dec 2025 01:34:15 -0600 Subject: [PATCH 32/66] Project 11 video 6 --- src/components/AddItemModal/AddItemModal.jsx | 19 +++++++++++++------ src/components/App/App.jsx | 9 ++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index bfa4dfa..0a3544c 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -1,8 +1,16 @@ import ModalWithForm from "../ModalWithForm/ModalWithForm"; import { useForm } from "../../hooks/useForm"; -function AddItemModal({ isOpen }) { - const { values, handleChange } = useForm({ name: "", weather: "hot" }); +function AddItemModal({ isOpen, handleAddItemSubmit }) { + const { values, handleChange } = useForm({ + name: "", + weather: "hot", + image: "", + }); + const handleSubmit = (event) => { + event.preventDefault(); + handleAddItemSubmit(values); + }; return (
      -
    ); From cfbbe340a172aebbb620a2a45e8670bfe914a253 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 8 Dec 2025 09:44:26 -0600 Subject: [PATCH 33/66] Project 11 video 7 --- db.json | 106 +++++++++++++++++++++++++ package.json | 3 +- src/components/App/App.jsx | 9 ++- src/components/ItemCard/ItemCard.jsx | 2 +- src/components/ItemModal/ItemModal.jsx | 2 +- src/utils/api.js | 10 +++ 6 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 db.json create mode 100644 src/utils/api.js diff --git a/db.json b/db.json new file mode 100644 index 0000000..a285420 --- /dev/null +++ b/db.json @@ -0,0 +1,106 @@ +{ + "items": [ + { + "_id": 0, + "name": "Beanie", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Beanie.png?etag=bc10497cc80fa557f036e94f9999f7b2" + }, + { + "_id": 1, + "name": "Boot", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Boot.png?etag=0953a2ea59f1c6ebc832fabacdc9c70e" + }, + { + "_id": 2, + "name": "Cap", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Cap.png?etag=f3dad389b22909cafa73cff9f9a3d591" + }, + { + "_id": 3, + "name": "Coat", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Coat.png?etag=298717ed89d5e40b1954a1831ae0bdd4" + }, + { + "_id": 4, + "name": "Dress", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Dress.png?etag=1f9cd32a311ab139cab43494883720bf" + }, + { + "_id": 5, + "name": "Hoodie", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Hoodie.png?etag=5f52451d0958ccb1016c78a45603a4e8" + }, + { + "_id": 6, + "name": "Jacket", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Jacket.png?etag=f4bb188deaa25ac84ce2338be2d404ad" + }, + { + "_id": 7, + "name": "Jeans", + "weather": "warm", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Jeans.png?etag=58345e8bef1ce5f95ac882e71d309e6c" + }, + { + "_id": 8, + "name": "Loafers", + "weather": "warm", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Loafers.png?etag=dc2d6e1ca7b297597406e35c40aef030" + }, + { + "_id": 9, + "name": "Sandals", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sandals.png?etag=9bea85a77c0306586d2b71a33b626d41" + }, + { + "_id": 10, + "name": "Scarf", + "weather": "cold", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Scarf.png?etag=74efbee93810c926b5507e862c6cb76c" + }, + { + "_id": 11, + "name": "Shorts", + "weather": "Hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Shorts.png?etag=d728c496643f610de8d8fea92dd915ba" + }, + { + "_id": 12, + "name": "Skirt", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Skirt.png?etag=27a6bea7e1b63218820d615876fa31d1" + }, + { + "_id": 13, + "name": "Sneakers", + "weather": "warm", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sneakers.png?etag=3efeec41c1c78b8afe26859ca7fa7b6f" + }, + { + "_id": 14, + "name": "Sunglasses", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sunglasses.png?etag=a1bced9e331d36cb278c45df51150432" + }, + { + "_id": 15, + "name": "Sweatshirt", + "weather": "warm", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/Sweatshirt.png?etag=008a9674757bea2e0bdb31242e364be0" + }, + { + "_id": 16, + "name": "T-Shirt", + "weather": "hot", + "imageUrl": "https://practicum-content.s3.us-west-1.amazonaws.com/software-engineer/wtwr-project/T-Shirt.png?etag=44ed1963c44ab19cd2f5011522c5fc09" + } + ] +} diff --git a/package.json b/package.json index 8f7d4e5..1893bb6 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "dev": "vite --open", "build": "vite build", "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "preview": "vite preview", + "json-server": "json-server --watch db.json --id _id --port 3001" }, "dependencies": { "react": "^18.3.1", diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 7bf4fa0..a628340 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -2,13 +2,14 @@ import { useEffect, useState } from "react"; import Header from "../Header/Header"; import Main from "../Main/Main"; import Footer from "../Footer/Footer"; -import { defaultClothingItems } from "../../utils/defaultClothingItems"; + import "./App.css"; import ItemModal from "../ItemModal/ItemModal"; import { getWeatherData } from "../../utils/weatherApi"; import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; import Profile from "../Profile/Profile"; import AddItemModal from "../AddItemModal/AddItemModal"; +import { getItems } from "../../utils/api"; function App() { const [clothingItems, setClothingItems] = useState([]); @@ -68,7 +69,11 @@ function App() { }, []); useEffect(() => { - setClothingItems(defaultClothingItems); + getItems() + .then((items) => { + setClothingItems(items); + }) + .catch(console.error); }, []); return ( diff --git a/src/components/ItemCard/ItemCard.jsx b/src/components/ItemCard/ItemCard.jsx index 060d566..68b68a5 100644 --- a/src/components/ItemCard/ItemCard.jsx +++ b/src/components/ItemCard/ItemCard.jsx @@ -8,7 +8,7 @@ function ItemCard({ data, onCardClick }) {
  • {data.name}

    {data.name} X - {card.name} + {card.name}

    {card.name}

    {card.weather}

    diff --git a/src/utils/api.js b/src/utils/api.js new file mode 100644 index 0000000..a7373f8 --- /dev/null +++ b/src/utils/api.js @@ -0,0 +1,10 @@ +const baseUrl = "http://localhost:3001/"; +function getItems() { + return fetch("${baseUrl}/items").then((res) => { + return res.ok + ? res.json() + : Promise.reject("Error fetching items: ${res.status}"); + }); +} + +export { getItems }; From 94196d7ca755be87b87a1bc02ed9c53ef5e34d0e Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 8 Dec 2025 10:04:57 -0600 Subject: [PATCH 34/66] Project 11 video 8 --- src/components/AddItemModal/AddItemModal.jsx | 2 +- src/components/App/App.jsx | 6 +++++- src/src/hooks/useForm.js | 11 +++++++++++ src/utils/api.js | 15 ++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/src/hooks/useForm.js diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index 0a3544c..bdafd88 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -9,7 +9,7 @@ function AddItemModal({ isOpen, handleAddItemSubmit }) { }); const handleSubmit = (event) => { event.preventDefault(); - handleAddItemSubmit(values); + handleAddItemSubmit({ ...values, imageUrl: values.link }); }; return ( diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index a628340..5ea71e2 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -57,7 +57,11 @@ function App() { } function handleAddItemSubmit(inputValues) { - setClothingItems([inputValues, ...clothingItems]); + addItem(inputValues) + .then((data) => { + setClothingItems([data, ...clothingItems]); + }) + .catch(console.error); } useEffect(() => { diff --git a/src/src/hooks/useForm.js b/src/src/hooks/useForm.js new file mode 100644 index 0000000..48e6644 --- /dev/null +++ b/src/src/hooks/useForm.js @@ -0,0 +1,11 @@ +import { useState } from "react"; + +export function useForm(defaultValues) { + const [values, setValues] = useState(defaultValues); + const handleChange = (event) => { + const { value, name } = event.target; + setValues({ ...values, [name]: value }); + }; + + return { values, handleChange, setValues }; +} diff --git a/src/utils/api.js b/src/utils/api.js index a7373f8..ae4904f 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -7,4 +7,17 @@ function getItems() { }); } -export { getItems }; +function addItem({ name, imageUrl, weather }) { + return fetch("${baseUrl}/items", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ name, imageUrl, weather }), + }).then((res) => { + return res.ok + ? res.json() + : Promise.reject("Error fetching items: ${res.status}"); + }); +} +export { getItems, addItem }; From fe577733ec308dc99969b4df9fbe7ae6ef3ea057 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 8 Dec 2025 10:29:26 -0600 Subject: [PATCH 35/66] Project 11 video 9 --- src/components/App/App.jsx | 6 ++++++ src/components/ItemModal/ItemModal.jsx | 8 +++++++- src/utils/api.js | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index 5ea71e2..015f8f8 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -64,6 +64,12 @@ function App() { .catch(console.error); } + function handleDeleteItem(item) { + deleteItem(item._id) + .then(() => {}) + .catch(console.error); + } + useEffect(() => { getWeatherData() .then((data) => { diff --git a/src/components/ItemModal/ItemModal.jsx b/src/components/ItemModal/ItemModal.jsx index 4030512..87c0f86 100644 --- a/src/components/ItemModal/ItemModal.jsx +++ b/src/components/ItemModal/ItemModal.jsx @@ -1,6 +1,9 @@ import "./ItemModal.css"; -function ItemModal({ card, isOpen, handleCloseItemModal }) { +function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { + function handleDelete() { + handleDeleteItem(card); + } return (
    @@ -15,6 +18,9 @@ function ItemModal({ card, isOpen, handleCloseItemModal }) {

    {card.name}

    {card.weather}

    +
    diff --git a/src/utils/api.js b/src/utils/api.js index ae4904f..67f0ed9 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -19,5 +19,19 @@ function addItem({ name, imageUrl, weather }) { ? res.json() : Promise.reject("Error fetching items: ${res.status}"); }); + + function deleteItem({ name, imageUrl, weather }) { + return fetch("${baseUrl}/items", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ name, imageUrl, weather }), + }).then((res) => { + return res.ok + ? res.json() + : Promise.reject("Error fetching items: ${res.status}"); + }); + } } export { getItems, addItem }; From 4c15ab84d7ba3c7b4605ce91e137bb819ccca145 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 8 Dec 2025 10:37:41 -0600 Subject: [PATCH 36/66] Project 11 video 9-2 --- src/index.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.css b/src/index.css index 7e165de..b911709 100644 --- a/src/index.css +++ b/src/index.css @@ -1,2 +1,3 @@ @import url(./vendor/normalize.css); @import url(./vendor/fonts/fonts.css); +@import url(./components/SideBar/SideBar.css); From 71d290e834648a7a29250b9d364531ee16d941f3 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 10 Dec 2025 06:49:52 -0600 Subject: [PATCH 37/66] Project 11 update 1 --- src/components/AddItemModal/AddItemModal.jsx | 14 +++-- src/components/App/App.jsx | 33 +++++++--- src/components/Profile/Profile.jsx | 2 +- src/components/SideBar/SideBar.jsx | 2 +- src/index.css | 1 - src/utils/api.js | 49 +++++++-------- src/utils/weatherApi.js | 66 +++++++++++++------- 7 files changed, 101 insertions(+), 66 deletions(-) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index bdafd88..ece9120 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -5,11 +5,13 @@ function AddItemModal({ isOpen, handleAddItemSubmit }) { const { values, handleChange } = useForm({ name: "", weather: "hot", - image: "", + imageUrl: "", }); + const handleSubmit = (event) => { event.preventDefault(); - handleAddItemSubmit({ ...values, imageUrl: values.link }); + // values is { name, weather, imageUrl } + handleAddItemSubmit(values); }; return ( @@ -33,13 +35,15 @@ function AddItemModal({ isOpen, handleAddItemSubmit }) { required /> +
    diff --git a/src/components/Profile/Profile.jsx b/src/components/Profile/Profile.jsx index 2ec60be..ba7dec9 100644 --- a/src/components/Profile/Profile.jsx +++ b/src/components/Profile/Profile.jsx @@ -1,5 +1,5 @@ import "./Profile.css"; -import SideBar from "../SideBar/Sidebar"; +import SideBar from "../SideBar/SideBar"; import ClothesSection from "../ClothesSection/ClothesSection"; function Profile({ diff --git a/src/components/SideBar/SideBar.jsx b/src/components/SideBar/SideBar.jsx index a8294b2..927f356 100644 --- a/src/components/SideBar/SideBar.jsx +++ b/src/components/SideBar/SideBar.jsx @@ -1,5 +1,5 @@ import avatar from "../../assets/avatar.svg"; -import "./Sidebar.css"; +import "./SideBar.css"; function SideBar() { return ( diff --git a/src/index.css b/src/index.css index b911709..7e165de 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,2 @@ @import url(./vendor/normalize.css); @import url(./vendor/fonts/fonts.css); -@import url(./components/SideBar/SideBar.css); diff --git a/src/utils/api.js b/src/utils/api.js index 67f0ed9..725c185 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,37 +1,32 @@ -const baseUrl = "http://localhost:3001/"; -function getItems() { - return fetch("${baseUrl}/items").then((res) => { - return res.ok - ? res.json() - : Promise.reject("Error fetching items: ${res.status}"); - }); +const baseUrl = "http://localhost:3001"; + +function checkResponse(res) { + return res.ok + ? res.json() + : Promise.reject(`Error fetching items: ${res.status}`); +} + +export function getItems() { + return fetch(`${baseUrl}/items`).then(checkResponse); } -function addItem({ name, imageUrl, weather }) { - return fetch("${baseUrl}/items", { +export function addItem({ name, imageUrl, weather }) { + return fetch(`${baseUrl}/items`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name, imageUrl, weather }), + }).then(checkResponse); +} + +export function deleteItem(itemId) { + return fetch(`${baseUrl}/items/${itemId}`, { + method: "DELETE", }).then((res) => { - return res.ok - ? res.json() - : Promise.reject("Error fetching items: ${res.status}"); + if (!res.ok) { + return Promise.reject(`Error deleting item: ${res.status}`); + } + return; }); - - function deleteItem({ name, imageUrl, weather }) { - return fetch("${baseUrl}/items", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ name, imageUrl, weather }), - }).then((res) => { - return res.ok - ? res.json() - : Promise.reject("Error fetching items: ${res.status}"); - }); - } } -export { getItems, addItem }; diff --git a/src/utils/weatherApi.js b/src/utils/weatherApi.js index 4cfed01..b33cccb 100644 --- a/src/utils/weatherApi.js +++ b/src/utils/weatherApi.js @@ -1,33 +1,53 @@ import { apiKey, coordinates } from "./constants"; -export function getWeatherData() { - return fetch( - `https://api.openweathermap.org/data/2.5/weather?lat=${coordinates.lat}&lon=${coordinates.lon}&units=imperial&appid=${apiKey}` - ) - .then((res) => { - return res.ok - ? res.json() - : Promise.reject("Error from weather API: ${res.status}"); - }) - .then((data) => { - return parseWeatherData(data); - }); +function fetchWeatherByCoords(lat, lon) { + const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&units=imperial&appid=${apiKey}`; + + return fetch(url).then((res) => { + return res.ok + ? res.json() + : Promise.reject(`Error from weather API: ${res.status}`); + }); } function parseWeatherData(data) { - const parsedData = { temp: {} }; const icon = data.weather[0].icon; + const tempF = Math.round(data.main.temp); + const tempC = Math.round(((tempF - 32) * 5) / 9); - parsedData.city = data.name; - parsedData.temp.F = Math.round(data.main.temp); - parsedData.temp.C = Math.round(((parsedData.temp.F - 32) * 5) / 9); - parsedData.weatherCondition = data.weather[0].main.toLowerCase(); - parsedData.isDay = isDay(data.sys, Date.now()); - parsedData.isDay = icon.includes("d"); - return parsedData; + return { + city: data.name, + temp: { + F: tempF, + C: tempC, + }, + weatherCondition: data.weather[0].main.toLowerCase(), + isDay: icon.includes("d"), + }; } -function isDay({ sunrise, sunset }, timestamp) { - const timestampInSeconds = 1000 * timestamp; - return sunrise < timestampInSeconds && timestampInSeconds < sunset; +export function getWeatherData() { + return new Promise((resolve, reject) => { + if (!navigator.geolocation) { + fetchWeatherByCoords(coordinates.lat, coordinates.lon) + .then((data) => resolve(parseWeatherData(data))) + .catch(reject); + return; + } + + navigator.geolocation.getCurrentPosition( + (position) => { + const { latitude, longitude } = position.coords; + fetchWeatherByCoords(latitude, longitude) + .then((data) => resolve(parseWeatherData(data))) + .catch(reject); + }, + (error) => { + console.error("Error getting geolocation:", error); + fetchWeatherByCoords(coordinates.lat, coordinates.lon) + .then((data) => resolve(parseWeatherData(data))) + .catch(reject); + } + ); + }); } From 092084cae6ca16ce4d713aeb99c1dc07ff18da92 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 10 Dec 2025 07:08:15 -0600 Subject: [PATCH 38/66] Project 11 update 2 --- src/components/AddItemModal/AddItemModal.jsx | 13 +--- src/components/App/App.jsx | 62 ++++++-------------- src/{src => }/hooks/useForm.js | 0 3 files changed, 22 insertions(+), 53 deletions(-) rename src/{src => }/hooks/useForm.js (100%) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index ece9120..b546cdd 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -1,19 +1,16 @@ import ModalWithForm from "../ModalWithForm/ModalWithForm"; import { useForm } from "../../hooks/useForm"; -function AddItemModal({ isOpen, handleAddItemSubmit }) { +function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { const { values, handleChange } = useForm({ name: "", weather: "hot", imageUrl: "", }); - const handleSubmit = (event) => { event.preventDefault(); - // values is { name, weather, imageUrl } - handleAddItemSubmit(values); + handleAddItemSubmit(values); // { name, weather, imageUrl } }; - return (
    -
    -
    Select the weather type: -
    -
    -
    item.weather.toLowerCase() === weatherType - ); const [clothingItems, setClothingItems] = useState([]); - const [activeModal, setActiveModal] = useState(""); + const [activeModal, setActiveModal] = useState(""); // "", "item-modal", "add-garment-modal" const [selectedCard, setSelectedCard] = useState({}); const [weatherData, setWeatherData] = useState({ city: "", @@ -28,48 +23,33 @@ function App() { }); const [currentTempUnit, setCurrentTempUnit] = useState("F"); function handleOpenItemModal(card) { - setActiveModal("item-modal"); setSelectedCard(card); + setActiveModal("item-modal"); } - function handleOpenAddGarmentModal(card) { - setActiveModal("add-garment-modal"); - } - function handleAddGarmentSubmit(e) { - e.preventDefault(); - const name = e.target["add-garment-name-input"].value; - const link = e.target["add-garment-image"].value; - const weather = e.target.weather.value; - - const newItem = { - _id: Date.now(), - name, - link, - weather, - }; - setClothingItems((items) => [newItem, ...items]); + function handleCloseItemModal() { + setSelectedCard({}); setActiveModal(""); } - function handleCloseItemModal(card) { - setActiveModal(""); + + function handleOpenAddGarmentModal() { + setActiveModal("add-garment-modal"); } - function handleCloseAddGarmentModal(card) { + function handleCloseAddGarmentModal() { setActiveModal(""); } - function handleTempUnitChange() { - if (currentTempUnit == "F") { + if (currentTempUnit === "F") { setCurrentTempUnit("C"); } else { setCurrentTempUnit("F"); } } - function handleAddItemSubmit(inputValues) { addItem(inputValues) .then((data) => { - setClothingItems((clothingItems) => [data, ...clothingItems]); + setClothingItems((prev) => [data, ...prev]); setActiveModal(""); }) .catch(console.error); @@ -84,7 +64,6 @@ function App() { }) .catch(console.error); } - useEffect(() => { getWeatherData() .then((data) => { @@ -100,7 +79,6 @@ function App() { }) .catch(console.error); }, []); - return ( } - > + /> } - > + />
    - Date: Wed, 10 Dec 2025 08:01:47 -0600 Subject: [PATCH 39/66] Project 11 update 3 --- src/components/AddItemModal/AddItemModal.jsx | 29 ++++--- src/components/Footer/Footer.css | 2 +- src/components/Header/Header.css | 2 + src/components/ItemCard/ItemCard.css | 16 ++-- src/components/Main/Main.css | 13 +++- src/components/Main/Main.jsx | 4 +- .../ModalWithForm/ModalWithForm.css | 77 +++++++++++++------ src/components/WeatherCard/WeatherCard.css | 1 + src/components/WeatherCard/WeatherCard.jsx | 49 ++++++++---- 9 files changed, 135 insertions(+), 58 deletions(-) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index b546cdd..96fc450 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -4,13 +4,15 @@ import { useForm } from "../../hooks/useForm"; function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { const { values, handleChange } = useForm({ name: "", - weather: "hot", imageUrl: "", + weather: "hot", }); + const handleSubmit = (event) => { event.preventDefault(); - handleAddItemSubmit(values); // { name, weather, imageUrl } + handleAddItemSubmit(values); }; + return ( +
    +
    - Select the weather type: + Select the weather type: +
    +
    +
    diff --git a/src/components/Footer/Footer.css b/src/components/Footer/Footer.css index 7f7ddbf..255b1a2 100644 --- a/src/components/Footer/Footer.css +++ b/src/components/Footer/Footer.css @@ -1,5 +1,5 @@ .footer { - font-family: Cabinet Grotessk, sans-serif; + font-family: Cabinet Grotesk, sans-serif; font-weight: 500; margin: 15px; padding: 15px; diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css index eac0c36..f42b21a 100644 --- a/src/components/Header/Header.css +++ b/src/components/Header/Header.css @@ -31,6 +31,8 @@ .header__dateTime { margin-right: 3px; + font-weight: 700; + font-size: 20px; } .header__link { diff --git a/src/components/ItemCard/ItemCard.css b/src/components/ItemCard/ItemCard.css index c4a1338..8fa8f66 100644 --- a/src/components/ItemCard/ItemCard.css +++ b/src/components/ItemCard/ItemCard.css @@ -3,14 +3,20 @@ height: 328px; position: relative; display: flex; + align-items: center; justify-content: center; - border: 1px; + background-color: #f3f3f3; border-radius: 20px; + border: 1px solid rgba(0, 0, 0, 0.1); + box-sizing: border-box; + overflow: hidden; } .card__title { position: absolute; top: 15px; + left: 50%; + transform: translateX(-50%); margin: 0; font-family: Cabinet Grotesk, sans-serif; font-weight: 700; @@ -18,14 +24,14 @@ color: rgba(0, 0, 0, 0.6); text-align: center; line-height: 20px; - background-color: rgba(255, 255, 255, 1); - border-radius: 4px; - padding-left: 12px; - padding-right: 12px; + background-color: #ffffff; + border-radius: 999px; + padding: 4px 12px; } .card__image { width: 100%; + height: 100%; object-fit: cover; border-radius: 16px; } diff --git a/src/components/Main/Main.css b/src/components/Main/Main.css index c189fdb..59352c1 100644 --- a/src/components/Main/Main.css +++ b/src/components/Main/Main.css @@ -1,3 +1,15 @@ +.main { + margin-top: 32px; +} + +.main__text { + margin: 24px 0 32px; + font-family: Cabinet Grotesk, sans-serif; + font-size: 20px; + font-weight: 700; + color: rgba(0, 0, 0, 1); +} + .main__card-list { display: flex; flex-wrap: wrap; @@ -6,5 +18,4 @@ margin: 0; list-style-type: none; justify-content: center; - border-radius: 20px; } diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index 03e6c96..4c4ece2 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -26,8 +26,8 @@ function Main({ clothingItems, handleOpenItemModal, weatherData }) {

    - Today is {weatherData.temp[currentTempUnit]} {currentTempUnit} / You may - want to wear: + Today is {weatherData.temp[currentTempUnit]}° {currentTempUnit} / + You may want to wear:

      {filteredItems.map((item) => { diff --git a/src/components/ModalWithForm/ModalWithForm.css b/src/components/ModalWithForm/ModalWithForm.css index 5e0f183..d04bd7a 100644 --- a/src/components/ModalWithForm/ModalWithForm.css +++ b/src/components/ModalWithForm/ModalWithForm.css @@ -1,48 +1,79 @@ .modal__container_type_form { - width: 472px; - height: 193px; - background-color: rgba(255, 255, 255, 1); + width: 496px; + padding: 28px 32px 32px; + background-color: #ffffff; border-radius: 20px; - border: 1px; - border-color: rgba(0, 0, 0, 0.3); + box-shadow: 0 0 25px rgba(0, 0, 0, 0.15); + position: relative; } .modal__close-btn { - padding-top: 22px; - padding-right: 30px; + position: absolute; + top: 24px; + right: 24px; + border: none; + background: transparent; + font-size: 20px; + line-height: 1; + cursor: pointer; color: rgba(0, 0, 0, 0.3); } .modal__title { - font-family: Cabinet Grotesk, sans-serif; + margin: 0 0 24px; font-weight: 700; - font-style: bold; - font-size: 16px; - padding-left: 28px; - padding-top: 28px; + font-size: 20px; + color: rgba(0, 0, 0, 1); } .modal__form { - font-family: Cabinet Grtesk, sans-serif; - font-weight: 700; - font-style: bold; + display: flex; + flex-direction: column; + gap: 24px; +} + +.modal__fieldset { + margin: 0; + padding: 0; + border: none; +} + +.modal__label { + display: block; + font-weight: 400; + font-size: 16px; + color: rgba(0, 0, 0, 1); +} + +.modal__input { + display: block; + width: 100%; + margin-top: 4px; + padding: 4px 0 8px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, 0.3); font-size: 16px; } .modal__submit-btn { - padding-left: 28px; - padding-bottom: 36px; - color: rgba(0, 0, 0, 1); + margin-top: 8px; + align-self: flex-start; + padding: 8px 20px; + border: none; + border-radius: 4px; + font-weight: 700; + font-size: 16px; + background-color: #000000; + color: #ffffff; + cursor: pointer; } .modal__submit-btn:hover { - color: rgba(0, 0, 0, 0.6); + opacity: 0.8; } .modal__submit-btn:disabled { + background-color: #f3f3f3; color: rgba(0, 0, 0, 0.3); -} - -.modal__input { - display: block; + cursor: default; } diff --git a/src/components/WeatherCard/WeatherCard.css b/src/components/WeatherCard/WeatherCard.css index 02190e3..a893b7a 100644 --- a/src/components/WeatherCard/WeatherCard.css +++ b/src/components/WeatherCard/WeatherCard.css @@ -3,6 +3,7 @@ overflow: hidden; border-radius: 12px; position: relative; + margin-top: 16px; } .weather-card__image { diff --git a/src/components/WeatherCard/WeatherCard.jsx b/src/components/WeatherCard/WeatherCard.jsx index 823d33a..436ee25 100644 --- a/src/components/WeatherCard/WeatherCard.jsx +++ b/src/components/WeatherCard/WeatherCard.jsx @@ -1,30 +1,47 @@ import { useContext } from "react"; -import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; -import { weatherConditionImages } from "../../utils/constants"; import "./WeatherCard.css"; +import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; +import { weatherOptions } from "../../utils/constants"; + +function normalizeCondition(condition) { + if (!condition) return "clear"; + const c = condition.toLowerCase(); + + if (c.includes("cloud")) return "clouds"; + if (c.includes("rain")) return "rain"; + if (c.includes("thunder")) return "thunderstorm"; + if (c.includes("snow")) return "snow"; + if (c.includes("drizzle")) return "rain"; + if (c.includes("mist") || c.includes("fog")) return "clouds"; + + return "clear"; +} function WeatherCard({ weatherData }) { const { currentTempUnit } = useContext(CurrentTemperatureUnitContext); - const timeOfDay = weatherData.isDay ? "day" : "night"; - const condition = weatherData.weatherCondition; // e.g. "clouds", "clear", "rain" + const timeOfDayIsDay = weatherData.isDay; + const condition = normalizeCondition(weatherData.weatherCondition); + + let weatherOption = weatherOptions.find( + (option) => option.day === timeOfDayIsDay && option.type === condition + ); - const conditionData = - weatherConditionImages[timeOfDay][condition] || - weatherConditionImages[timeOfDay].default; + if (!weatherOption) { + weatherOption = weatherOptions.find( + (option) => option.day === timeOfDayIsDay && option.type === "clear" + ); + } - const weatherImageSrc = conditionData.image; - const weatherImageAlt = conditionData.name; + const temperature = weatherData.temp[currentTempUnit]; return ( -
      - {weatherImageAlt} +

      - {weatherData.temp[currentTempUnit]}° {currentTempUnit} + {temperature}°{currentTempUnit}

      ); From b6226e96bde04636c048e95448ac0beb44037370 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 10 Dec 2025 08:39:07 -0600 Subject: [PATCH 40/66] Porject 11 update 4 --- .../ClothesSection/ClothesSection.css | 26 +++- .../ClothesSection/ClothesSection.jsx | 2 +- src/components/ItemModal/ItemModal.css | 132 ++++++++++++++---- src/components/ItemModal/ItemModal.jsx | 84 +++++++++-- src/components/SideBar/SideBar.css | 15 +- 5 files changed, 209 insertions(+), 50 deletions(-) diff --git a/src/components/ClothesSection/ClothesSection.css b/src/components/ClothesSection/ClothesSection.css index 890470a..5bb244b 100644 --- a/src/components/ClothesSection/ClothesSection.css +++ b/src/components/ClothesSection/ClothesSection.css @@ -1,13 +1,27 @@ +.clothes-section { + flex: 1; +} + .clothes-section__row { display: flex; + align-items: center; gap: 20px; + margin-bottom: 32px; } -.clothes-section__card-list { - padding: 0; +.clothes-section__title { margin: 0; - list-style-type: none; - display: flex; - flex-wrap: wrap; - gap: 20px; + font-family: Cabinet Grotesk, sans-serif; + font-size: 20px; + font-weight: 700; +} + +.clothes-section__btn { + border: none; + padding: 0; + background: transparent; + font: inherit; + font-weight: 400; + color: rgba(0, 0, 0, 0.5); + cursor: pointer; } diff --git a/src/components/ClothesSection/ClothesSection.jsx b/src/components/ClothesSection/ClothesSection.jsx index f80c22e..11f865c 100644 --- a/src/components/ClothesSection/ClothesSection.jsx +++ b/src/components/ClothesSection/ClothesSection.jsx @@ -9,7 +9,7 @@ function ClothesSection({ return (
      - Your items +

      Your items

      - {card.name} -
      -

      {card.name}

      -

      {card.weather}

      - -
      + + {/* Normal view: image + info + delete */} + {!isConfirmMode && ( + <> + {card.name} +
      +

      {card.name}

      +

      Weather: {card.weather}

      + +
      + + )} + + {/* Confirm view: “Are you sure… Yes / Cancel” */} + {isConfirmMode && ( +
      +

      + Are you sure you want to delete this item? +

      +

      + This action is irreversible. +

      + + + + +
      + )}
      ); diff --git a/src/components/SideBar/SideBar.css b/src/components/SideBar/SideBar.css index be416eb..48839f7 100644 --- a/src/components/SideBar/SideBar.css +++ b/src/components/SideBar/SideBar.css @@ -1,9 +1,16 @@ .sidebar { min-width: 229px; + margin-top: 32px; } -.sidebar__row { - display: flex; - flex-direction: row-reverse; - gap: 16px; +.sidebar__username { + font-family: Cabinet Grotesk, sans-serif; + font-size: 20px; + font-weight: 700; +} + +.sidebar__avatar { + width: 80px; + height: 80px; + border-radius: 50%; } From 7f326c8303172ecd41d7e824d1a414dad98ba05e Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 10 Dec 2025 08:40:26 -0600 Subject: [PATCH 41/66] Project 11 update 5 --- src/components/ItemModal/ItemModal.css | 2 +- src/components/ItemModal/ItemModal.jsx | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/ItemModal/ItemModal.css b/src/components/ItemModal/ItemModal.css index b93cf32..c4fe81b 100644 --- a/src/components/ItemModal/ItemModal.css +++ b/src/components/ItemModal/ItemModal.css @@ -127,7 +127,7 @@ background: transparent; font: inherit; font-weight: 700; - color: #ff4f4f; /* orange/red like Figma */ + color: #ff4f4f; cursor: pointer; margin-bottom: 16px; } diff --git a/src/components/ItemModal/ItemModal.jsx b/src/components/ItemModal/ItemModal.jsx index fa3a82a..883e919 100644 --- a/src/components/ItemModal/ItemModal.jsx +++ b/src/components/ItemModal/ItemModal.jsx @@ -4,7 +4,6 @@ import "./ItemModal.css"; function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { const [isConfirmMode, setIsConfirmMode] = useState(false); - // whenever the modal closes, reset back to normal view mode useEffect(() => { if (!isOpen) { setIsConfirmMode(false); @@ -17,12 +16,10 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { } function handleDeleteClick() { - // switch to confirm screen setIsConfirmMode(true); } function handleConfirmDelete() { - // actually delete the item (App.jsx will remove it + call the API) handleDeleteItem(card); } @@ -41,7 +38,6 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { X - {/* Normal view: image + info + delete */} {!isConfirmMode && ( <> {card.name} @@ -59,7 +55,6 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { )} - {/* Confirm view: “Are you sure… Yes / Cancel” */} {isConfirmMode && (

      From c6de283544fa467328e7fcdd3a201156ce44e5c5 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Wed, 10 Dec 2025 08:49:42 -0600 Subject: [PATCH 42/66] Project 11 update 6 --- src/components/ToggleSwitch/ToggleSwitch.css | 43 ++++++++++++-------- src/components/ToggleSwitch/ToggleSwitch.jsx | 10 +++-- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/components/ToggleSwitch/ToggleSwitch.css b/src/components/ToggleSwitch/ToggleSwitch.css index 25a130f..e206b93 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.css +++ b/src/components/ToggleSwitch/ToggleSwitch.css @@ -1,50 +1,59 @@ .toggle-switch { width: 56px; height: 28px; + border-radius: 999px; border: 2px solid #7e7e7e; - border-radius: 20px; - padding: 0 10px; + background-color: #ffffff; box-sizing: border-box; + display: flex; align-items: center; justify-content: space-between; + padding: 0 8px; + position: relative; - z-index: 0; + cursor: pointer; } .toggle-switch__checkbox { - visibility: hidden; position: absolute; + inset: 0; + opacity: 0; + margin: 0; + cursor: pointer; } .toggle-switch__circle { position: absolute; - top: -2px; - left: -2px; - width: 28px; - height: 28px; + top: 2px; + left: 2px; + width: 24px; + height: 24px; border-radius: 50%; - background-color: #000; - z-index: -1; + background-color: #000000; + z-index: 0; + transition: transform 0.25s ease; } .toggle-switch__checkbox:checked + .toggle-switch__circle { - right: -2px; - left: unset; + transform: translateX(24px); } .toggle-switch__value { - color: #7e7e7e; + position: relative; + z-index: 1; + font-family: "Cabinet Grotesk", sans-serif; font-size: 14px; - line-height: 1; font-weight: 700; - font-family: Cabinet Grotesk, sans-serif; + line-height: 1; + color: #7e7e7e; + pointer-events: none; } .toggle-switch__checkbox:checked ~ .toggle-switch__value_right { - color: #fff; + color: #ffffff; } .toggle-switch__checkbox:not(:checked) ~ .toggle-switch__value_left { - color: #fff; + color: #ffffff; } diff --git a/src/components/ToggleSwitch/ToggleSwitch.jsx b/src/components/ToggleSwitch/ToggleSwitch.jsx index f24a039..e05f1f3 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.jsx +++ b/src/components/ToggleSwitch/ToggleSwitch.jsx @@ -3,14 +3,18 @@ import "./ToggleSwitch.css"; import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; function ToggleSwitch() { - const { handleTempUnitChange } = useContext(CurrentTemperatureUnitContext); + const { currentTempUnit, handleTempUnitChange } = useContext( + CurrentTemperatureUnitContext + ); + + const isCelsius = currentTempUnit === "C"; return ( -

      -
      - - - } + + +
      +
      - - } + + + + } + /> + + + + + } +/> + + + + + + } + /> + + +
      + + + + + + - -
      - - -
      -
      + + +
      + + ); } export default App; + + diff --git a/src/components/ClothesSection/ClothesSection.jsx b/src/components/ClothesSection/ClothesSection.jsx index 11f865c..f30630e 100644 --- a/src/components/ClothesSection/ClothesSection.jsx +++ b/src/components/ClothesSection/ClothesSection.jsx @@ -1,11 +1,20 @@ +import { useContext } from "react"; import "./ClothesSection.css"; import ItemCard from "../ItemCard/ItemCard"; +import CurrentUserContext from "../../contexts/CurrentUserContext"; function ClothesSection({ clothingItems, handleOpenItemModal, handleOpenAddGarmentModal, }) { + const currentUser = useContext(CurrentUserContext); + const currentUserId = currentUser?._id; + const userItems = (clothingItems || []).filter((item) => { + const ownerId = typeof item.owner === "string" ? item.owner : item.owner?._id; + return Boolean(currentUserId) && ownerId === currentUserId; + }); + return (
      @@ -13,23 +22,20 @@ function ClothesSection({
      -
        - {clothingItems.map((item) => { - return ( - - ); - })} + +
          + {userItems.map((item) => ( + + ))}
      ); } export default ClothesSection; + diff --git a/src/components/Header/Header.css b/src/components/Header/Header.css index f42b21a..e9840ad 100644 --- a/src/components/Header/Header.css +++ b/src/components/Header/Header.css @@ -40,3 +40,23 @@ text-decoration: none; color: #000; } + +.header__avatar { + width: 40px; + height: 40px; + border-radius: 50%; + object-fit: cover; +} + +.header__avatar-placeholder { + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 18px; + background: rgba(0, 0, 0, 0.1); +} + diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 498c594..f95a095 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -1,16 +1,29 @@ import logo from "../../assets/logo.svg"; -import avatar from "../../assets/avatar.svg"; import "./Header.css"; import ToggleSwitch from "../ToggleSwitch/ToggleSwitch"; import { Link } from "react-router-dom"; +import { useContext } from "react"; +import CurrentUserContext from "../../contexts/CurrentUserContext"; + +function Header({ + handleOpenAddGarmentModal, + weatherData, + isLoggedIn, + handleOpenLoginModal, + handleOpenRegisterModal, +}) { + const currentUser = useContext(CurrentUserContext); -function Header({ handleOpenAddGarmentModal, weatherData }) { const now = new Date(); const dateStr = now.toLocaleDateString("default", { month: "long", day: "numeric", }); + const userName = currentUser?.name || ""; + const userAvatar = currentUser?.avatar || ""; + const avatarFallbackLetter = (userName.trim()[0] || "?").toUpperCase(); + return (
      @@ -22,25 +35,61 @@ function Header({ handleOpenAddGarmentModal, weatherData }) {

      , {weatherData.city}

      +
      - - -

      Terrence Tegegne

      - Terrence Tegegne's Avatar - + + {isLoggedIn ? ( + <> + + + +

      {userName}

      + + {userAvatar ? ( + {`${userName}'s + ) : ( +
      + {avatarFallbackLetter} +
      + )} + + + ) : ( +
      + + +
      + )}
      ); } export default Header; + diff --git a/src/components/ItemModal/ItemModal.jsx b/src/components/ItemModal/ItemModal.jsx index 883e919..77822e0 100644 --- a/src/components/ItemModal/ItemModal.jsx +++ b/src/components/ItemModal/ItemModal.jsx @@ -1,9 +1,21 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useContext } from "react"; import "./ItemModal.css"; +import CurrentUserContext from "../../contexts/CurrentUserContext"; -function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { +function ItemModal({ + card, + isOpen, + handleCloseItemModal, + handleDeleteItem, + isLoggedIn, +}) { const [isConfirmMode, setIsConfirmMode] = useState(false); + const currentUser = useContext(CurrentUserContext); + const ownerId = typeof card?.owner === "string" ? card.owner : card?.owner?._id; + const isOwn = + Boolean(ownerId) && Boolean(currentUser?._id) && ownerId === currentUser._id; + useEffect(() => { if (!isOpen) { setIsConfirmMode(false); @@ -30,11 +42,7 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) { return (
      - @@ -44,13 +52,17 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) {

      {card.name}

      Weather: {card.weather}

      - + + {/* ✅ Delete shown only for owner */} + {isOwn && ( + + )}
      )} @@ -60,9 +72,7 @@ function ItemModal({ card, isOpen, handleCloseItemModal, handleDeleteItem }) {

      Are you sure you want to delete this item?

      -

      - This action is irreversible. -

      +

      This action is irreversible.

      ); diff --git a/src/contexts/CurrentUserContext.js b/src/contexts/CurrentUserContext.js new file mode 100644 index 0000000..eee1fd3 --- /dev/null +++ b/src/contexts/CurrentUserContext.js @@ -0,0 +1,5 @@ +import { createContext } from "react"; + +const CurrentUserContext = createContext(); + +export default CurrentUserContext; diff --git a/src/utils/api.js b/src/utils/api.js index 725c185..1228804 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,9 +1,21 @@ const baseUrl = "http://localhost:3001"; function checkResponse(res) { - return res.ok - ? res.json() - : Promise.reject(`Error fetching items: ${res.status}`); + if (res.ok) return res.json(); + + return res + .json() + .then((data) => Promise.reject(data?.message || `Error: ${res.status}`)) + .catch(() => Promise.reject(`Error: ${res.status}`)); +} + +function getToken() { + return localStorage.getItem("jwt"); +} + +function getAuthHeaders() { + const token = getToken(); + return token ? { Authorization: `Bearer ${token}` } : {}; } export function getItems() { @@ -15,6 +27,7 @@ export function addItem({ name, imageUrl, weather }) { method: "POST", headers: { "Content-Type": "application/json", + ...getAuthHeaders(), }, body: JSON.stringify({ name, imageUrl, weather }), }).then(checkResponse); @@ -23,10 +36,43 @@ export function addItem({ name, imageUrl, weather }) { export function deleteItem(itemId) { return fetch(`${baseUrl}/items/${itemId}`, { method: "DELETE", + headers: { ...getAuthHeaders() }, + }).then((res) => { + if (!res.ok) return Promise.reject(`Error deleting item: ${res.status}`); + return; + }); +} + +export function addItem({ name, imageUrl, weather }, token) { + if (!token) return Promise.reject("No token provided"); + + return fetch(`${baseUrl}/items`, { + method: "POST", + headers: { + "Content-Type": "application/json", + authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ name, imageUrl, weather }), + }).then(checkResponse); +} + +export function deleteItem(itemId, token) { + if (!token) return Promise.reject("No token provided"); + + return fetch(`${baseUrl}/items/${itemId}`, { + method: "DELETE", + headers: { + authorization: `Bearer ${token}`, + }, }).then((res) => { - if (!res.ok) { - return Promise.reject(`Error deleting item: ${res.status}`); - } + if (!res.ok) return Promise.reject(`Error deleting item: ${res.status}`); return; }); } + +export function getItems() { + return fetch(`${baseUrl}/items`).then(checkResponse); +} + + + diff --git a/src/utils/auth.js b/src/utils/auth.js new file mode 100644 index 0000000..3897061 --- /dev/null +++ b/src/utils/auth.js @@ -0,0 +1,43 @@ +const baseUrl = "http://localhost:3001"; + +function checkResponse(res) { + if (res.ok) { + return res.json(); + } + + return res + .json() + .then((data) => Promise.reject(data?.message || `Error: ${res.status}`)) + .catch(() => Promise.reject(`Error: ${res.status}`)); +} + +export function signup({ name, avatar, email, password }) { + return fetch(`${baseUrl}/signup`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ name, avatar, email, password }), + }).then(checkResponse); +} + +export function signin({ email, password }) { + return fetch(`${baseUrl}/signin`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ email, password }), + }).then(checkResponse); +} + +export function checkToken(token) { + return fetch(`${baseUrl}/users/me`, { + method: "GET", + headers: { + "Content-Type": "application/json", + authorization: `Bearer ${token}`, + }, + }).then(checkResponse); +} + From 33e486391bc95d75b76aec8875eb1526863b2f26 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Tue, 6 Jan 2026 03:01:03 -0600 Subject: [PATCH 47/66] Project 14 goals --- src/components/App/App.jsx | 277 ++++++++++-------- .../ClothesSection/ClothesSection.jsx | 30 +- .../EditProfileModal/EditProfileModal.jsx | 75 +++++ src/components/ItemCard/ItemCard.css | 34 +++ src/components/ItemCard/ItemCard.jsx | 78 ++++- src/components/Main/Main.jsx | 45 +-- src/components/Profile/Profile.jsx | 11 +- ...{ProtectedRoute,jsx => ProtectedRoute.jsx} | 0 .../RegisterModal/RegisterModal.jsx | 8 - src/components/SideBar/SideBar.css | 44 ++- src/components/SideBar/SideBar.jsx | 34 ++- src/utils/api.js | 66 ++--- 12 files changed, 467 insertions(+), 235 deletions(-) create mode 100644 src/components/EditProfileModal/EditProfileModal.jsx rename src/components/ProtectedRoute/{ProtectedRoute,jsx => ProtectedRoute.jsx} (100%) diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index cd536b6..af30549 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -1,52 +1,91 @@ import { useEffect, useState } from "react"; -import { Routes, Route } from "react-router-dom"; +import { Routes, Route, useNavigate } from "react-router-dom"; +import "./App.css"; import Header from "../Header/Header"; import Main from "../Main/Main"; import Footer from "../Footer/Footer"; -import "./App.css"; +import Profile from "../Profile/Profile"; +import ProtectedRoute from "../ProtectedRoute/ProtectedRoute"; import ItemModal from "../ItemModal/ItemModal"; import AddItemModal from "../AddItemModal/AddItemModal"; -import Profile from "../Profile/Profile"; -import ProtectedRoute from "../ProtectedRoute/ProtectedRoute"; +import EditProfileModal from "../EditProfileModal/EditProfileModal"; import RegisterModal from "../RegisterModal/RegisterModal"; import LoginModal from "../LoginModal/LoginModal"; -import { getWeatherData } from "../../utils/weatherApi"; import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; import CurrentUserContext from "../../contexts/CurrentUserContext"; -import { getItems, addItem, deleteItem } from "../../utils/api"; + +import { + getItems, + addItem, + deleteItem, + updateProfile, + addCardLike, + removeCardLike, +} from "../../utils/api"; + +import { getWeatherData } from "../../utils/weatherApi"; import { signup, signin, checkToken } from "../../utils/auth"; function App() { - const [clothingItems, setClothingItems] = useState([]); - const [activeModal, setActiveModal] = useState(""); - const [selectedCard, setSelectedCard] = useState({}); + const navigate = useNavigate(); const [weatherData, setWeatherData] = useState({ city: "", temp: { F: 0, C: 0 }, - weatherCondition: "clear", + weatherCondition: "", isDay: true, }); - const [currentTempUnit, setCurrentTempUnit] = useState("F"); + const [clothingItems, setClothingItems] = useState([]); + const [selectedCard, setSelectedCard] = useState({}); + const [activeModal, setActiveModal] = useState(""); + const [currentTempUnit, setCurrentTempUnit] = useState("F"); + const [currentUser, setCurrentUser] = useState({}); const [isLoggedIn, setIsLoggedIn] = useState(false); - const [token, setToken] = useState(""); - const [currentUser, setCurrentUser] = useState({ name: "", avatar: "" }); + const [token, setToken] = useState(localStorage.getItem("jwt") || ""); + // Weather + useEffect(() => { + getWeatherData().then(setWeatherData).catch(console.error); + }, []); + + // Items + useEffect(() => { + getItems().then(setClothingItems).catch(console.error); + }, []); + + // Restore session + useEffect(() => { + if (!token) return; + + checkToken(token) + .then((user) => { + setCurrentUser(user); + setIsLoggedIn(true); + }) + .catch((err) => { + console.error(err); + localStorage.removeItem("jwt"); + setToken(""); + setCurrentUser({}); + setIsLoggedIn(false); + }); + }, [token]); + + function handleTempUnitChange() { + setCurrentTempUnit((prev) => (prev === "F" ? "C" : "F")); + } + + // Modals function handleOpenItemModal(card) { setSelectedCard(card); setActiveModal("item-modal"); } - function handleCloseItemModal() { - setSelectedCard({}); - setActiveModal(""); - } - function handleOpenAddGarmentModal() { if (!isLoggedIn) { setActiveModal("login-modal"); @@ -55,8 +94,12 @@ function App() { setActiveModal("add-garment-modal"); } - function handleCloseModal() { - setActiveModal(""); + function handleOpenEditProfileModal() { + if (!isLoggedIn) { + setActiveModal("login-modal"); + return; + } + setActiveModal("edit-profile-modal"); } function handleOpenRegisterModal() { @@ -67,115 +110,106 @@ function App() { setActiveModal("login-modal"); } - function handleTempUnitChange() { - setCurrentTempUnit((prev) => (prev === "F" ? "C" : "F")); + function handleCloseModal() { + setActiveModal(""); + setSelectedCard({}); } - function handleAddItemSubmit(inputValues) { - addItem(inputValues, token) + // API handlers + function handleAddItemSubmit(values) { + addItem(values, token) .then((newItem) => { - setClothingItems((prev) => [newItem, ...prev]); - setActiveModal(""); + setClothingItems((items) => [newItem, ...items]); + handleCloseModal(); }) .catch(console.error); } - function handleDeleteItem(item) { - if (!isLoggedIn) { + function handleDeleteItem(card) { + deleteItem(card._id, token) + .then(() => { + setClothingItems((items) => items.filter((i) => i._id !== card._id)); + handleCloseModal(); + }) + .catch(console.error); + } + + // ✅ Likes/Dislikes handler (App owns clothingItems state) + function handleCardLike(item) { + const jwt = localStorage.getItem("jwt") || token; + + if (!jwt) { setActiveModal("login-modal"); return; } - deleteItem(item._id, token) - .then(() => { - setClothingItems((prev) => - prev.filter((clothingItem) => clothingItem._id !== item._id) + const currentUserId = currentUser?._id; + const itemId = item?._id; + const likes = Array.isArray(item?.likes) ? item.likes : []; + + const isLiked = likes.some((like) => { + const likeId = typeof like === "string" ? like : like?._id; + return Boolean(currentUserId) && likeId === currentUserId; + }); + + const request = !isLiked + ? addCardLike(itemId, jwt) + : removeCardLike(itemId, jwt); + + request + .then((updatedItem) => { + setClothingItems((items) => + items.map((i) => (i._id === itemId ? updatedItem : i)) ); - setActiveModal(""); + + // Keeps ItemModal in sync if it is open on this same item + setSelectedCard((prev) => (prev?._id === itemId ? updatedItem : prev)); + }) + .catch(console.error); + } + + function handleEditProfileSubmit({ name, avatar }) { + updateProfile({ name, avatar }, token) + .then((updatedUser) => { + setCurrentUser(updatedUser); + handleCloseModal(); }) .catch(console.error); } + // Auth function handleRegisterSubmit({ name, avatar, email, password }) { signup({ name, avatar, email, password }) .then(() => signin({ email, password })) - .then((res) => { - if (!res?.token) { - return Promise.reject( - "Registration succeeded, but sign-in did not return a token." - ); - } - - localStorage.setItem("jwt", res.token); - setToken(res.token); + .then(({ token: jwt }) => { + localStorage.setItem("jwt", jwt); + setToken(jwt); setIsLoggedIn(true); - setActiveModal(""); - - return checkToken(res.token); - }) - .then((user) => { - setCurrentUser(user); + handleCloseModal(); + navigate("/profile"); }) .catch(console.error); } function handleLoginSubmit({ email, password }) { signin({ email, password }) - .then((res) => { - if (!res?.token) { - return Promise.reject( - "Authorization failed: token was not returned by the server." - ); - } - - localStorage.setItem("jwt", res.token); - setToken(res.token); + .then(({ token: jwt }) => { + localStorage.setItem("jwt", jwt); + setToken(jwt); setIsLoggedIn(true); - setActiveModal(""); - - return checkToken(res.token); - }) - .then((user) => { - setCurrentUser(user); + handleCloseModal(); + navigate("/profile"); }) .catch(console.error); } -function handleSignOut() { - localStorage.removeItem("jwt"); - setIsLoggedIn(false); - setToken(""); - setCurrentUser({ name: "", avatar: "" }); - setActiveModal(""); -} - - - useEffect(() => { - getWeatherData().then(setWeatherData).catch(console.error); - }, []); - - useEffect(() => { - getItems().then(setClothingItems).catch(console.error); - }, []); - - useEffect(() => { - const jwt = localStorage.getItem("jwt"); - if (!jwt) return; - - checkToken(jwt) - .then((user) => { - setIsLoggedIn(true); - setToken(jwt); - setCurrentUser(user); - }) - .catch((err) => { - console.error(err); - localStorage.removeItem("jwt"); - setIsLoggedIn(false); - setToken(""); - setCurrentUser({ name: "", avatar: "" }); - }); - }, []); + function handleSignOut() { + localStorage.removeItem("jwt"); + setToken(""); + setIsLoggedIn(false); + setCurrentUser({}); + navigate("/"); + } return ( @@ -184,8 +218,8 @@ function handleSignOut() { >
      } /> - - - - } -/> - - } @@ -234,12 +257,26 @@ function handleSignOut() {
      + + + + - -
      @@ -266,5 +295,3 @@ function handleSignOut() { } export default App; - - diff --git a/src/components/ClothesSection/ClothesSection.jsx b/src/components/ClothesSection/ClothesSection.jsx index f30630e..ca98a9e 100644 --- a/src/components/ClothesSection/ClothesSection.jsx +++ b/src/components/ClothesSection/ClothesSection.jsx @@ -1,36 +1,33 @@ -import { useContext } from "react"; import "./ClothesSection.css"; import ItemCard from "../ItemCard/ItemCard"; -import CurrentUserContext from "../../contexts/CurrentUserContext"; function ClothesSection({ clothingItems, - handleOpenItemModal, handleOpenAddGarmentModal, + handleOpenItemModal, + onCardLike, }) { - const currentUser = useContext(CurrentUserContext); - const currentUserId = currentUser?._id; - const userItems = (clothingItems || []).filter((item) => { - const ownerId = typeof item.owner === "string" ? item.owner : item.owner?._id; - return Boolean(currentUserId) && ownerId === currentUserId; - }); - return (
      -
      -

      Your items

      +
      +

      Your items

        - {userItems.map((item) => ( - + {clothingItems.map((item) => ( + ))}
      @@ -39,3 +36,4 @@ function ClothesSection({ export default ClothesSection; + diff --git a/src/components/EditProfileModal/EditProfileModal.jsx b/src/components/EditProfileModal/EditProfileModal.jsx new file mode 100644 index 0000000..c34fd22 --- /dev/null +++ b/src/components/EditProfileModal/EditProfileModal.jsx @@ -0,0 +1,75 @@ +import { useContext, useEffect } from "react"; +import ModalWithForm from "../ModalWithForm/ModalWithForm"; +import { useForm } from "../../hooks/useForm"; +import CurrentUserContext from "../../contexts/CurrentUserContext"; + +function EditProfileModal({ isOpen, onClose, handleEditProfileSubmit }) { + const currentUser = useContext(CurrentUserContext); + + const { values, handleChange, setValues } = useForm({ + name: "", + avatar: "", + }); + + useEffect(() => { + if (!isOpen) return; + + setValues({ + name: currentUser?.name || "", + avatar: currentUser?.avatar || "", + }); + }, [isOpen, currentUser, setValues]); + + function handleSubmit(e) { + e.preventDefault(); + handleEditProfileSubmit({ + name: values.name, + avatar: values.avatar, + }); + } + + return ( + +
      + + + +
      +
      + ); +} + +export default EditProfileModal; diff --git a/src/components/ItemCard/ItemCard.css b/src/components/ItemCard/ItemCard.css index 8fa8f66..2bb5be3 100644 --- a/src/components/ItemCard/ItemCard.css +++ b/src/components/ItemCard/ItemCard.css @@ -35,3 +35,37 @@ object-fit: cover; border-radius: 16px; } + +.card__likes { + display: flex; + align-items: center; + gap: 6px; +} + +.card__like-button { + position: absolute; + top: 15px; + right: 15px; + width: 28px; + height: 28px; + border: none; + border-radius: 50%; + background: rgba(255, 255, 255, 0.9); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: rgba(0, 0, 0, 0.4); +} + +.card__like-button:hover { + color: rgba(0, 0, 0, 0.8); +} + +.card__like-button_active { + color: rgba(0, 0, 0, 1); +} + +.card__like-icon { + display: block; +} diff --git a/src/components/ItemCard/ItemCard.jsx b/src/components/ItemCard/ItemCard.jsx index 68b68a5..fb89667 100644 --- a/src/components/ItemCard/ItemCard.jsx +++ b/src/components/ItemCard/ItemCard.jsx @@ -1,20 +1,78 @@ +import { useContext } from "react"; import "./ItemCard.css"; +import CurrentUserContext from "../../contexts/CurrentUserContext"; -function ItemCard({ data, onCardClick }) { - function handleOpenCard() { - onCardClick(data); +function ItemCard({ data, onCardClick, onCardLike }) { + const currentUser = useContext(CurrentUserContext); + const isAuthorized = Boolean(currentUser?._id); + + // ✅ Check if the item was liked by the current user + // (likes array should be an array of ids) + const likes = Array.isArray(data?.likes) ? data.likes : []; + const isLiked = + isAuthorized && + likes.some((id) => { + // supports either string ids or populated objects + const likeId = typeof id === "string" ? id : id?._id; + return likeId === currentUser._id; + }); + + // ✅ Like button className is always active if liked + const itemLikeButtonClassName = `card__like-button ${ + isLiked ? "card__like-button_active" : "" + }`; + + function handleCardClick() { + if (typeof onCardClick === "function") { + onCardClick(data); + } + } + + function handleLike(e) { + e.stopPropagation(); + if (!isAuthorized) return; + + if (typeof onCardLike === "function") { + onCardLike({ id: data._id, isLiked }); + } } + return ( -
    • +
    • {data.name}

      - {data.name} + + {/* ✅ Hide like button for unauthorized users */} + {isAuthorized && ( + + )} + + {data.name}
    • ); } export default ItemCard; + + diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index 4c4ece2..1c265b5 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -1,47 +1,30 @@ +import "./Main.css"; import WeatherCard from "../WeatherCard/WeatherCard"; import ItemCard from "../ItemCard/ItemCard"; -import "./Main.css"; -import { useContext } from "react"; -import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; - -const getWeatherType = (tempF) => { - if (tempF >= 86) { - return "hot"; - } else if (tempF >= 66) { - return "warm"; - } else { - return "cold"; - } -}; - -function Main({ clothingItems, handleOpenItemModal, weatherData }) { - const { currentTempUnit } = useContext(CurrentTemperatureUnitContext); - const tempF = weatherData.temp.F; - const weatherType = getWeatherType(tempF); - const filteredItems = clothingItems.filter( - (item) => item.weather.toLowerCase() === weatherType - ); +function Main({ clothingItems, handleOpenItemModal, onCardLike, weatherData }) { return (
      -

      - Today is {weatherData.temp[currentTempUnit]}° {currentTempUnit} / - You may want to wear: -

      -
        - {filteredItems.map((item) => { - return ( + +
        +

        Today is {weatherData?.temp?.F}° F / You may want to wear:

        + +
          + {clothingItems.map((item) => ( - ); - })} -
        + ))} +
      +
    ); } export default Main; + + diff --git a/src/components/Profile/Profile.jsx b/src/components/Profile/Profile.jsx index c175a26..6be6447 100644 --- a/src/components/Profile/Profile.jsx +++ b/src/components/Profile/Profile.jsx @@ -6,19 +6,26 @@ function Profile({ clothingItems, handleOpenAddGarmentModal, handleOpenItemModal, + handleOpenEditProfileModal, + onCardLike, handleSignOut, }) { return (
    - {/* ✅ added */} + +
    ); } - export default Profile; + diff --git a/src/components/ProtectedRoute/ProtectedRoute,jsx b/src/components/ProtectedRoute/ProtectedRoute.jsx similarity index 100% rename from src/components/ProtectedRoute/ProtectedRoute,jsx rename to src/components/ProtectedRoute/ProtectedRoute.jsx diff --git a/src/components/RegisterModal/RegisterModal.jsx b/src/components/RegisterModal/RegisterModal.jsx index d2b306a..f76f49d 100644 --- a/src/components/RegisterModal/RegisterModal.jsx +++ b/src/components/RegisterModal/RegisterModal.jsx @@ -86,12 +86,4 @@ function RegisterModal({ isOpen, onClose, handleRegisterSubmit }) { ); } - setActiveModal("")} - handleRegisterSubmit={handleRegisterSubmit} -/> - - export default RegisterModal; - diff --git a/src/components/SideBar/SideBar.css b/src/components/SideBar/SideBar.css index 48839f7..5044bc1 100644 --- a/src/components/SideBar/SideBar.css +++ b/src/components/SideBar/SideBar.css @@ -3,14 +3,52 @@ margin-top: 32px; } +.sidebar__row { + display: flex; + align-items: center; + gap: 16px; +} + .sidebar__username { - font-family: Cabinet Grotesk, sans-serif; + margin: 0; font-size: 20px; font-weight: 700; } .sidebar__avatar { - width: 80px; - height: 80px; + width: 56px; + height: 56px; border-radius: 50%; + object-fit: cover; +} + +.sidebar__avatar-placeholder { + width: 56px; + height: 56px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: #000; + color: #fff; + font-size: 20px; + font-weight: 700; +} + +.sidebar__actions { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 24px; +} + +.sidebar__button { + background: none; + border: none; + padding: 0; + font-family: Cabinet Grotesk, sans-serif; + font-size: 16px; + font-weight: 700; + cursor: pointer; + text-align: left; } diff --git a/src/components/SideBar/SideBar.jsx b/src/components/SideBar/SideBar.jsx index 0da64b1..01535f5 100644 --- a/src/components/SideBar/SideBar.jsx +++ b/src/components/SideBar/SideBar.jsx @@ -1,22 +1,44 @@ -import "./SideBar.css"; import { useContext } from "react"; +import "./SideBar.css"; import CurrentUserContext from "../../contexts/CurrentUserContext"; -function SideBar({ handleSignOut }) { +function SideBar({ handleSignOut, handleOpenEditProfileModal }) { const currentUser = useContext(CurrentUserContext); const userName = currentUser?.name || ""; const userAvatar = currentUser?.avatar || ""; const avatarFallbackLetter = (userName.trim()[0] || "?").toUpperCase(); - return ( - + ); } diff --git a/src/utils/api.js b/src/utils/api.js index 1228804..5ff2565 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,7 +1,9 @@ const baseUrl = "http://localhost:3001"; function checkResponse(res) { - if (res.ok) return res.json(); + if (res.ok) { + return res.json(); + } return res .json() @@ -9,70 +11,66 @@ function checkResponse(res) { .catch(() => Promise.reject(`Error: ${res.status}`)); } -function getToken() { - return localStorage.getItem("jwt"); -} - -function getAuthHeaders() { - const token = getToken(); - return token ? { Authorization: `Bearer ${token}` } : {}; -} - export function getItems() { return fetch(`${baseUrl}/items`).then(checkResponse); } -export function addItem({ name, imageUrl, weather }) { +export function addItem({ name, imageUrl, weather }, token) { + if (!token) return Promise.reject("No token provided"); + return fetch(`${baseUrl}/items`, { method: "POST", headers: { "Content-Type": "application/json", - ...getAuthHeaders(), + authorization: `Bearer ${token}`, }, body: JSON.stringify({ name, imageUrl, weather }), }).then(checkResponse); } -export function deleteItem(itemId) { +export function deleteItem(itemId, token) { + if (!token) return Promise.reject("No token provided"); + return fetch(`${baseUrl}/items/${itemId}`, { method: "DELETE", - headers: { ...getAuthHeaders() }, - }).then((res) => { - if (!res.ok) return Promise.reject(`Error deleting item: ${res.status}`); - return; - }); + headers: { + authorization: `Bearer ${token}`, + }, + }).then(checkResponse); } -export function addItem({ name, imageUrl, weather }, token) { +export function updateProfile({ name, avatar }, token) { if (!token) return Promise.reject("No token provided"); - return fetch(`${baseUrl}/items`, { - method: "POST", + return fetch(`${baseUrl}/users/me`, { + method: "PATCH", headers: { "Content-Type": "application/json", authorization: `Bearer ${token}`, }, - body: JSON.stringify({ name, imageUrl, weather }), + body: JSON.stringify({ name, avatar }), }).then(checkResponse); } -export function deleteItem(itemId, token) { +/* ✅ Likes / Dislikes */ +export function addCardLike(itemId, token) { if (!token) return Promise.reject("No token provided"); - return fetch(`${baseUrl}/items/${itemId}`, { - method: "DELETE", + return fetch(`${baseUrl}/items/${itemId}/likes`, { + method: "PUT", headers: { authorization: `Bearer ${token}`, }, - }).then((res) => { - if (!res.ok) return Promise.reject(`Error deleting item: ${res.status}`); - return; - }); -} - -export function getItems() { - return fetch(`${baseUrl}/items`).then(checkResponse); + }).then(checkResponse); } +export function removeCardLike(itemId, token) { + if (!token) return Promise.reject("No token provided"); - + return fetch(`${baseUrl}/items/${itemId}/likes`, { + method: "DELETE", + headers: { + authorization: `Bearer ${token}`, + }, + }).then(checkResponse); +} From 8403a1dfe07d9b25bbab3cb53951b6e7d53089cd Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 12 Jan 2026 21:02:29 -0600 Subject: [PATCH 48/66] Project 15 --- src/utils/api.js | 5 +++-- src/utils/auth.js | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/utils/api.js b/src/utils/api.js index 5ff2565..82e4c91 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,4 +1,6 @@ -const baseUrl = "http://localhost:3001"; +const baseUrl = import.meta.env.PROD + ? "https://api.nickproject15.evils.in" + : "http://localhost:3001"; function checkResponse(res) { if (res.ok) { @@ -52,7 +54,6 @@ export function updateProfile({ name, avatar }, token) { }).then(checkResponse); } -/* ✅ Likes / Dislikes */ export function addCardLike(itemId, token) { if (!token) return Promise.reject("No token provided"); diff --git a/src/utils/auth.js b/src/utils/auth.js index 3897061..fa7ad9b 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,4 +1,6 @@ -const baseUrl = "http://localhost:3001"; +const baseUrl = import.meta.env.PROD + ? "https://api.nickproject15.evils.in" + : "http://localhost:3001"; function checkResponse(res) { if (res.ok) { From f020dd34bb33558e1d8221fd7ce1d26ce9b184d4 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 12 Jan 2026 21:24:05 -0600 Subject: [PATCH 49/66] Project 15 update .5 --- package-lock.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/package-lock.json b/package-lock.json index eecccf9..b1870ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1274,6 +1275,7 @@ "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1323,6 +1325,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1602,6 +1605,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -2166,6 +2170,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3849,6 +3854,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -3861,6 +3867,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -4657,6 +4664,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", From d68bcaf3ccf703aee76ea915fb27ba39daddb12b Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Mon, 12 Jan 2026 22:12:39 -0600 Subject: [PATCH 50/66] Project 15 update 1 --- src/utils/api.js | 2 +- src/utils/auth.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/api.js b/src/utils/api.js index 82e4c91..1c746a1 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,5 +1,5 @@ const baseUrl = import.meta.env.PROD - ? "https://api.nickproject15.evils.in" + ? "https:// api.nickproject15.minecraftnoob.com" : "http://localhost:3001"; function checkResponse(res) { diff --git a/src/utils/auth.js b/src/utils/auth.js index fa7ad9b..4b4ce0a 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,5 +1,5 @@ const baseUrl = import.meta.env.PROD - ? "https://api.nickproject15.evils.in" + ? "https://api.nickproject15.minecraftnoob.com" : "http://localhost:3001"; function checkResponse(res) { From dd74d8d9e0ca21c676006b15ec9c202daf4e7270 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Thu, 15 Jan 2026 03:21:21 -0600 Subject: [PATCH 51/66] Project 15 update 2 --- src/utils/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/api.js b/src/utils/api.js index 1c746a1..54c585a 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,5 +1,5 @@ const baseUrl = import.meta.env.PROD - ? "https:// api.nickproject15.minecraftnoob.com" + ? "https://api.nickproject15.minecraftnoob.com" : "http://localhost:3001"; function checkResponse(res) { From 1a14d58c8872f8224eb93ecc248cde360a88e0b5 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Thu, 15 Jan 2026 03:46:25 -0600 Subject: [PATCH 52/66] Project 15 update 2.1 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 1893bb6..a240d8a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "private": true, "version": "0.0.0", "type": "module", + "homepage": "https://nickproject15.minecraftnoob.com", "scripts": { "dev": "vite --open", "build": "vite build", From 9826836de5a9a928114f4738db62547093725727 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Thu, 15 Jan 2026 03:53:49 -0600 Subject: [PATCH 53/66] Project 15 update 2.2 --- package.json | 4 +++- vite.config.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a240d8a..d8c384a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build": "vite build", "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "json-server": "json-server --watch db.json --id _id --port 3001" + "json-server": "json-server --watch db.json --id _id --port 3001", + "deploy": "npm run build && scp -r ./dist/* resmaster19@nickproject15.minecraftnoob.com:/home/resmaster19/frontend" }, "dependencies": { "react": "^18.3.1", @@ -27,3 +28,4 @@ "vite": "^5.3.1" } } + diff --git a/vite.config.js b/vite.config.js index f0078e4..aa53d22 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,10 +1,10 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -// https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], server: { port: 3000, }, }); + From 5050247c68033dcc1500caa1b0b68c69b1985330 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Thu, 15 Jan 2026 23:25:17 -0600 Subject: [PATCH 54/66] Project 15 update 3 --- src/components/AddItemModal/AddItemModal.jsx | 29 ++- src/components/App/App.jsx | 61 ++--- .../ClothesSection/ClothesSection.css | 36 ++- .../EditProfileModal/EditProfileModal.jsx | 12 +- src/components/Footer/Footer.css | 4 +- src/components/Header/Header.css | 51 +++- src/components/Header/Header.jsx | 11 +- src/components/ItemCard/ItemCard.css | 4 +- src/components/ItemModal/ItemModal.css | 80 +++++- src/components/LoginModal/LoginModal.jsx | 142 +++++++--- src/components/Main/Main.css | 35 ++- .../ModalWithForm/ModalWithForm.css | 174 ++++++++++++- .../ModalWithForm/ModalWithForm.jsx | 33 ++- src/components/Profile/Profile.css | 9 + .../RegisterModal/RegisterModal.jsx | 245 +++++++++++++----- src/components/SideBar/SideBar.css | 33 ++- src/components/SideBar/SideBar.jsx | 22 +- src/components/ToggleSwitch/ToggleSwitch.css | 74 +++--- src/components/ToggleSwitch/ToggleSwitch.jsx | 37 ++- src/components/WeatherCard/WeatherCard.css | 8 +- src/index.css | 22 ++ src/utils/api.js | 4 +- src/utils/auth.js | 5 +- 23 files changed, 845 insertions(+), 286 deletions(-) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index 96fc450..d55a1c9 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -1,13 +1,24 @@ +import { useEffect } from "react"; import ModalWithForm from "../ModalWithForm/ModalWithForm"; import { useForm } from "../../hooks/useForm"; function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { - const { values, handleChange } = useForm({ + const { values, handleChange, setValues } = useForm({ name: "", imageUrl: "", weather: "hot", }); + // Disable button until required fields are filled (matches your screenshot) + const isSubmitDisabled = !values.name || !values.imageUrl; + + // Reset form every time the modal opens + useEffect(() => { + if (isOpen) { + setValues({ name: "", imageUrl: "", weather: "hot" }); + } + }, [isOpen, setValues]); + const handleSubmit = (event) => { event.preventDefault(); handleAddItemSubmit(values); @@ -21,6 +32,7 @@ function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { name="add-garment-form" handleSubmit={handleSubmit} onClose={onClose} + isSubmitDisabled={isSubmitDisabled} >
    -
    +
    Select the weather type: -
    +
    -
    -
    +
    -
    -
    +
    -
    @@ -105,3 +117,4 @@ function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { } export default AddItemModal; + diff --git a/src/components/App/App.jsx b/src/components/App/App.jsx index af30549..5c92c54 100644 --- a/src/components/App/App.jsx +++ b/src/components/App/App.jsx @@ -42,23 +42,22 @@ function App() { const [clothingItems, setClothingItems] = useState([]); const [selectedCard, setSelectedCard] = useState({}); const [activeModal, setActiveModal] = useState(""); + const [loginError, setLoginError] = useState(""); + const [currentTempUnit, setCurrentTempUnit] = useState("F"); const [currentUser, setCurrentUser] = useState({}); const [isLoggedIn, setIsLoggedIn] = useState(false); const [token, setToken] = useState(localStorage.getItem("jwt") || ""); - // Weather useEffect(() => { getWeatherData().then(setWeatherData).catch(console.error); }, []); - // Items useEffect(() => { getItems().then(setClothingItems).catch(console.error); }, []); - // Restore session useEffect(() => { if (!token) return; @@ -80,7 +79,6 @@ function App() { setCurrentTempUnit((prev) => (prev === "F" ? "C" : "F")); } - // Modals function handleOpenItemModal(card) { setSelectedCard(card); setActiveModal("item-modal"); @@ -115,7 +113,6 @@ function App() { setSelectedCard({}); } - // API handlers function handleAddItemSubmit(values) { addItem(values, token) .then((newItem) => { @@ -134,7 +131,6 @@ function App() { .catch(console.error); } - // ✅ Likes/Dislikes handler (App owns clothingItems state) function handleCardLike(item) { const jwt = localStorage.getItem("jwt") || token; @@ -162,7 +158,6 @@ function App() { items.map((i) => (i._id === itemId ? updatedItem : i)) ); - // Keeps ItemModal in sync if it is open on this same item setSelectedCard((prev) => (prev?._id === itemId ? updatedItem : prev)); }) .catch(console.error); @@ -177,7 +172,6 @@ function App() { .catch(console.error); } - // Auth function handleRegisterSubmit({ name, avatar, email, password }) { signup({ name, avatar, email, password }) .then(() => signin({ email, password })) @@ -191,17 +185,22 @@ function App() { .catch(console.error); } - function handleLoginSubmit({ email, password }) { - signin({ email, password }) - .then(({ token: jwt }) => { - localStorage.setItem("jwt", jwt); - setToken(jwt); - setIsLoggedIn(true); - handleCloseModal(); - navigate("/profile"); - }) - .catch(console.error); - } + function handleLoginSubmit({ email, password }) { + setLoginError(""); + + signin({ email, password }) + .then(({ token: jwt }) => { + localStorage.setItem("jwt", jwt); + setToken(jwt); + setIsLoggedIn(true); + setLoginError(""); + handleCloseModal(); + navigate("/profile"); + }) + .catch(() => { + setLoginError("Email or password incorrect"); + }); +} function handleSignOut() { localStorage.removeItem("jwt"); @@ -278,16 +277,20 @@ function App() { /> - - + isOpen={activeModal === "register-modal"} + onClose={handleCloseModal} + handleRegisterSubmit={handleRegisterSubmit} + onSwitchToLogin={() => setActiveModal("login-modal")} +/> + + setActiveModal("register-modal")} + errorMessage={loginError} + onClearError={() => setLoginError("")} +/>
    diff --git a/src/components/ClothesSection/ClothesSection.css b/src/components/ClothesSection/ClothesSection.css index 5bb244b..561040d 100644 --- a/src/components/ClothesSection/ClothesSection.css +++ b/src/components/ClothesSection/ClothesSection.css @@ -1,27 +1,43 @@ .clothes-section { - flex: 1; + display: flex; + flex-direction: column; + gap: 16px; } -.clothes-section__row { +.clothes-section__header { display: flex; align-items: center; gap: 20px; - margin-bottom: 32px; } .clothes-section__title { - margin: 0; font-family: Cabinet Grotesk, sans-serif; - font-size: 20px; font-weight: 700; + font-size: 20px; + line-height: 24px; } -.clothes-section__btn { +.clothes-section__add-new-btn { + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; + font-size: 20px; + line-height: 24px; + color: rgba(0, 0, 0, 0.6); + background: transparent; border: none; padding: 0; - background: transparent; - font: inherit; - font-weight: 400; - color: rgba(0, 0, 0, 0.5); cursor: pointer; } + +.clothes-section__add-new-btn:hover { + opacity: 0.8; +} + +.clothes-section__items { + display: flex; + flex-wrap: wrap; + gap: 20px; + padding: 0; + margin: 0; + list-style-type: none; +} diff --git a/src/components/EditProfileModal/EditProfileModal.jsx b/src/components/EditProfileModal/EditProfileModal.jsx index c34fd22..b9d723f 100644 --- a/src/components/EditProfileModal/EditProfileModal.jsx +++ b/src/components/EditProfileModal/EditProfileModal.jsx @@ -20,6 +20,8 @@ function EditProfileModal({ isOpen, onClose, handleEditProfileSubmit }) { }); }, [isOpen, currentUser, setValues]); + const isSubmitDisabled = !values.name || !values.avatar; + function handleSubmit(e) { e.preventDefault(); handleEditProfileSubmit({ @@ -31,15 +33,16 @@ function EditProfileModal({ isOpen, onClose, handleEditProfileSubmit }) { return (
    @@ -52,11 +58,12 @@ function Header({

    {userName}

    - {userAvatar ? ( + {userAvatar && isAvatarOk ? ( {`${userName}'s setIsAvatarOk(false)} /> ) : (
    { - event.preventDefault(); - handleLoginSubmit(values); + const [errors, setErrors] = useState({ + email: "", + }); + + const [touched, setTouched] = useState({ + email: false, + }); + + useEffect(() => { + if (!isOpen) return; + + setValues({ + email: "", + password: "", + }); + + setErrors({ email: "" }); + setTouched({ email: false }); + }, [isOpen, setValues]); + + const getErrorMessage = (input) => { + if (input.validity.valueMissing) return "This field is required"; + if (input.name === "email" && input.validity.typeMismatch) return "This is not a valid email"; + return "Invalid value"; + }; + + const validateField = (e) => { + const { name } = e.target; + let msg = ""; + + if (!e.target.validity.valid) msg = getErrorMessage(e.target); + + setErrors((prev) => ({ ...prev, [name]: msg })); + }; + + const handleChangeValidated = (e) => { + handleChange(e); + if (e.target.name === "email") validateField(e); + }; + + const handleBlur = (e) => { + const { name } = e.target; + setTouched((prev) => ({ ...prev, [name]: true })); + if (name === "email") validateField(e); + }; + + const showError = (field) => Boolean(touched[field] && errors[field]); + + const isSubmitDisabled = !values.email || !values.password || Object.values(errors).some(Boolean); + + const handleSubmit = (e) => { + e.preventDefault(); + + handleLoginSubmit(values, () => { + setValues({ email: "", password: "" }); + }); }; return ( -
    - - - -
    + + + + + {hasError &&

    Email or password incorrect

    }
    ); } export default LoginModal; + + diff --git a/src/components/Main/Main.css b/src/components/Main/Main.css index 59352c1..2392e2b 100644 --- a/src/components/Main/Main.css +++ b/src/components/Main/Main.css @@ -2,20 +2,43 @@ margin-top: 32px; } -.main__text { - margin: 24px 0 32px; +.cards { + margin-top: 24px; +} + +.cards__text { + margin: 0 0 32px; font-family: Cabinet Grotesk, sans-serif; font-size: 20px; font-weight: 700; + line-height: 24px; color: rgba(0, 0, 0, 1); } -.main__card-list { - display: flex; - flex-wrap: wrap; +.cards__list { + display: grid; + grid-template-columns: repeat(4, 325px); gap: 20px; padding: 0; margin: 0; list-style-type: none; - justify-content: center; } + + +@media (max-width: 1400px) { + .cards__list { + grid-template-columns: repeat(3, 325px); + } +} + +@media (max-width: 1060px) { + .cards__list { + grid-template-columns: repeat(2, 325px); + } +} + +@media (max-width: 720px) { + .cards__list { + grid-template-columns: 1fr; + } +} \ No newline at end of file diff --git a/src/components/ModalWithForm/ModalWithForm.css b/src/components/ModalWithForm/ModalWithForm.css index d04bd7a..4efe5c8 100644 --- a/src/components/ModalWithForm/ModalWithForm.css +++ b/src/components/ModalWithForm/ModalWithForm.css @@ -1,3 +1,45 @@ +.modal { + font-family: "Cabinet Grotesk", sans-serif; + font-weight: 700; + align-items: center; + justify-content: center; + position: fixed; + inset: 0; + display: flex; + padding: 0 10px; + visibility: hidden; + opacity: 0; + transition: visibility 0s linear 0.2s, opacity 0.2s linear; + background-color: rgba(0, 0, 0, 0.5); +} + +.modal_is-opened { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} + +.modal__label_error { + color: #ff4d00; +} + +.modal__input_error { + border-bottom-color: #ff4d00; + color: #ff4d00; +} + +.modal__error { + margin-top: 8px; + font-size: 16px; + line-height: 20px; + font-weight: 700; + color: #ff4d00; +} + +.modal__input_error::placeholder { + color: rgba(255, 77, 0, 0.6); +} + .modal__container_type_form { width: 496px; padding: 28px 32px 32px; @@ -13,7 +55,7 @@ right: 24px; border: none; background: transparent; - font-size: 20px; + font-size: 24px; line-height: 1; cursor: pointer; color: rgba(0, 0, 0, 0.3); @@ -36,27 +78,56 @@ margin: 0; padding: 0; border: none; + display: flex; + flex-direction: column; + gap: 24px; +} + +.modal__fieldset_type_radio { + margin-top: 8px; + gap: 12px; } .modal__label { display: block; - font-weight: 400; + margin: 0 0 8px; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; font-size: 16px; + line-height: 20px; color: rgba(0, 0, 0, 1); } .modal__input { - display: block; - width: 100%; - margin-top: 4px; - padding: 4px 0 8px; + width: 100%; border: none; - border-bottom: 1px solid rgba(0, 0, 0, 0.3); + border-bottom: 1px solid rgba(0, 0, 0, 1); + padding: 8px 0 6px; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; font-size: 16px; + line-height: 20px; + color: rgba(0, 0, 0, 1); + outline: none; } -.modal__submit-btn { +.modal__input::placeholder { + color: rgba(0, 0, 0, 0.5); +} + +.modal__input:focus { + border-bottom-color: rgba(0, 0, 0, 0.7); +} + +.modal__actions { margin-top: 8px; + display: flex; + align-items: center; + gap: 12px; +} + +.modal__submit-btn { + margin-top: 8px; align-self: flex-start; padding: 8px 20px; border: none; @@ -69,11 +140,92 @@ } .modal__submit-btn:hover { - opacity: 0.8; + opacity: 0.6; } .modal__submit-btn:disabled { - background-color: #f3f3f3; - color: rgba(0, 0, 0, 0.3); + background-color: rgba(0, 0, 0, 0.3); + color: #ffffff; cursor: default; + opacity: 1; +} + +.modal__submit-btn:disabled:hover { + opacity: 1; +} + +.modal__switch { + display: flex; + align-items: center; + gap: 6px; + font-size: 16px; + line-height: 20px; +} + +.modal__switch-prefix { + color: rgba(0, 0, 0, 0.6); +} + +.modal__switch-btn { + border: none; + padding: 0; + background: transparent; + font: inherit; + cursor: pointer; + color: rgba(0, 0, 0, 0.9); +} + +.modal__switch-btn:hover { + opacity: 0.8; +} + +.modal__legend { + margin: 0; + font-weight: 700; + font-size: 16px; + color: rgba(0, 0, 0, 1); +} + +.modal__radio-row { + display: flex; + align-items: center; + gap: 10px; +} + +.modal__radio-btn { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.modal__radio-label { + display: inline-flex; + align-items: center; + gap: 10px; + cursor: pointer; + + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; + font-size: 16px; + line-height: 20px; + + color: rgba(0, 0, 0, 0.5); +} + +.modal__radio-label::before { + content: ""; + width: 16px; + height: 16px; + border-radius: 50%; + border: 2px solid rgba(0, 0, 0, 1); + box-sizing: border-box; + display: inline-block; } + +.modal__radio-btn:checked + .modal__radio-label { + color: rgba(0, 0, 0, 1); +} + +.modal__radio-btn:checked + .modal__radio-label::before { + background: radial-gradient(circle at center, #000 0 45%, transparent 46%); +} \ No newline at end of file diff --git a/src/components/ModalWithForm/ModalWithForm.jsx b/src/components/ModalWithForm/ModalWithForm.jsx index 20b6de6..feecc93 100644 --- a/src/components/ModalWithForm/ModalWithForm.jsx +++ b/src/components/ModalWithForm/ModalWithForm.jsx @@ -8,6 +8,9 @@ function ModalWithForm({ buttonText, name, onClose, + switchText, + onSwitch, + isSubmitDisabled, }) { return (
    @@ -17,14 +20,36 @@ function ModalWithForm({ className="modal__close-btn modal__close-btn_type_form" onClick={onClose} > - X + × +

    {title}

    +
    {children} - + +
    + + + {typeof onSwitch === "function" && switchText ? ( +
    + or + +
    + ) : null} +
    diff --git a/src/components/Profile/Profile.css b/src/components/Profile/Profile.css index 7cf9c05..cbd6fe9 100644 --- a/src/components/Profile/Profile.css +++ b/src/components/Profile/Profile.css @@ -1,4 +1,13 @@ .profile { display: flex; gap: 116px; + margin-top: 47px; +} + +.profile__sidebar { + width: 229px; +} + +.profile__items { + flex: 1; } diff --git a/src/components/RegisterModal/RegisterModal.jsx b/src/components/RegisterModal/RegisterModal.jsx index f76f49d..34f33f8 100644 --- a/src/components/RegisterModal/RegisterModal.jsx +++ b/src/components/RegisterModal/RegisterModal.jsx @@ -1,89 +1,198 @@ +import { useEffect, useState } from "react"; import ModalWithForm from "../ModalWithForm/ModalWithForm"; import { useForm } from "../../hooks/useForm"; -function RegisterModal({ isOpen, onClose, handleRegisterSubmit }) { - const { values, handleChange } = useForm({ +function RegisterModal({ isOpen, onClose, handleRegisterSubmit, onSwitch }) { + const { values, handleChange, setValues } = useForm({ + email: "", + password: "", name: "", avatar: "", + }); + + const [errors, setErrors] = useState({ email: "", password: "", + name: "", + avatar: "", + }); + + const [touched, setTouched] = useState({ + email: false, + password: false, + name: false, + avatar: false, }); - const handleSubmit = (event) => { - event.preventDefault(); - handleRegisterSubmit(values); + useEffect(() => { + if (!isOpen) return; + + setValues({ + email: "", + password: "", + name: "", + avatar: "", + }); + + setErrors({ + email: "", + password: "", + name: "", + avatar: "", + }); + + setTouched({ + email: false, + password: false, + name: false, + avatar: false, + }); + }, [isOpen, setValues]); + + const getErrorMessage = (input) => { + const { name, validity, minLength } = input; + + if (validity.valueMissing) return "This field is required"; + + if (name === "email" && validity.typeMismatch) return "This is not a valid email"; + if (name === "avatar" && validity.typeMismatch) return "This is not a valid URL"; + + if (validity.tooShort) return `Must be at least ${minLength} characters`; + + return "Invalid value"; + }; + + const validateField = (e) => { + const { name } = e.target; + + let msg = ""; + if (!e.target.validity.valid) { + msg = getErrorMessage(e.target); + } + + setErrors((prev) => ({ ...prev, [name]: msg })); + }; + + const handleChangeValidated = (e) => { + handleChange(e); + validateField(e); + }; + + const handleBlur = (e) => { + const { name } = e.target; + setTouched((prev) => ({ ...prev, [name]: true })); + validateField(e); + }; + + const showError = (field) => Boolean(touched[field] && errors[field]); + + const isSubmitDisabled = + !values.email || + !values.password || + !values.name || + !values.avatar || + Object.values(errors).some(Boolean); + + const handleSubmit = (e) => { + e.preventDefault(); + + handleRegisterSubmit(values, () => { + setValues({ email: "", password: "", name: "", avatar: "" }); + }); }; return ( -
    - - - - - - - -
    + + + + + + +
    ); } export default RegisterModal; + + diff --git a/src/components/SideBar/SideBar.css b/src/components/SideBar/SideBar.css index 5044bc1..886e0d1 100644 --- a/src/components/SideBar/SideBar.css +++ b/src/components/SideBar/SideBar.css @@ -1,6 +1,8 @@ .sidebar { - min-width: 229px; - margin-top: 32px; + display: flex; + flex-direction: column; + gap: 16px; + max-width: 200px; } .sidebar__row { @@ -9,14 +11,21 @@ gap: 16px; } +.sidebar__user { + display: flex; + align-items: center; + gap: 12px; +} + .sidebar__username { - margin: 0; - font-size: 20px; + font-family: Cabinet Grotesk, sans-serif; font-weight: 700; + font-size: 20px; + line-height: 24px; } .sidebar__avatar { - width: 56px; + width: 56px; height: 56px; border-radius: 50%; object-fit: cover; @@ -39,16 +48,20 @@ display: flex; flex-direction: column; gap: 8px; - margin-top: 24px; } .sidebar__button { - background: none; border: none; + background: transparent; padding: 0; - font-family: Cabinet Grotesk, sans-serif; - font-size: 16px; + text-align: left; + font: inherit; font-weight: 700; + font-size: 20px; + line-height: 24px; cursor: pointer; - text-align: left; } + +.sidebar__button:hover { + opacity: 0.8; +} \ No newline at end of file diff --git a/src/components/SideBar/SideBar.jsx b/src/components/SideBar/SideBar.jsx index 01535f5..c5f1cae 100644 --- a/src/components/SideBar/SideBar.jsx +++ b/src/components/SideBar/SideBar.jsx @@ -1,4 +1,4 @@ -import { useContext } from "react"; +import { useContext, useEffect, useState } from "react"; import "./SideBar.css"; import CurrentUserContext from "../../contexts/CurrentUserContext"; @@ -9,14 +9,21 @@ function SideBar({ handleSignOut, handleOpenEditProfileModal }) { const userAvatar = currentUser?.avatar || ""; const avatarFallbackLetter = (userName.trim()[0] || "?").toUpperCase(); + const [isAvatarOk, setIsAvatarOk] = useState(true); + + useEffect(() => { + setIsAvatarOk(true); + }, [userAvatar]); + return (
    - {userAvatar ? ( + {userAvatar && isAvatarOk ? ( {`${userName}'s setIsAvatarOk(false)} /> ) : (
    - Edit profile + Change profile data -
    @@ -52,3 +55,4 @@ function SideBar({ handleSignOut, handleOpenEditProfileModal }) { } export default SideBar; + diff --git a/src/components/ToggleSwitch/ToggleSwitch.css b/src/components/ToggleSwitch/ToggleSwitch.css index e206b93..8013681 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.css +++ b/src/components/ToggleSwitch/ToggleSwitch.css @@ -1,59 +1,53 @@ -.toggle-switch { - width: 56px; - height: 28px; - border-radius: 999px; - border: 2px solid #7e7e7e; - background-color: #ffffff; - box-sizing: border-box; - +.toggle { display: flex; align-items: center; - justify-content: space-between; - padding: 0 8px; + justify-content: center; +} +.toggle__container { position: relative; + width: 56px; + height: 28px; + border-radius: 999px; + background: #ffffff; + border: 1px solid rgba(0, 0, 0, 0.5); + box-sizing: border-box; cursor: pointer; + user-select: none; } -.toggle-switch__checkbox { +.toggle__labels { position: absolute; inset: 0; - opacity: 0; - margin: 0; - cursor: pointer; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px; + font-family: Cabinet Grotesk, sans-serif; + font-weight: 700; + font-size: 14px; + line-height: 18px; + color: rgba(0, 0, 0, 0.6); + z-index: 1; } -.toggle-switch__circle { +.toggle__knob { position: absolute; - top: 2px; - left: 2px; - width: 24px; - height: 24px; + top: 50%; + transform: translateY(-50%); + width: 28px; + height: 28px; border-radius: 50%; - background-color: #000000; - z-index: 0; - transition: transform 0.25s ease; + background: #000000; + z-index: 2; + transition: left 200ms ease; } -.toggle-switch__checkbox:checked + .toggle-switch__circle { - transform: translateX(24px); +.toggle__knob_left { + left: 0; } -.toggle-switch__value { - position: relative; - z-index: 1; - font-family: "Cabinet Grotesk", sans-serif; - font-size: 14px; - font-weight: 700; - line-height: 1; - color: #7e7e7e; - pointer-events: none; +.toggle__knob_right { + left: 28px; } -.toggle-switch__checkbox:checked ~ .toggle-switch__value_right { - color: #ffffff; -} - -.toggle-switch__checkbox:not(:checked) ~ .toggle-switch__value_left { - color: #ffffff; -} diff --git a/src/components/ToggleSwitch/ToggleSwitch.jsx b/src/components/ToggleSwitch/ToggleSwitch.jsx index e05f1f3..c9312b2 100644 --- a/src/components/ToggleSwitch/ToggleSwitch.jsx +++ b/src/components/ToggleSwitch/ToggleSwitch.jsx @@ -1,27 +1,36 @@ -import { useContext } from "react"; import "./ToggleSwitch.css"; +import { useContext } from "react"; import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; function ToggleSwitch() { - const { currentTempUnit, handleTempUnitChange } = useContext( + const { currentTemperatureUnit, handleToggleSwitchChange } = useContext( CurrentTemperatureUnitContext ); - const isCelsius = currentTempUnit === "C"; + const isF = currentTemperatureUnit === "F"; return ( - +
    + +
    ); } export default ToggleSwitch; + diff --git a/src/components/WeatherCard/WeatherCard.css b/src/components/WeatherCard/WeatherCard.css index a893b7a..c87ad68 100644 --- a/src/components/WeatherCard/WeatherCard.css +++ b/src/components/WeatherCard/WeatherCard.css @@ -4,6 +4,9 @@ border-radius: 12px; position: relative; margin-top: 16px; + background-size: cover; + background-position: right top; + background-repeat: no-repeat; } .weather-card__image { @@ -15,10 +18,11 @@ .weather-card__temp { position: absolute; - bottom: 20px; + top: 20px; left: 16px; font-size: 36px; line-height: 1.1; margin: 0; - color: rgba(0, 0, 0, 1); + font-weight: 700; + color: #ffffff; } diff --git a/src/index.css b/src/index.css index 7e165de..d94f04f 100644 --- a/src/index.css +++ b/src/index.css @@ -1,2 +1,24 @@ @import url(./vendor/normalize.css); @import url(./vendor/fonts/fonts.css); + +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +body { + font-family: Cabinet Grotesk, sans-serif; + color: #000; + background: #fff; +} + +button, +input, +textarea { + font-family: inherit; +} diff --git a/src/utils/api.js b/src/utils/api.js index 54c585a..f6ee5cb 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,6 +1,4 @@ -const baseUrl = import.meta.env.PROD - ? "https://api.nickproject15.minecraftnoob.com" - : "http://localhost:3001"; +const baseUrl = import.meta.env.DEV ? "http://localhost:3001" : ""; function checkResponse(res) { if (res.ok) { diff --git a/src/utils/auth.js b/src/utils/auth.js index 4b4ce0a..31e91a1 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,6 +1,4 @@ -const baseUrl = import.meta.env.PROD - ? "https://api.nickproject15.minecraftnoob.com" - : "http://localhost:3001"; +const baseUrl = import.meta.env.DEV ? "http://localhost:3001" : ""; function checkResponse(res) { if (res.ok) { @@ -43,3 +41,4 @@ export function checkToken(token) { }).then(checkResponse); } + From 721054e0c8969ac714bac4200eb09b3e141158f8 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Fri, 16 Jan 2026 15:10:08 -0600 Subject: [PATCH 55/66] Project 15 update 4 --- src/components/AddItemModal/AddItemModal.jsx | 87 ++++++++++--------- .../ClothesSection/ClothesSection.css | 9 +- src/components/ItemCard/ItemCard.jsx | 68 +++++++-------- src/components/Main/Main.jsx | 30 ++++++- .../ModalWithForm/ModalWithForm.css | 9 +- src/components/SideBar/SideBar.css | 12 +-- src/components/ToggleSwitch/ToggleSwitch.jsx | 8 +- 7 files changed, 128 insertions(+), 95 deletions(-) diff --git a/src/components/AddItemModal/AddItemModal.jsx b/src/components/AddItemModal/AddItemModal.jsx index d55a1c9..e9dee51 100644 --- a/src/components/AddItemModal/AddItemModal.jsx +++ b/src/components/AddItemModal/AddItemModal.jsx @@ -9,7 +9,7 @@ function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { weather: "hot", }); - // Disable button until required fields are filled (matches your screenshot) + // Disable button until required fields are filled const isSubmitDisabled = !values.name || !values.imageUrl; // Reset form every time the modal opens @@ -67,49 +67,51 @@ function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) {
    Select the weather type: -
    - - -
    +
    +
    + + +
    -
    - - -
    +
    + + +
    -
    - - +
    + + +
    @@ -118,3 +120,4 @@ function AddItemModal({ isOpen, handleAddItemSubmit, onClose }) { export default AddItemModal; + diff --git a/src/components/ClothesSection/ClothesSection.css b/src/components/ClothesSection/ClothesSection.css index 561040d..82f9127 100644 --- a/src/components/ClothesSection/ClothesSection.css +++ b/src/components/ClothesSection/ClothesSection.css @@ -1,19 +1,19 @@ .clothes-section { - display: flex; - flex-direction: column; - gap: 16px; + flex: 1; } .clothes-section__header { display: flex; align-items: center; gap: 20px; + margin-bottom: 32px; } .clothes-section__title { + margin: 0; font-family: Cabinet Grotesk, sans-serif; - font-weight: 700; font-size: 20px; + font-weight: 700; line-height: 24px; } @@ -41,3 +41,4 @@ margin: 0; list-style-type: none; } + diff --git a/src/components/ItemCard/ItemCard.jsx b/src/components/ItemCard/ItemCard.jsx index fb89667..9e4b7df 100644 --- a/src/components/ItemCard/ItemCard.jsx +++ b/src/components/ItemCard/ItemCard.jsx @@ -4,20 +4,18 @@ import CurrentUserContext from "../../contexts/CurrentUserContext"; function ItemCard({ data, onCardClick, onCardLike }) { const currentUser = useContext(CurrentUserContext); - const isAuthorized = Boolean(currentUser?._id); - // ✅ Check if the item was liked by the current user - // (likes array should be an array of ids) + const currentUserId = currentUser?._id; const likes = Array.isArray(data?.likes) ? data.likes : []; + const isLiked = - isAuthorized && - likes.some((id) => { + Boolean(currentUserId) && + likes.some((like) => { // supports either string ids or populated objects - const likeId = typeof id === "string" ? id : id?._id; - return likeId === currentUser._id; + const likeId = typeof like === "string" ? like : like?._id; + return likeId === currentUserId; }); - // ✅ Like button className is always active if liked const itemLikeButtonClassName = `card__like-button ${ isLiked ? "card__like-button_active" : "" }`; @@ -30,10 +28,10 @@ function ItemCard({ data, onCardClick, onCardLike }) { function handleLike(e) { e.stopPropagation(); - if (!isAuthorized) return; - if (typeof onCardLike === "function") { - onCardLike({ id: data._id, isLiked }); + // Pass the full item so App can decide whether to open auth modal, + // add/remove like, and update state. + onCardLike(data); } } @@ -41,32 +39,29 @@ function ItemCard({ data, onCardClick, onCardLike }) {
  • {data.name}

    - {/* ✅ Hide like button for unauthorized users */} - {isAuthorized && ( - - )} + + + {data.name}
  • @@ -76,3 +71,4 @@ function ItemCard({ data, onCardClick, onCardLike }) { export default ItemCard; + diff --git a/src/components/Main/Main.jsx b/src/components/Main/Main.jsx index 1c265b5..4e85c72 100644 --- a/src/components/Main/Main.jsx +++ b/src/components/Main/Main.jsx @@ -1,17 +1,42 @@ +import { useContext, useMemo } from "react"; import "./Main.css"; import WeatherCard from "../WeatherCard/WeatherCard"; import ItemCard from "../ItemCard/ItemCard"; +import CurrentTemperatureUnitContext from "../../contexts/CurrentTemperatureUnitContext"; + +function getWeatherTypeByTempF(tempF) { + if (typeof tempF !== "number") return "cold"; + if (tempF >= 86) return "hot"; + if (tempF >= 66) return "warm"; + return "cold"; +} function Main({ clothingItems, handleOpenItemModal, onCardLike, weatherData }) { + const { currentTempUnit } = useContext(CurrentTemperatureUnitContext); + + const tempF = weatherData?.temp?.F; + const tempToShow = weatherData?.temp?.[currentTempUnit] ?? 0; + const weatherType = getWeatherTypeByTempF(tempF); + + const filteredItems = useMemo(() => { + const typeLower = weatherType.toLowerCase(); + return (Array.isArray(clothingItems) ? clothingItems : []).filter((item) => { + const itemType = String(item?.weather || "").toLowerCase(); + return itemType === typeLower; + }); + }, [clothingItems, weatherType]); + return (
    -

    Today is {weatherData?.temp?.F}° F / You may want to wear:

    +

    + Today is {tempToShow}°{currentTempUnit} / You may want to wear: +

  • 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%0DmC=k{oOnR|G*F>w$%Mvh!~o?BIbih~BUI6tHB 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 literal 0 HcmV?d00001 diff --git a/src/vendor/fonts/CabinetGrotesk-Medium.woff b/src/vendor/fonts/CabinetGrotesk-Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..b61521a5da2bf4ce0cac4a92c00a378916bd4831 GIT binary patch literal 23052 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 literal 0 HcmV?d00001 diff --git a/src/vendor/fonts/fonts.css b/src/vendor/fonts/fonts.css new file mode 100644 index 0000000..71d1331 --- /dev/null +++ b/src/vendor/fonts/fonts.css @@ -0,0 +1,15 @@ +/* #### Generated By: http://font.download #### */ + +@font-face { + font-family: "Cabinet Grotesk"; + font-style: normal; + font-weight: 500; + src: url("CabinetGrotesk-Medium.woff") format("woff"); +} + +@font-face { + font-family: "Cabinet Grotesk"; + font-style: normal; + font-weight: 700; + src: url("CabinetGrotesk-Bold.woff") format("woff"); +} From 4cf7640d42c8ff34802438b3e61d4fb5e95c5a10 Mon Sep 17 00:00:00 2001 From: ResidentEvilGod Date: Sun, 9 Nov 2025 13:51:41 -0600 Subject: [PATCH 06/66] Project 9 video 11 --- src/ItemModal/ItemModal.css | 11 ++++ src/ModalWithForm/ModalWithForm.jsx | 15 +++-- src/components/App/App.jsx | 85 ++++++++++++++++++++++++---- src/components/ItemCard/ItemCard.jsx | 10 +++- src/components/Main/Main.jsx | 10 +++- 5 files changed, 113 insertions(+), 18 deletions(-) diff --git a/src/ItemModal/ItemModal.css b/src/ItemModal/ItemModal.css index dc86f45..9edda44 100644 --- a/src/ItemModal/ItemModal.css +++ b/src/ItemModal/ItemModal.css @@ -54,4 +54,15 @@ } .modal__title { + margin: 0; +} + +.modal__input { + display: block; +} + +.modal__fieldset { + margin: 0; + padding: 0; + border: none; } diff --git a/src/ModalWithForm/ModalWithForm.jsx b/src/ModalWithForm/ModalWithForm.jsx index 0ae47fc..7d9160f 100644 --- a/src/ModalWithForm/ModalWithForm.jsx +++ b/src/ModalWithForm/ModalWithForm.jsx @@ -1,19 +1,26 @@ -function ModalWithForm({ isOpen, children, handleSubmit }) { +function ModalWithForm({ + isOpen, + children, + handleSubmit, + title, + buttonText, + name, +}) { return (