├── .gitignore ├── index.html ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── products.json ├── src ├── App.css ├── App.jsx ├── assets │ └── react.svg ├── components │ ├── Cart │ │ ├── Cart.css │ │ └── Cart.jsx │ ├── Checkout │ │ └── Checkout.jsx │ ├── Header │ │ ├── Header.css │ │ └── Header.jsx │ ├── Inventory │ │ └── Inventory.jsx │ ├── Layout │ │ └── Home.jsx │ ├── Login │ │ └── Login.jsx │ ├── Orders │ │ ├── Orders.css │ │ └── Orders.jsx │ ├── Product │ │ ├── Product.css │ │ └── Product.jsx │ ├── ReviewItem │ │ ├── ReviewItem.css │ │ └── ReviewItem.jsx │ └── Shop │ │ ├── Shop.css │ │ └── Shop.jsx ├── fakeData │ └── products.json ├── images │ ├── Logo.svg │ ├── favicon.ico │ └── giphy.gif ├── index.css ├── loaders │ └── cartProductsLoader.js ├── main.jsx └── utilities │ └── fakedb.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ema John Shopping App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ema-john-simple", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ema-john-simple", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@fortawesome/fontawesome-svg-core": "^6.3.0", 12 | "@fortawesome/free-solid-svg-icons": "^6.3.0", 13 | "@fortawesome/react-fontawesome": "^0.2.0", 14 | "localforage": "^1.10.0", 15 | "match-sorter": "^6.3.1", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0", 18 | "react-router-dom": "^6.10.0", 19 | "sort-by": "^1.2.0" 20 | }, 21 | "devDependencies": { 22 | "@types/react": "^18.0.28", 23 | "@types/react-dom": "^18.0.11", 24 | "@vitejs/plugin-react": "^3.1.0", 25 | "vite": "^4.2.0" 26 | } 27 | }, 28 | "node_modules/@ampproject/remapping": { 29 | "version": "2.2.0", 30 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 31 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 32 | "dev": true, 33 | "dependencies": { 34 | "@jridgewell/gen-mapping": "^0.1.0", 35 | "@jridgewell/trace-mapping": "^0.3.9" 36 | }, 37 | "engines": { 38 | "node": ">=6.0.0" 39 | } 40 | }, 41 | "node_modules/@babel/code-frame": { 42 | "version": "7.18.6", 43 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 44 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 45 | "dev": true, 46 | "dependencies": { 47 | "@babel/highlight": "^7.18.6" 48 | }, 49 | "engines": { 50 | "node": ">=6.9.0" 51 | } 52 | }, 53 | "node_modules/@babel/compat-data": { 54 | "version": "7.21.0", 55 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", 56 | "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", 57 | "dev": true, 58 | "engines": { 59 | "node": ">=6.9.0" 60 | } 61 | }, 62 | "node_modules/@babel/core": { 63 | "version": "7.21.3", 64 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", 65 | "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", 66 | "dev": true, 67 | "dependencies": { 68 | "@ampproject/remapping": "^2.2.0", 69 | "@babel/code-frame": "^7.18.6", 70 | "@babel/generator": "^7.21.3", 71 | "@babel/helper-compilation-targets": "^7.20.7", 72 | "@babel/helper-module-transforms": "^7.21.2", 73 | "@babel/helpers": "^7.21.0", 74 | "@babel/parser": "^7.21.3", 75 | "@babel/template": "^7.20.7", 76 | "@babel/traverse": "^7.21.3", 77 | "@babel/types": "^7.21.3", 78 | "convert-source-map": "^1.7.0", 79 | "debug": "^4.1.0", 80 | "gensync": "^1.0.0-beta.2", 81 | "json5": "^2.2.2", 82 | "semver": "^6.3.0" 83 | }, 84 | "engines": { 85 | "node": ">=6.9.0" 86 | }, 87 | "funding": { 88 | "type": "opencollective", 89 | "url": "https://opencollective.com/babel" 90 | } 91 | }, 92 | "node_modules/@babel/generator": { 93 | "version": "7.21.3", 94 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", 95 | "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", 96 | "dev": true, 97 | "dependencies": { 98 | "@babel/types": "^7.21.3", 99 | "@jridgewell/gen-mapping": "^0.3.2", 100 | "@jridgewell/trace-mapping": "^0.3.17", 101 | "jsesc": "^2.5.1" 102 | }, 103 | "engines": { 104 | "node": ">=6.9.0" 105 | } 106 | }, 107 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 108 | "version": "0.3.2", 109 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 110 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 111 | "dev": true, 112 | "dependencies": { 113 | "@jridgewell/set-array": "^1.0.1", 114 | "@jridgewell/sourcemap-codec": "^1.4.10", 115 | "@jridgewell/trace-mapping": "^0.3.9" 116 | }, 117 | "engines": { 118 | "node": ">=6.0.0" 119 | } 120 | }, 121 | "node_modules/@babel/helper-compilation-targets": { 122 | "version": "7.20.7", 123 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", 124 | "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", 125 | "dev": true, 126 | "dependencies": { 127 | "@babel/compat-data": "^7.20.5", 128 | "@babel/helper-validator-option": "^7.18.6", 129 | "browserslist": "^4.21.3", 130 | "lru-cache": "^5.1.1", 131 | "semver": "^6.3.0" 132 | }, 133 | "engines": { 134 | "node": ">=6.9.0" 135 | }, 136 | "peerDependencies": { 137 | "@babel/core": "^7.0.0" 138 | } 139 | }, 140 | "node_modules/@babel/helper-environment-visitor": { 141 | "version": "7.18.9", 142 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 143 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 144 | "dev": true, 145 | "engines": { 146 | "node": ">=6.9.0" 147 | } 148 | }, 149 | "node_modules/@babel/helper-function-name": { 150 | "version": "7.21.0", 151 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", 152 | "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", 153 | "dev": true, 154 | "dependencies": { 155 | "@babel/template": "^7.20.7", 156 | "@babel/types": "^7.21.0" 157 | }, 158 | "engines": { 159 | "node": ">=6.9.0" 160 | } 161 | }, 162 | "node_modules/@babel/helper-hoist-variables": { 163 | "version": "7.18.6", 164 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 165 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 166 | "dev": true, 167 | "dependencies": { 168 | "@babel/types": "^7.18.6" 169 | }, 170 | "engines": { 171 | "node": ">=6.9.0" 172 | } 173 | }, 174 | "node_modules/@babel/helper-module-imports": { 175 | "version": "7.18.6", 176 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 177 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 178 | "dev": true, 179 | "dependencies": { 180 | "@babel/types": "^7.18.6" 181 | }, 182 | "engines": { 183 | "node": ">=6.9.0" 184 | } 185 | }, 186 | "node_modules/@babel/helper-module-transforms": { 187 | "version": "7.21.2", 188 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", 189 | "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", 190 | "dev": true, 191 | "dependencies": { 192 | "@babel/helper-environment-visitor": "^7.18.9", 193 | "@babel/helper-module-imports": "^7.18.6", 194 | "@babel/helper-simple-access": "^7.20.2", 195 | "@babel/helper-split-export-declaration": "^7.18.6", 196 | "@babel/helper-validator-identifier": "^7.19.1", 197 | "@babel/template": "^7.20.7", 198 | "@babel/traverse": "^7.21.2", 199 | "@babel/types": "^7.21.2" 200 | }, 201 | "engines": { 202 | "node": ">=6.9.0" 203 | } 204 | }, 205 | "node_modules/@babel/helper-plugin-utils": { 206 | "version": "7.20.2", 207 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", 208 | "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", 209 | "dev": true, 210 | "engines": { 211 | "node": ">=6.9.0" 212 | } 213 | }, 214 | "node_modules/@babel/helper-simple-access": { 215 | "version": "7.20.2", 216 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 217 | "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 218 | "dev": true, 219 | "dependencies": { 220 | "@babel/types": "^7.20.2" 221 | }, 222 | "engines": { 223 | "node": ">=6.9.0" 224 | } 225 | }, 226 | "node_modules/@babel/helper-split-export-declaration": { 227 | "version": "7.18.6", 228 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 229 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 230 | "dev": true, 231 | "dependencies": { 232 | "@babel/types": "^7.18.6" 233 | }, 234 | "engines": { 235 | "node": ">=6.9.0" 236 | } 237 | }, 238 | "node_modules/@babel/helper-string-parser": { 239 | "version": "7.19.4", 240 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 241 | "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 242 | "dev": true, 243 | "engines": { 244 | "node": ">=6.9.0" 245 | } 246 | }, 247 | "node_modules/@babel/helper-validator-identifier": { 248 | "version": "7.19.1", 249 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 250 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 251 | "dev": true, 252 | "engines": { 253 | "node": ">=6.9.0" 254 | } 255 | }, 256 | "node_modules/@babel/helper-validator-option": { 257 | "version": "7.21.0", 258 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", 259 | "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", 260 | "dev": true, 261 | "engines": { 262 | "node": ">=6.9.0" 263 | } 264 | }, 265 | "node_modules/@babel/helpers": { 266 | "version": "7.21.0", 267 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", 268 | "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", 269 | "dev": true, 270 | "dependencies": { 271 | "@babel/template": "^7.20.7", 272 | "@babel/traverse": "^7.21.0", 273 | "@babel/types": "^7.21.0" 274 | }, 275 | "engines": { 276 | "node": ">=6.9.0" 277 | } 278 | }, 279 | "node_modules/@babel/highlight": { 280 | "version": "7.18.6", 281 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 282 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 283 | "dev": true, 284 | "dependencies": { 285 | "@babel/helper-validator-identifier": "^7.18.6", 286 | "chalk": "^2.0.0", 287 | "js-tokens": "^4.0.0" 288 | }, 289 | "engines": { 290 | "node": ">=6.9.0" 291 | } 292 | }, 293 | "node_modules/@babel/parser": { 294 | "version": "7.21.3", 295 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", 296 | "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", 297 | "dev": true, 298 | "bin": { 299 | "parser": "bin/babel-parser.js" 300 | }, 301 | "engines": { 302 | "node": ">=6.0.0" 303 | } 304 | }, 305 | "node_modules/@babel/plugin-transform-react-jsx-self": { 306 | "version": "7.21.0", 307 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", 308 | "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", 309 | "dev": true, 310 | "dependencies": { 311 | "@babel/helper-plugin-utils": "^7.20.2" 312 | }, 313 | "engines": { 314 | "node": ">=6.9.0" 315 | }, 316 | "peerDependencies": { 317 | "@babel/core": "^7.0.0-0" 318 | } 319 | }, 320 | "node_modules/@babel/plugin-transform-react-jsx-source": { 321 | "version": "7.19.6", 322 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", 323 | "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", 324 | "dev": true, 325 | "dependencies": { 326 | "@babel/helper-plugin-utils": "^7.19.0" 327 | }, 328 | "engines": { 329 | "node": ">=6.9.0" 330 | }, 331 | "peerDependencies": { 332 | "@babel/core": "^7.0.0-0" 333 | } 334 | }, 335 | "node_modules/@babel/runtime": { 336 | "version": "7.21.0", 337 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", 338 | "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", 339 | "dependencies": { 340 | "regenerator-runtime": "^0.13.11" 341 | }, 342 | "engines": { 343 | "node": ">=6.9.0" 344 | } 345 | }, 346 | "node_modules/@babel/template": { 347 | "version": "7.20.7", 348 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 349 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 350 | "dev": true, 351 | "dependencies": { 352 | "@babel/code-frame": "^7.18.6", 353 | "@babel/parser": "^7.20.7", 354 | "@babel/types": "^7.20.7" 355 | }, 356 | "engines": { 357 | "node": ">=6.9.0" 358 | } 359 | }, 360 | "node_modules/@babel/traverse": { 361 | "version": "7.21.3", 362 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", 363 | "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", 364 | "dev": true, 365 | "dependencies": { 366 | "@babel/code-frame": "^7.18.6", 367 | "@babel/generator": "^7.21.3", 368 | "@babel/helper-environment-visitor": "^7.18.9", 369 | "@babel/helper-function-name": "^7.21.0", 370 | "@babel/helper-hoist-variables": "^7.18.6", 371 | "@babel/helper-split-export-declaration": "^7.18.6", 372 | "@babel/parser": "^7.21.3", 373 | "@babel/types": "^7.21.3", 374 | "debug": "^4.1.0", 375 | "globals": "^11.1.0" 376 | }, 377 | "engines": { 378 | "node": ">=6.9.0" 379 | } 380 | }, 381 | "node_modules/@babel/types": { 382 | "version": "7.21.3", 383 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", 384 | "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", 385 | "dev": true, 386 | "dependencies": { 387 | "@babel/helper-string-parser": "^7.19.4", 388 | "@babel/helper-validator-identifier": "^7.19.1", 389 | "to-fast-properties": "^2.0.0" 390 | }, 391 | "engines": { 392 | "node": ">=6.9.0" 393 | } 394 | }, 395 | "node_modules/@esbuild/android-arm": { 396 | "version": "0.17.12", 397 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.12.tgz", 398 | "integrity": "sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==", 399 | "cpu": [ 400 | "arm" 401 | ], 402 | "dev": true, 403 | "optional": true, 404 | "os": [ 405 | "android" 406 | ], 407 | "engines": { 408 | "node": ">=12" 409 | } 410 | }, 411 | "node_modules/@esbuild/android-arm64": { 412 | "version": "0.17.12", 413 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.12.tgz", 414 | "integrity": "sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==", 415 | "cpu": [ 416 | "arm64" 417 | ], 418 | "dev": true, 419 | "optional": true, 420 | "os": [ 421 | "android" 422 | ], 423 | "engines": { 424 | "node": ">=12" 425 | } 426 | }, 427 | "node_modules/@esbuild/android-x64": { 428 | "version": "0.17.12", 429 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.12.tgz", 430 | "integrity": "sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==", 431 | "cpu": [ 432 | "x64" 433 | ], 434 | "dev": true, 435 | "optional": true, 436 | "os": [ 437 | "android" 438 | ], 439 | "engines": { 440 | "node": ">=12" 441 | } 442 | }, 443 | "node_modules/@esbuild/darwin-arm64": { 444 | "version": "0.17.12", 445 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.12.tgz", 446 | "integrity": "sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==", 447 | "cpu": [ 448 | "arm64" 449 | ], 450 | "dev": true, 451 | "optional": true, 452 | "os": [ 453 | "darwin" 454 | ], 455 | "engines": { 456 | "node": ">=12" 457 | } 458 | }, 459 | "node_modules/@esbuild/darwin-x64": { 460 | "version": "0.17.12", 461 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.12.tgz", 462 | "integrity": "sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==", 463 | "cpu": [ 464 | "x64" 465 | ], 466 | "dev": true, 467 | "optional": true, 468 | "os": [ 469 | "darwin" 470 | ], 471 | "engines": { 472 | "node": ">=12" 473 | } 474 | }, 475 | "node_modules/@esbuild/freebsd-arm64": { 476 | "version": "0.17.12", 477 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.12.tgz", 478 | "integrity": "sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==", 479 | "cpu": [ 480 | "arm64" 481 | ], 482 | "dev": true, 483 | "optional": true, 484 | "os": [ 485 | "freebsd" 486 | ], 487 | "engines": { 488 | "node": ">=12" 489 | } 490 | }, 491 | "node_modules/@esbuild/freebsd-x64": { 492 | "version": "0.17.12", 493 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.12.tgz", 494 | "integrity": "sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==", 495 | "cpu": [ 496 | "x64" 497 | ], 498 | "dev": true, 499 | "optional": true, 500 | "os": [ 501 | "freebsd" 502 | ], 503 | "engines": { 504 | "node": ">=12" 505 | } 506 | }, 507 | "node_modules/@esbuild/linux-arm": { 508 | "version": "0.17.12", 509 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.12.tgz", 510 | "integrity": "sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==", 511 | "cpu": [ 512 | "arm" 513 | ], 514 | "dev": true, 515 | "optional": true, 516 | "os": [ 517 | "linux" 518 | ], 519 | "engines": { 520 | "node": ">=12" 521 | } 522 | }, 523 | "node_modules/@esbuild/linux-arm64": { 524 | "version": "0.17.12", 525 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.12.tgz", 526 | "integrity": "sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==", 527 | "cpu": [ 528 | "arm64" 529 | ], 530 | "dev": true, 531 | "optional": true, 532 | "os": [ 533 | "linux" 534 | ], 535 | "engines": { 536 | "node": ">=12" 537 | } 538 | }, 539 | "node_modules/@esbuild/linux-ia32": { 540 | "version": "0.17.12", 541 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.12.tgz", 542 | "integrity": "sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==", 543 | "cpu": [ 544 | "ia32" 545 | ], 546 | "dev": true, 547 | "optional": true, 548 | "os": [ 549 | "linux" 550 | ], 551 | "engines": { 552 | "node": ">=12" 553 | } 554 | }, 555 | "node_modules/@esbuild/linux-loong64": { 556 | "version": "0.17.12", 557 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.12.tgz", 558 | "integrity": "sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==", 559 | "cpu": [ 560 | "loong64" 561 | ], 562 | "dev": true, 563 | "optional": true, 564 | "os": [ 565 | "linux" 566 | ], 567 | "engines": { 568 | "node": ">=12" 569 | } 570 | }, 571 | "node_modules/@esbuild/linux-mips64el": { 572 | "version": "0.17.12", 573 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.12.tgz", 574 | "integrity": "sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==", 575 | "cpu": [ 576 | "mips64el" 577 | ], 578 | "dev": true, 579 | "optional": true, 580 | "os": [ 581 | "linux" 582 | ], 583 | "engines": { 584 | "node": ">=12" 585 | } 586 | }, 587 | "node_modules/@esbuild/linux-ppc64": { 588 | "version": "0.17.12", 589 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.12.tgz", 590 | "integrity": "sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==", 591 | "cpu": [ 592 | "ppc64" 593 | ], 594 | "dev": true, 595 | "optional": true, 596 | "os": [ 597 | "linux" 598 | ], 599 | "engines": { 600 | "node": ">=12" 601 | } 602 | }, 603 | "node_modules/@esbuild/linux-riscv64": { 604 | "version": "0.17.12", 605 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.12.tgz", 606 | "integrity": "sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==", 607 | "cpu": [ 608 | "riscv64" 609 | ], 610 | "dev": true, 611 | "optional": true, 612 | "os": [ 613 | "linux" 614 | ], 615 | "engines": { 616 | "node": ">=12" 617 | } 618 | }, 619 | "node_modules/@esbuild/linux-s390x": { 620 | "version": "0.17.12", 621 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.12.tgz", 622 | "integrity": "sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==", 623 | "cpu": [ 624 | "s390x" 625 | ], 626 | "dev": true, 627 | "optional": true, 628 | "os": [ 629 | "linux" 630 | ], 631 | "engines": { 632 | "node": ">=12" 633 | } 634 | }, 635 | "node_modules/@esbuild/linux-x64": { 636 | "version": "0.17.12", 637 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.12.tgz", 638 | "integrity": "sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==", 639 | "cpu": [ 640 | "x64" 641 | ], 642 | "dev": true, 643 | "optional": true, 644 | "os": [ 645 | "linux" 646 | ], 647 | "engines": { 648 | "node": ">=12" 649 | } 650 | }, 651 | "node_modules/@esbuild/netbsd-x64": { 652 | "version": "0.17.12", 653 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.12.tgz", 654 | "integrity": "sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==", 655 | "cpu": [ 656 | "x64" 657 | ], 658 | "dev": true, 659 | "optional": true, 660 | "os": [ 661 | "netbsd" 662 | ], 663 | "engines": { 664 | "node": ">=12" 665 | } 666 | }, 667 | "node_modules/@esbuild/openbsd-x64": { 668 | "version": "0.17.12", 669 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.12.tgz", 670 | "integrity": "sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==", 671 | "cpu": [ 672 | "x64" 673 | ], 674 | "dev": true, 675 | "optional": true, 676 | "os": [ 677 | "openbsd" 678 | ], 679 | "engines": { 680 | "node": ">=12" 681 | } 682 | }, 683 | "node_modules/@esbuild/sunos-x64": { 684 | "version": "0.17.12", 685 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.12.tgz", 686 | "integrity": "sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==", 687 | "cpu": [ 688 | "x64" 689 | ], 690 | "dev": true, 691 | "optional": true, 692 | "os": [ 693 | "sunos" 694 | ], 695 | "engines": { 696 | "node": ">=12" 697 | } 698 | }, 699 | "node_modules/@esbuild/win32-arm64": { 700 | "version": "0.17.12", 701 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.12.tgz", 702 | "integrity": "sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==", 703 | "cpu": [ 704 | "arm64" 705 | ], 706 | "dev": true, 707 | "optional": true, 708 | "os": [ 709 | "win32" 710 | ], 711 | "engines": { 712 | "node": ">=12" 713 | } 714 | }, 715 | "node_modules/@esbuild/win32-ia32": { 716 | "version": "0.17.12", 717 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.12.tgz", 718 | "integrity": "sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==", 719 | "cpu": [ 720 | "ia32" 721 | ], 722 | "dev": true, 723 | "optional": true, 724 | "os": [ 725 | "win32" 726 | ], 727 | "engines": { 728 | "node": ">=12" 729 | } 730 | }, 731 | "node_modules/@esbuild/win32-x64": { 732 | "version": "0.17.12", 733 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.12.tgz", 734 | "integrity": "sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==", 735 | "cpu": [ 736 | "x64" 737 | ], 738 | "dev": true, 739 | "optional": true, 740 | "os": [ 741 | "win32" 742 | ], 743 | "engines": { 744 | "node": ">=12" 745 | } 746 | }, 747 | "node_modules/@fortawesome/fontawesome-common-types": { 748 | "version": "6.3.0", 749 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", 750 | "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==", 751 | "hasInstallScript": true, 752 | "engines": { 753 | "node": ">=6" 754 | } 755 | }, 756 | "node_modules/@fortawesome/fontawesome-svg-core": { 757 | "version": "6.3.0", 758 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", 759 | "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", 760 | "hasInstallScript": true, 761 | "dependencies": { 762 | "@fortawesome/fontawesome-common-types": "6.3.0" 763 | }, 764 | "engines": { 765 | "node": ">=6" 766 | } 767 | }, 768 | "node_modules/@fortawesome/free-solid-svg-icons": { 769 | "version": "6.3.0", 770 | "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", 771 | "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", 772 | "hasInstallScript": true, 773 | "dependencies": { 774 | "@fortawesome/fontawesome-common-types": "6.3.0" 775 | }, 776 | "engines": { 777 | "node": ">=6" 778 | } 779 | }, 780 | "node_modules/@fortawesome/react-fontawesome": { 781 | "version": "0.2.0", 782 | "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", 783 | "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", 784 | "dependencies": { 785 | "prop-types": "^15.8.1" 786 | }, 787 | "peerDependencies": { 788 | "@fortawesome/fontawesome-svg-core": "~1 || ~6", 789 | "react": ">=16.3" 790 | } 791 | }, 792 | "node_modules/@jridgewell/gen-mapping": { 793 | "version": "0.1.1", 794 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 795 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 796 | "dev": true, 797 | "dependencies": { 798 | "@jridgewell/set-array": "^1.0.0", 799 | "@jridgewell/sourcemap-codec": "^1.4.10" 800 | }, 801 | "engines": { 802 | "node": ">=6.0.0" 803 | } 804 | }, 805 | "node_modules/@jridgewell/resolve-uri": { 806 | "version": "3.1.0", 807 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 808 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 809 | "dev": true, 810 | "engines": { 811 | "node": ">=6.0.0" 812 | } 813 | }, 814 | "node_modules/@jridgewell/set-array": { 815 | "version": "1.1.2", 816 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 817 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 818 | "dev": true, 819 | "engines": { 820 | "node": ">=6.0.0" 821 | } 822 | }, 823 | "node_modules/@jridgewell/sourcemap-codec": { 824 | "version": "1.4.14", 825 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 826 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 827 | "dev": true 828 | }, 829 | "node_modules/@jridgewell/trace-mapping": { 830 | "version": "0.3.17", 831 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 832 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 833 | "dev": true, 834 | "dependencies": { 835 | "@jridgewell/resolve-uri": "3.1.0", 836 | "@jridgewell/sourcemap-codec": "1.4.14" 837 | } 838 | }, 839 | "node_modules/@remix-run/router": { 840 | "version": "1.5.0", 841 | "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", 842 | "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", 843 | "engines": { 844 | "node": ">=14" 845 | } 846 | }, 847 | "node_modules/@types/prop-types": { 848 | "version": "15.7.5", 849 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 850 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 851 | "dev": true 852 | }, 853 | "node_modules/@types/react": { 854 | "version": "18.0.28", 855 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", 856 | "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", 857 | "dev": true, 858 | "dependencies": { 859 | "@types/prop-types": "*", 860 | "@types/scheduler": "*", 861 | "csstype": "^3.0.2" 862 | } 863 | }, 864 | "node_modules/@types/react-dom": { 865 | "version": "18.0.11", 866 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", 867 | "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", 868 | "dev": true, 869 | "dependencies": { 870 | "@types/react": "*" 871 | } 872 | }, 873 | "node_modules/@types/scheduler": { 874 | "version": "0.16.3", 875 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", 876 | "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", 877 | "dev": true 878 | }, 879 | "node_modules/@vitejs/plugin-react": { 880 | "version": "3.1.0", 881 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", 882 | "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", 883 | "dev": true, 884 | "dependencies": { 885 | "@babel/core": "^7.20.12", 886 | "@babel/plugin-transform-react-jsx-self": "^7.18.6", 887 | "@babel/plugin-transform-react-jsx-source": "^7.19.6", 888 | "magic-string": "^0.27.0", 889 | "react-refresh": "^0.14.0" 890 | }, 891 | "engines": { 892 | "node": "^14.18.0 || >=16.0.0" 893 | }, 894 | "peerDependencies": { 895 | "vite": "^4.1.0-beta.0" 896 | } 897 | }, 898 | "node_modules/ansi-styles": { 899 | "version": "3.2.1", 900 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 901 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 902 | "dev": true, 903 | "dependencies": { 904 | "color-convert": "^1.9.0" 905 | }, 906 | "engines": { 907 | "node": ">=4" 908 | } 909 | }, 910 | "node_modules/browserslist": { 911 | "version": "4.21.5", 912 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 913 | "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 914 | "dev": true, 915 | "funding": [ 916 | { 917 | "type": "opencollective", 918 | "url": "https://opencollective.com/browserslist" 919 | }, 920 | { 921 | "type": "tidelift", 922 | "url": "https://tidelift.com/funding/github/npm/browserslist" 923 | } 924 | ], 925 | "dependencies": { 926 | "caniuse-lite": "^1.0.30001449", 927 | "electron-to-chromium": "^1.4.284", 928 | "node-releases": "^2.0.8", 929 | "update-browserslist-db": "^1.0.10" 930 | }, 931 | "bin": { 932 | "browserslist": "cli.js" 933 | }, 934 | "engines": { 935 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 936 | } 937 | }, 938 | "node_modules/caniuse-lite": { 939 | "version": "1.0.30001469", 940 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz", 941 | "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==", 942 | "dev": true, 943 | "funding": [ 944 | { 945 | "type": "opencollective", 946 | "url": "https://opencollective.com/browserslist" 947 | }, 948 | { 949 | "type": "tidelift", 950 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 951 | } 952 | ] 953 | }, 954 | "node_modules/chalk": { 955 | "version": "2.4.2", 956 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 957 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 958 | "dev": true, 959 | "dependencies": { 960 | "ansi-styles": "^3.2.1", 961 | "escape-string-regexp": "^1.0.5", 962 | "supports-color": "^5.3.0" 963 | }, 964 | "engines": { 965 | "node": ">=4" 966 | } 967 | }, 968 | "node_modules/color-convert": { 969 | "version": "1.9.3", 970 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 971 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 972 | "dev": true, 973 | "dependencies": { 974 | "color-name": "1.1.3" 975 | } 976 | }, 977 | "node_modules/color-name": { 978 | "version": "1.1.3", 979 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 980 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 981 | "dev": true 982 | }, 983 | "node_modules/convert-source-map": { 984 | "version": "1.9.0", 985 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 986 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 987 | "dev": true 988 | }, 989 | "node_modules/csstype": { 990 | "version": "3.1.1", 991 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 992 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 993 | "dev": true 994 | }, 995 | "node_modules/debug": { 996 | "version": "4.3.4", 997 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 998 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 999 | "dev": true, 1000 | "dependencies": { 1001 | "ms": "2.1.2" 1002 | }, 1003 | "engines": { 1004 | "node": ">=6.0" 1005 | }, 1006 | "peerDependenciesMeta": { 1007 | "supports-color": { 1008 | "optional": true 1009 | } 1010 | } 1011 | }, 1012 | "node_modules/electron-to-chromium": { 1013 | "version": "1.4.337", 1014 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.337.tgz", 1015 | "integrity": "sha512-W8gdzXG86mVPoc56eM8YA+QiLxaAxJ8cmDjxZgfhLLWVvZQxyA918w5tX2JEWApZta45T1/sYcmFHTsTOUE3nw==", 1016 | "dev": true 1017 | }, 1018 | "node_modules/esbuild": { 1019 | "version": "0.17.12", 1020 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.12.tgz", 1021 | "integrity": "sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==", 1022 | "dev": true, 1023 | "hasInstallScript": true, 1024 | "bin": { 1025 | "esbuild": "bin/esbuild" 1026 | }, 1027 | "engines": { 1028 | "node": ">=12" 1029 | }, 1030 | "optionalDependencies": { 1031 | "@esbuild/android-arm": "0.17.12", 1032 | "@esbuild/android-arm64": "0.17.12", 1033 | "@esbuild/android-x64": "0.17.12", 1034 | "@esbuild/darwin-arm64": "0.17.12", 1035 | "@esbuild/darwin-x64": "0.17.12", 1036 | "@esbuild/freebsd-arm64": "0.17.12", 1037 | "@esbuild/freebsd-x64": "0.17.12", 1038 | "@esbuild/linux-arm": "0.17.12", 1039 | "@esbuild/linux-arm64": "0.17.12", 1040 | "@esbuild/linux-ia32": "0.17.12", 1041 | "@esbuild/linux-loong64": "0.17.12", 1042 | "@esbuild/linux-mips64el": "0.17.12", 1043 | "@esbuild/linux-ppc64": "0.17.12", 1044 | "@esbuild/linux-riscv64": "0.17.12", 1045 | "@esbuild/linux-s390x": "0.17.12", 1046 | "@esbuild/linux-x64": "0.17.12", 1047 | "@esbuild/netbsd-x64": "0.17.12", 1048 | "@esbuild/openbsd-x64": "0.17.12", 1049 | "@esbuild/sunos-x64": "0.17.12", 1050 | "@esbuild/win32-arm64": "0.17.12", 1051 | "@esbuild/win32-ia32": "0.17.12", 1052 | "@esbuild/win32-x64": "0.17.12" 1053 | } 1054 | }, 1055 | "node_modules/escalade": { 1056 | "version": "3.1.1", 1057 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1058 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1059 | "dev": true, 1060 | "engines": { 1061 | "node": ">=6" 1062 | } 1063 | }, 1064 | "node_modules/escape-string-regexp": { 1065 | "version": "1.0.5", 1066 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1067 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1068 | "dev": true, 1069 | "engines": { 1070 | "node": ">=0.8.0" 1071 | } 1072 | }, 1073 | "node_modules/fsevents": { 1074 | "version": "2.3.2", 1075 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1076 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1077 | "dev": true, 1078 | "hasInstallScript": true, 1079 | "optional": true, 1080 | "os": [ 1081 | "darwin" 1082 | ], 1083 | "engines": { 1084 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1085 | } 1086 | }, 1087 | "node_modules/function-bind": { 1088 | "version": "1.1.1", 1089 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1090 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1091 | "dev": true 1092 | }, 1093 | "node_modules/gensync": { 1094 | "version": "1.0.0-beta.2", 1095 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1096 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1097 | "dev": true, 1098 | "engines": { 1099 | "node": ">=6.9.0" 1100 | } 1101 | }, 1102 | "node_modules/globals": { 1103 | "version": "11.12.0", 1104 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1105 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1106 | "dev": true, 1107 | "engines": { 1108 | "node": ">=4" 1109 | } 1110 | }, 1111 | "node_modules/has": { 1112 | "version": "1.0.3", 1113 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1114 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "function-bind": "^1.1.1" 1118 | }, 1119 | "engines": { 1120 | "node": ">= 0.4.0" 1121 | } 1122 | }, 1123 | "node_modules/has-flag": { 1124 | "version": "3.0.0", 1125 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1126 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1127 | "dev": true, 1128 | "engines": { 1129 | "node": ">=4" 1130 | } 1131 | }, 1132 | "node_modules/immediate": { 1133 | "version": "3.0.6", 1134 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1135 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 1136 | }, 1137 | "node_modules/is-core-module": { 1138 | "version": "2.11.0", 1139 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1140 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1141 | "dev": true, 1142 | "dependencies": { 1143 | "has": "^1.0.3" 1144 | }, 1145 | "funding": { 1146 | "url": "https://github.com/sponsors/ljharb" 1147 | } 1148 | }, 1149 | "node_modules/js-tokens": { 1150 | "version": "4.0.0", 1151 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1152 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1153 | }, 1154 | "node_modules/jsesc": { 1155 | "version": "2.5.2", 1156 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1157 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1158 | "dev": true, 1159 | "bin": { 1160 | "jsesc": "bin/jsesc" 1161 | }, 1162 | "engines": { 1163 | "node": ">=4" 1164 | } 1165 | }, 1166 | "node_modules/json5": { 1167 | "version": "2.2.3", 1168 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1169 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1170 | "dev": true, 1171 | "bin": { 1172 | "json5": "lib/cli.js" 1173 | }, 1174 | "engines": { 1175 | "node": ">=6" 1176 | } 1177 | }, 1178 | "node_modules/lie": { 1179 | "version": "3.1.1", 1180 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 1181 | "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", 1182 | "dependencies": { 1183 | "immediate": "~3.0.5" 1184 | } 1185 | }, 1186 | "node_modules/localforage": { 1187 | "version": "1.10.0", 1188 | "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", 1189 | "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", 1190 | "dependencies": { 1191 | "lie": "3.1.1" 1192 | } 1193 | }, 1194 | "node_modules/loose-envify": { 1195 | "version": "1.4.0", 1196 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1197 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1198 | "dependencies": { 1199 | "js-tokens": "^3.0.0 || ^4.0.0" 1200 | }, 1201 | "bin": { 1202 | "loose-envify": "cli.js" 1203 | } 1204 | }, 1205 | "node_modules/lru-cache": { 1206 | "version": "5.1.1", 1207 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1208 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1209 | "dev": true, 1210 | "dependencies": { 1211 | "yallist": "^3.0.2" 1212 | } 1213 | }, 1214 | "node_modules/magic-string": { 1215 | "version": "0.27.0", 1216 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 1217 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 1218 | "dev": true, 1219 | "dependencies": { 1220 | "@jridgewell/sourcemap-codec": "^1.4.13" 1221 | }, 1222 | "engines": { 1223 | "node": ">=12" 1224 | } 1225 | }, 1226 | "node_modules/match-sorter": { 1227 | "version": "6.3.1", 1228 | "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", 1229 | "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", 1230 | "dependencies": { 1231 | "@babel/runtime": "^7.12.5", 1232 | "remove-accents": "0.4.2" 1233 | } 1234 | }, 1235 | "node_modules/ms": { 1236 | "version": "2.1.2", 1237 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1238 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1239 | "dev": true 1240 | }, 1241 | "node_modules/nanoid": { 1242 | "version": "3.3.4", 1243 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1244 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1245 | "dev": true, 1246 | "bin": { 1247 | "nanoid": "bin/nanoid.cjs" 1248 | }, 1249 | "engines": { 1250 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1251 | } 1252 | }, 1253 | "node_modules/node-releases": { 1254 | "version": "2.0.10", 1255 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 1256 | "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 1257 | "dev": true 1258 | }, 1259 | "node_modules/object-assign": { 1260 | "version": "4.1.1", 1261 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1262 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1263 | "engines": { 1264 | "node": ">=0.10.0" 1265 | } 1266 | }, 1267 | "node_modules/object-path": { 1268 | "version": "0.6.0", 1269 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.6.0.tgz", 1270 | "integrity": "sha512-fxrwsCFi3/p+LeLOAwo/wyRMODZxdGBtUlWRzsEpsUVrisZbEfZ21arxLGfaWfcnqb8oHPNihIb4XPE8CQPN5A==", 1271 | "engines": { 1272 | "node": ">=0.8.0" 1273 | } 1274 | }, 1275 | "node_modules/path-parse": { 1276 | "version": "1.0.7", 1277 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1278 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1279 | "dev": true 1280 | }, 1281 | "node_modules/picocolors": { 1282 | "version": "1.0.0", 1283 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1284 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1285 | "dev": true 1286 | }, 1287 | "node_modules/postcss": { 1288 | "version": "8.4.21", 1289 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 1290 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 1291 | "dev": true, 1292 | "funding": [ 1293 | { 1294 | "type": "opencollective", 1295 | "url": "https://opencollective.com/postcss/" 1296 | }, 1297 | { 1298 | "type": "tidelift", 1299 | "url": "https://tidelift.com/funding/github/npm/postcss" 1300 | } 1301 | ], 1302 | "dependencies": { 1303 | "nanoid": "^3.3.4", 1304 | "picocolors": "^1.0.0", 1305 | "source-map-js": "^1.0.2" 1306 | }, 1307 | "engines": { 1308 | "node": "^10 || ^12 || >=14" 1309 | } 1310 | }, 1311 | "node_modules/prop-types": { 1312 | "version": "15.8.1", 1313 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 1314 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 1315 | "dependencies": { 1316 | "loose-envify": "^1.4.0", 1317 | "object-assign": "^4.1.1", 1318 | "react-is": "^16.13.1" 1319 | } 1320 | }, 1321 | "node_modules/react": { 1322 | "version": "18.2.0", 1323 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1324 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1325 | "dependencies": { 1326 | "loose-envify": "^1.1.0" 1327 | }, 1328 | "engines": { 1329 | "node": ">=0.10.0" 1330 | } 1331 | }, 1332 | "node_modules/react-dom": { 1333 | "version": "18.2.0", 1334 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1335 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1336 | "dependencies": { 1337 | "loose-envify": "^1.1.0", 1338 | "scheduler": "^0.23.0" 1339 | }, 1340 | "peerDependencies": { 1341 | "react": "^18.2.0" 1342 | } 1343 | }, 1344 | "node_modules/react-is": { 1345 | "version": "16.13.1", 1346 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1347 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1348 | }, 1349 | "node_modules/react-refresh": { 1350 | "version": "0.14.0", 1351 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", 1352 | "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", 1353 | "dev": true, 1354 | "engines": { 1355 | "node": ">=0.10.0" 1356 | } 1357 | }, 1358 | "node_modules/react-router": { 1359 | "version": "6.10.0", 1360 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", 1361 | "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", 1362 | "dependencies": { 1363 | "@remix-run/router": "1.5.0" 1364 | }, 1365 | "engines": { 1366 | "node": ">=14" 1367 | }, 1368 | "peerDependencies": { 1369 | "react": ">=16.8" 1370 | } 1371 | }, 1372 | "node_modules/react-router-dom": { 1373 | "version": "6.10.0", 1374 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", 1375 | "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", 1376 | "dependencies": { 1377 | "@remix-run/router": "1.5.0", 1378 | "react-router": "6.10.0" 1379 | }, 1380 | "engines": { 1381 | "node": ">=14" 1382 | }, 1383 | "peerDependencies": { 1384 | "react": ">=16.8", 1385 | "react-dom": ">=16.8" 1386 | } 1387 | }, 1388 | "node_modules/regenerator-runtime": { 1389 | "version": "0.13.11", 1390 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 1391 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 1392 | }, 1393 | "node_modules/remove-accents": { 1394 | "version": "0.4.2", 1395 | "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", 1396 | "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" 1397 | }, 1398 | "node_modules/resolve": { 1399 | "version": "1.22.1", 1400 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1401 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1402 | "dev": true, 1403 | "dependencies": { 1404 | "is-core-module": "^2.9.0", 1405 | "path-parse": "^1.0.7", 1406 | "supports-preserve-symlinks-flag": "^1.0.0" 1407 | }, 1408 | "bin": { 1409 | "resolve": "bin/resolve" 1410 | }, 1411 | "funding": { 1412 | "url": "https://github.com/sponsors/ljharb" 1413 | } 1414 | }, 1415 | "node_modules/rollup": { 1416 | "version": "3.20.1", 1417 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.1.tgz", 1418 | "integrity": "sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==", 1419 | "dev": true, 1420 | "bin": { 1421 | "rollup": "dist/bin/rollup" 1422 | }, 1423 | "engines": { 1424 | "node": ">=14.18.0", 1425 | "npm": ">=8.0.0" 1426 | }, 1427 | "optionalDependencies": { 1428 | "fsevents": "~2.3.2" 1429 | } 1430 | }, 1431 | "node_modules/scheduler": { 1432 | "version": "0.23.0", 1433 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1434 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1435 | "dependencies": { 1436 | "loose-envify": "^1.1.0" 1437 | } 1438 | }, 1439 | "node_modules/semver": { 1440 | "version": "6.3.0", 1441 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1442 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1443 | "dev": true, 1444 | "bin": { 1445 | "semver": "bin/semver.js" 1446 | } 1447 | }, 1448 | "node_modules/sort-by": { 1449 | "version": "1.2.0", 1450 | "resolved": "https://registry.npmjs.org/sort-by/-/sort-by-1.2.0.tgz", 1451 | "integrity": "sha512-aRyW65r3xMnf4nxJRluCg0H/woJpksU1dQxRtXYzau30sNBOmf5HACpDd9MZDhKh7ALQ5FgSOfMPwZEtUmMqcg==", 1452 | "dependencies": { 1453 | "object-path": "0.6.0" 1454 | } 1455 | }, 1456 | "node_modules/source-map-js": { 1457 | "version": "1.0.2", 1458 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1459 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1460 | "dev": true, 1461 | "engines": { 1462 | "node": ">=0.10.0" 1463 | } 1464 | }, 1465 | "node_modules/supports-color": { 1466 | "version": "5.5.0", 1467 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1468 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "has-flag": "^3.0.0" 1472 | }, 1473 | "engines": { 1474 | "node": ">=4" 1475 | } 1476 | }, 1477 | "node_modules/supports-preserve-symlinks-flag": { 1478 | "version": "1.0.0", 1479 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1480 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1481 | "dev": true, 1482 | "engines": { 1483 | "node": ">= 0.4" 1484 | }, 1485 | "funding": { 1486 | "url": "https://github.com/sponsors/ljharb" 1487 | } 1488 | }, 1489 | "node_modules/to-fast-properties": { 1490 | "version": "2.0.0", 1491 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1492 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 1493 | "dev": true, 1494 | "engines": { 1495 | "node": ">=4" 1496 | } 1497 | }, 1498 | "node_modules/update-browserslist-db": { 1499 | "version": "1.0.10", 1500 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 1501 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 1502 | "dev": true, 1503 | "funding": [ 1504 | { 1505 | "type": "opencollective", 1506 | "url": "https://opencollective.com/browserslist" 1507 | }, 1508 | { 1509 | "type": "tidelift", 1510 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1511 | } 1512 | ], 1513 | "dependencies": { 1514 | "escalade": "^3.1.1", 1515 | "picocolors": "^1.0.0" 1516 | }, 1517 | "bin": { 1518 | "browserslist-lint": "cli.js" 1519 | }, 1520 | "peerDependencies": { 1521 | "browserslist": ">= 4.21.0" 1522 | } 1523 | }, 1524 | "node_modules/vite": { 1525 | "version": "4.2.1", 1526 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", 1527 | "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 1528 | "dev": true, 1529 | "dependencies": { 1530 | "esbuild": "^0.17.5", 1531 | "postcss": "^8.4.21", 1532 | "resolve": "^1.22.1", 1533 | "rollup": "^3.18.0" 1534 | }, 1535 | "bin": { 1536 | "vite": "bin/vite.js" 1537 | }, 1538 | "engines": { 1539 | "node": "^14.18.0 || >=16.0.0" 1540 | }, 1541 | "optionalDependencies": { 1542 | "fsevents": "~2.3.2" 1543 | }, 1544 | "peerDependencies": { 1545 | "@types/node": ">= 14", 1546 | "less": "*", 1547 | "sass": "*", 1548 | "stylus": "*", 1549 | "sugarss": "*", 1550 | "terser": "^5.4.0" 1551 | }, 1552 | "peerDependenciesMeta": { 1553 | "@types/node": { 1554 | "optional": true 1555 | }, 1556 | "less": { 1557 | "optional": true 1558 | }, 1559 | "sass": { 1560 | "optional": true 1561 | }, 1562 | "stylus": { 1563 | "optional": true 1564 | }, 1565 | "sugarss": { 1566 | "optional": true 1567 | }, 1568 | "terser": { 1569 | "optional": true 1570 | } 1571 | } 1572 | }, 1573 | "node_modules/yallist": { 1574 | "version": "3.1.1", 1575 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1576 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 1577 | "dev": true 1578 | } 1579 | }, 1580 | "dependencies": { 1581 | "@ampproject/remapping": { 1582 | "version": "2.2.0", 1583 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 1584 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 1585 | "dev": true, 1586 | "requires": { 1587 | "@jridgewell/gen-mapping": "^0.1.0", 1588 | "@jridgewell/trace-mapping": "^0.3.9" 1589 | } 1590 | }, 1591 | "@babel/code-frame": { 1592 | "version": "7.18.6", 1593 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 1594 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 1595 | "dev": true, 1596 | "requires": { 1597 | "@babel/highlight": "^7.18.6" 1598 | } 1599 | }, 1600 | "@babel/compat-data": { 1601 | "version": "7.21.0", 1602 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", 1603 | "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", 1604 | "dev": true 1605 | }, 1606 | "@babel/core": { 1607 | "version": "7.21.3", 1608 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", 1609 | "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", 1610 | "dev": true, 1611 | "requires": { 1612 | "@ampproject/remapping": "^2.2.0", 1613 | "@babel/code-frame": "^7.18.6", 1614 | "@babel/generator": "^7.21.3", 1615 | "@babel/helper-compilation-targets": "^7.20.7", 1616 | "@babel/helper-module-transforms": "^7.21.2", 1617 | "@babel/helpers": "^7.21.0", 1618 | "@babel/parser": "^7.21.3", 1619 | "@babel/template": "^7.20.7", 1620 | "@babel/traverse": "^7.21.3", 1621 | "@babel/types": "^7.21.3", 1622 | "convert-source-map": "^1.7.0", 1623 | "debug": "^4.1.0", 1624 | "gensync": "^1.0.0-beta.2", 1625 | "json5": "^2.2.2", 1626 | "semver": "^6.3.0" 1627 | } 1628 | }, 1629 | "@babel/generator": { 1630 | "version": "7.21.3", 1631 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", 1632 | "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", 1633 | "dev": true, 1634 | "requires": { 1635 | "@babel/types": "^7.21.3", 1636 | "@jridgewell/gen-mapping": "^0.3.2", 1637 | "@jridgewell/trace-mapping": "^0.3.17", 1638 | "jsesc": "^2.5.1" 1639 | }, 1640 | "dependencies": { 1641 | "@jridgewell/gen-mapping": { 1642 | "version": "0.3.2", 1643 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 1644 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 1645 | "dev": true, 1646 | "requires": { 1647 | "@jridgewell/set-array": "^1.0.1", 1648 | "@jridgewell/sourcemap-codec": "^1.4.10", 1649 | "@jridgewell/trace-mapping": "^0.3.9" 1650 | } 1651 | } 1652 | } 1653 | }, 1654 | "@babel/helper-compilation-targets": { 1655 | "version": "7.20.7", 1656 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", 1657 | "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", 1658 | "dev": true, 1659 | "requires": { 1660 | "@babel/compat-data": "^7.20.5", 1661 | "@babel/helper-validator-option": "^7.18.6", 1662 | "browserslist": "^4.21.3", 1663 | "lru-cache": "^5.1.1", 1664 | "semver": "^6.3.0" 1665 | } 1666 | }, 1667 | "@babel/helper-environment-visitor": { 1668 | "version": "7.18.9", 1669 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 1670 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 1671 | "dev": true 1672 | }, 1673 | "@babel/helper-function-name": { 1674 | "version": "7.21.0", 1675 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", 1676 | "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", 1677 | "dev": true, 1678 | "requires": { 1679 | "@babel/template": "^7.20.7", 1680 | "@babel/types": "^7.21.0" 1681 | } 1682 | }, 1683 | "@babel/helper-hoist-variables": { 1684 | "version": "7.18.6", 1685 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 1686 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 1687 | "dev": true, 1688 | "requires": { 1689 | "@babel/types": "^7.18.6" 1690 | } 1691 | }, 1692 | "@babel/helper-module-imports": { 1693 | "version": "7.18.6", 1694 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 1695 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 1696 | "dev": true, 1697 | "requires": { 1698 | "@babel/types": "^7.18.6" 1699 | } 1700 | }, 1701 | "@babel/helper-module-transforms": { 1702 | "version": "7.21.2", 1703 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", 1704 | "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", 1705 | "dev": true, 1706 | "requires": { 1707 | "@babel/helper-environment-visitor": "^7.18.9", 1708 | "@babel/helper-module-imports": "^7.18.6", 1709 | "@babel/helper-simple-access": "^7.20.2", 1710 | "@babel/helper-split-export-declaration": "^7.18.6", 1711 | "@babel/helper-validator-identifier": "^7.19.1", 1712 | "@babel/template": "^7.20.7", 1713 | "@babel/traverse": "^7.21.2", 1714 | "@babel/types": "^7.21.2" 1715 | } 1716 | }, 1717 | "@babel/helper-plugin-utils": { 1718 | "version": "7.20.2", 1719 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", 1720 | "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", 1721 | "dev": true 1722 | }, 1723 | "@babel/helper-simple-access": { 1724 | "version": "7.20.2", 1725 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 1726 | "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 1727 | "dev": true, 1728 | "requires": { 1729 | "@babel/types": "^7.20.2" 1730 | } 1731 | }, 1732 | "@babel/helper-split-export-declaration": { 1733 | "version": "7.18.6", 1734 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 1735 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 1736 | "dev": true, 1737 | "requires": { 1738 | "@babel/types": "^7.18.6" 1739 | } 1740 | }, 1741 | "@babel/helper-string-parser": { 1742 | "version": "7.19.4", 1743 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 1744 | "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 1745 | "dev": true 1746 | }, 1747 | "@babel/helper-validator-identifier": { 1748 | "version": "7.19.1", 1749 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 1750 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 1751 | "dev": true 1752 | }, 1753 | "@babel/helper-validator-option": { 1754 | "version": "7.21.0", 1755 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", 1756 | "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", 1757 | "dev": true 1758 | }, 1759 | "@babel/helpers": { 1760 | "version": "7.21.0", 1761 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", 1762 | "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", 1763 | "dev": true, 1764 | "requires": { 1765 | "@babel/template": "^7.20.7", 1766 | "@babel/traverse": "^7.21.0", 1767 | "@babel/types": "^7.21.0" 1768 | } 1769 | }, 1770 | "@babel/highlight": { 1771 | "version": "7.18.6", 1772 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 1773 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 1774 | "dev": true, 1775 | "requires": { 1776 | "@babel/helper-validator-identifier": "^7.18.6", 1777 | "chalk": "^2.0.0", 1778 | "js-tokens": "^4.0.0" 1779 | } 1780 | }, 1781 | "@babel/parser": { 1782 | "version": "7.21.3", 1783 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", 1784 | "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", 1785 | "dev": true 1786 | }, 1787 | "@babel/plugin-transform-react-jsx-self": { 1788 | "version": "7.21.0", 1789 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", 1790 | "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", 1791 | "dev": true, 1792 | "requires": { 1793 | "@babel/helper-plugin-utils": "^7.20.2" 1794 | } 1795 | }, 1796 | "@babel/plugin-transform-react-jsx-source": { 1797 | "version": "7.19.6", 1798 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", 1799 | "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", 1800 | "dev": true, 1801 | "requires": { 1802 | "@babel/helper-plugin-utils": "^7.19.0" 1803 | } 1804 | }, 1805 | "@babel/runtime": { 1806 | "version": "7.21.0", 1807 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", 1808 | "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", 1809 | "requires": { 1810 | "regenerator-runtime": "^0.13.11" 1811 | } 1812 | }, 1813 | "@babel/template": { 1814 | "version": "7.20.7", 1815 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 1816 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 1817 | "dev": true, 1818 | "requires": { 1819 | "@babel/code-frame": "^7.18.6", 1820 | "@babel/parser": "^7.20.7", 1821 | "@babel/types": "^7.20.7" 1822 | } 1823 | }, 1824 | "@babel/traverse": { 1825 | "version": "7.21.3", 1826 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", 1827 | "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", 1828 | "dev": true, 1829 | "requires": { 1830 | "@babel/code-frame": "^7.18.6", 1831 | "@babel/generator": "^7.21.3", 1832 | "@babel/helper-environment-visitor": "^7.18.9", 1833 | "@babel/helper-function-name": "^7.21.0", 1834 | "@babel/helper-hoist-variables": "^7.18.6", 1835 | "@babel/helper-split-export-declaration": "^7.18.6", 1836 | "@babel/parser": "^7.21.3", 1837 | "@babel/types": "^7.21.3", 1838 | "debug": "^4.1.0", 1839 | "globals": "^11.1.0" 1840 | } 1841 | }, 1842 | "@babel/types": { 1843 | "version": "7.21.3", 1844 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", 1845 | "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", 1846 | "dev": true, 1847 | "requires": { 1848 | "@babel/helper-string-parser": "^7.19.4", 1849 | "@babel/helper-validator-identifier": "^7.19.1", 1850 | "to-fast-properties": "^2.0.0" 1851 | } 1852 | }, 1853 | "@esbuild/android-arm": { 1854 | "version": "0.17.12", 1855 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.12.tgz", 1856 | "integrity": "sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==", 1857 | "dev": true, 1858 | "optional": true 1859 | }, 1860 | "@esbuild/android-arm64": { 1861 | "version": "0.17.12", 1862 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.12.tgz", 1863 | "integrity": "sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==", 1864 | "dev": true, 1865 | "optional": true 1866 | }, 1867 | "@esbuild/android-x64": { 1868 | "version": "0.17.12", 1869 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.12.tgz", 1870 | "integrity": "sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==", 1871 | "dev": true, 1872 | "optional": true 1873 | }, 1874 | "@esbuild/darwin-arm64": { 1875 | "version": "0.17.12", 1876 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.12.tgz", 1877 | "integrity": "sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==", 1878 | "dev": true, 1879 | "optional": true 1880 | }, 1881 | "@esbuild/darwin-x64": { 1882 | "version": "0.17.12", 1883 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.12.tgz", 1884 | "integrity": "sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==", 1885 | "dev": true, 1886 | "optional": true 1887 | }, 1888 | "@esbuild/freebsd-arm64": { 1889 | "version": "0.17.12", 1890 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.12.tgz", 1891 | "integrity": "sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==", 1892 | "dev": true, 1893 | "optional": true 1894 | }, 1895 | "@esbuild/freebsd-x64": { 1896 | "version": "0.17.12", 1897 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.12.tgz", 1898 | "integrity": "sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==", 1899 | "dev": true, 1900 | "optional": true 1901 | }, 1902 | "@esbuild/linux-arm": { 1903 | "version": "0.17.12", 1904 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.12.tgz", 1905 | "integrity": "sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==", 1906 | "dev": true, 1907 | "optional": true 1908 | }, 1909 | "@esbuild/linux-arm64": { 1910 | "version": "0.17.12", 1911 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.12.tgz", 1912 | "integrity": "sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==", 1913 | "dev": true, 1914 | "optional": true 1915 | }, 1916 | "@esbuild/linux-ia32": { 1917 | "version": "0.17.12", 1918 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.12.tgz", 1919 | "integrity": "sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==", 1920 | "dev": true, 1921 | "optional": true 1922 | }, 1923 | "@esbuild/linux-loong64": { 1924 | "version": "0.17.12", 1925 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.12.tgz", 1926 | "integrity": "sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==", 1927 | "dev": true, 1928 | "optional": true 1929 | }, 1930 | "@esbuild/linux-mips64el": { 1931 | "version": "0.17.12", 1932 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.12.tgz", 1933 | "integrity": "sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==", 1934 | "dev": true, 1935 | "optional": true 1936 | }, 1937 | "@esbuild/linux-ppc64": { 1938 | "version": "0.17.12", 1939 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.12.tgz", 1940 | "integrity": "sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==", 1941 | "dev": true, 1942 | "optional": true 1943 | }, 1944 | "@esbuild/linux-riscv64": { 1945 | "version": "0.17.12", 1946 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.12.tgz", 1947 | "integrity": "sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==", 1948 | "dev": true, 1949 | "optional": true 1950 | }, 1951 | "@esbuild/linux-s390x": { 1952 | "version": "0.17.12", 1953 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.12.tgz", 1954 | "integrity": "sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==", 1955 | "dev": true, 1956 | "optional": true 1957 | }, 1958 | "@esbuild/linux-x64": { 1959 | "version": "0.17.12", 1960 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.12.tgz", 1961 | "integrity": "sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==", 1962 | "dev": true, 1963 | "optional": true 1964 | }, 1965 | "@esbuild/netbsd-x64": { 1966 | "version": "0.17.12", 1967 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.12.tgz", 1968 | "integrity": "sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==", 1969 | "dev": true, 1970 | "optional": true 1971 | }, 1972 | "@esbuild/openbsd-x64": { 1973 | "version": "0.17.12", 1974 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.12.tgz", 1975 | "integrity": "sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==", 1976 | "dev": true, 1977 | "optional": true 1978 | }, 1979 | "@esbuild/sunos-x64": { 1980 | "version": "0.17.12", 1981 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.12.tgz", 1982 | "integrity": "sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==", 1983 | "dev": true, 1984 | "optional": true 1985 | }, 1986 | "@esbuild/win32-arm64": { 1987 | "version": "0.17.12", 1988 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.12.tgz", 1989 | "integrity": "sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==", 1990 | "dev": true, 1991 | "optional": true 1992 | }, 1993 | "@esbuild/win32-ia32": { 1994 | "version": "0.17.12", 1995 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.12.tgz", 1996 | "integrity": "sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==", 1997 | "dev": true, 1998 | "optional": true 1999 | }, 2000 | "@esbuild/win32-x64": { 2001 | "version": "0.17.12", 2002 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.12.tgz", 2003 | "integrity": "sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==", 2004 | "dev": true, 2005 | "optional": true 2006 | }, 2007 | "@fortawesome/fontawesome-common-types": { 2008 | "version": "6.3.0", 2009 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", 2010 | "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==" 2011 | }, 2012 | "@fortawesome/fontawesome-svg-core": { 2013 | "version": "6.3.0", 2014 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", 2015 | "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", 2016 | "requires": { 2017 | "@fortawesome/fontawesome-common-types": "6.3.0" 2018 | } 2019 | }, 2020 | "@fortawesome/free-solid-svg-icons": { 2021 | "version": "6.3.0", 2022 | "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", 2023 | "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", 2024 | "requires": { 2025 | "@fortawesome/fontawesome-common-types": "6.3.0" 2026 | } 2027 | }, 2028 | "@fortawesome/react-fontawesome": { 2029 | "version": "0.2.0", 2030 | "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", 2031 | "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", 2032 | "requires": { 2033 | "prop-types": "^15.8.1" 2034 | } 2035 | }, 2036 | "@jridgewell/gen-mapping": { 2037 | "version": "0.1.1", 2038 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 2039 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 2040 | "dev": true, 2041 | "requires": { 2042 | "@jridgewell/set-array": "^1.0.0", 2043 | "@jridgewell/sourcemap-codec": "^1.4.10" 2044 | } 2045 | }, 2046 | "@jridgewell/resolve-uri": { 2047 | "version": "3.1.0", 2048 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 2049 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 2050 | "dev": true 2051 | }, 2052 | "@jridgewell/set-array": { 2053 | "version": "1.1.2", 2054 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 2055 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 2056 | "dev": true 2057 | }, 2058 | "@jridgewell/sourcemap-codec": { 2059 | "version": "1.4.14", 2060 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 2061 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 2062 | "dev": true 2063 | }, 2064 | "@jridgewell/trace-mapping": { 2065 | "version": "0.3.17", 2066 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 2067 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 2068 | "dev": true, 2069 | "requires": { 2070 | "@jridgewell/resolve-uri": "3.1.0", 2071 | "@jridgewell/sourcemap-codec": "1.4.14" 2072 | } 2073 | }, 2074 | "@remix-run/router": { 2075 | "version": "1.5.0", 2076 | "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", 2077 | "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==" 2078 | }, 2079 | "@types/prop-types": { 2080 | "version": "15.7.5", 2081 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 2082 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 2083 | "dev": true 2084 | }, 2085 | "@types/react": { 2086 | "version": "18.0.28", 2087 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", 2088 | "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", 2089 | "dev": true, 2090 | "requires": { 2091 | "@types/prop-types": "*", 2092 | "@types/scheduler": "*", 2093 | "csstype": "^3.0.2" 2094 | } 2095 | }, 2096 | "@types/react-dom": { 2097 | "version": "18.0.11", 2098 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", 2099 | "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", 2100 | "dev": true, 2101 | "requires": { 2102 | "@types/react": "*" 2103 | } 2104 | }, 2105 | "@types/scheduler": { 2106 | "version": "0.16.3", 2107 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", 2108 | "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", 2109 | "dev": true 2110 | }, 2111 | "@vitejs/plugin-react": { 2112 | "version": "3.1.0", 2113 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", 2114 | "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", 2115 | "dev": true, 2116 | "requires": { 2117 | "@babel/core": "^7.20.12", 2118 | "@babel/plugin-transform-react-jsx-self": "^7.18.6", 2119 | "@babel/plugin-transform-react-jsx-source": "^7.19.6", 2120 | "magic-string": "^0.27.0", 2121 | "react-refresh": "^0.14.0" 2122 | } 2123 | }, 2124 | "ansi-styles": { 2125 | "version": "3.2.1", 2126 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2127 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2128 | "dev": true, 2129 | "requires": { 2130 | "color-convert": "^1.9.0" 2131 | } 2132 | }, 2133 | "browserslist": { 2134 | "version": "4.21.5", 2135 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 2136 | "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 2137 | "dev": true, 2138 | "requires": { 2139 | "caniuse-lite": "^1.0.30001449", 2140 | "electron-to-chromium": "^1.4.284", 2141 | "node-releases": "^2.0.8", 2142 | "update-browserslist-db": "^1.0.10" 2143 | } 2144 | }, 2145 | "caniuse-lite": { 2146 | "version": "1.0.30001469", 2147 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz", 2148 | "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==", 2149 | "dev": true 2150 | }, 2151 | "chalk": { 2152 | "version": "2.4.2", 2153 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2154 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2155 | "dev": true, 2156 | "requires": { 2157 | "ansi-styles": "^3.2.1", 2158 | "escape-string-regexp": "^1.0.5", 2159 | "supports-color": "^5.3.0" 2160 | } 2161 | }, 2162 | "color-convert": { 2163 | "version": "1.9.3", 2164 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2165 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2166 | "dev": true, 2167 | "requires": { 2168 | "color-name": "1.1.3" 2169 | } 2170 | }, 2171 | "color-name": { 2172 | "version": "1.1.3", 2173 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2174 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2175 | "dev": true 2176 | }, 2177 | "convert-source-map": { 2178 | "version": "1.9.0", 2179 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 2180 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 2181 | "dev": true 2182 | }, 2183 | "csstype": { 2184 | "version": "3.1.1", 2185 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 2186 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 2187 | "dev": true 2188 | }, 2189 | "debug": { 2190 | "version": "4.3.4", 2191 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2192 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2193 | "dev": true, 2194 | "requires": { 2195 | "ms": "2.1.2" 2196 | } 2197 | }, 2198 | "electron-to-chromium": { 2199 | "version": "1.4.337", 2200 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.337.tgz", 2201 | "integrity": "sha512-W8gdzXG86mVPoc56eM8YA+QiLxaAxJ8cmDjxZgfhLLWVvZQxyA918w5tX2JEWApZta45T1/sYcmFHTsTOUE3nw==", 2202 | "dev": true 2203 | }, 2204 | "esbuild": { 2205 | "version": "0.17.12", 2206 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.12.tgz", 2207 | "integrity": "sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==", 2208 | "dev": true, 2209 | "requires": { 2210 | "@esbuild/android-arm": "0.17.12", 2211 | "@esbuild/android-arm64": "0.17.12", 2212 | "@esbuild/android-x64": "0.17.12", 2213 | "@esbuild/darwin-arm64": "0.17.12", 2214 | "@esbuild/darwin-x64": "0.17.12", 2215 | "@esbuild/freebsd-arm64": "0.17.12", 2216 | "@esbuild/freebsd-x64": "0.17.12", 2217 | "@esbuild/linux-arm": "0.17.12", 2218 | "@esbuild/linux-arm64": "0.17.12", 2219 | "@esbuild/linux-ia32": "0.17.12", 2220 | "@esbuild/linux-loong64": "0.17.12", 2221 | "@esbuild/linux-mips64el": "0.17.12", 2222 | "@esbuild/linux-ppc64": "0.17.12", 2223 | "@esbuild/linux-riscv64": "0.17.12", 2224 | "@esbuild/linux-s390x": "0.17.12", 2225 | "@esbuild/linux-x64": "0.17.12", 2226 | "@esbuild/netbsd-x64": "0.17.12", 2227 | "@esbuild/openbsd-x64": "0.17.12", 2228 | "@esbuild/sunos-x64": "0.17.12", 2229 | "@esbuild/win32-arm64": "0.17.12", 2230 | "@esbuild/win32-ia32": "0.17.12", 2231 | "@esbuild/win32-x64": "0.17.12" 2232 | } 2233 | }, 2234 | "escalade": { 2235 | "version": "3.1.1", 2236 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2237 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2238 | "dev": true 2239 | }, 2240 | "escape-string-regexp": { 2241 | "version": "1.0.5", 2242 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2243 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2244 | "dev": true 2245 | }, 2246 | "fsevents": { 2247 | "version": "2.3.2", 2248 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2249 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2250 | "dev": true, 2251 | "optional": true 2252 | }, 2253 | "function-bind": { 2254 | "version": "1.1.1", 2255 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2256 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2257 | "dev": true 2258 | }, 2259 | "gensync": { 2260 | "version": "1.0.0-beta.2", 2261 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2262 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2263 | "dev": true 2264 | }, 2265 | "globals": { 2266 | "version": "11.12.0", 2267 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2268 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2269 | "dev": true 2270 | }, 2271 | "has": { 2272 | "version": "1.0.3", 2273 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2274 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2275 | "dev": true, 2276 | "requires": { 2277 | "function-bind": "^1.1.1" 2278 | } 2279 | }, 2280 | "has-flag": { 2281 | "version": "3.0.0", 2282 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2283 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2284 | "dev": true 2285 | }, 2286 | "immediate": { 2287 | "version": "3.0.6", 2288 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 2289 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 2290 | }, 2291 | "is-core-module": { 2292 | "version": "2.11.0", 2293 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2294 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2295 | "dev": true, 2296 | "requires": { 2297 | "has": "^1.0.3" 2298 | } 2299 | }, 2300 | "js-tokens": { 2301 | "version": "4.0.0", 2302 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2303 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2304 | }, 2305 | "jsesc": { 2306 | "version": "2.5.2", 2307 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2308 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2309 | "dev": true 2310 | }, 2311 | "json5": { 2312 | "version": "2.2.3", 2313 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2314 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2315 | "dev": true 2316 | }, 2317 | "lie": { 2318 | "version": "3.1.1", 2319 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 2320 | "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", 2321 | "requires": { 2322 | "immediate": "~3.0.5" 2323 | } 2324 | }, 2325 | "localforage": { 2326 | "version": "1.10.0", 2327 | "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", 2328 | "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", 2329 | "requires": { 2330 | "lie": "3.1.1" 2331 | } 2332 | }, 2333 | "loose-envify": { 2334 | "version": "1.4.0", 2335 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2336 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2337 | "requires": { 2338 | "js-tokens": "^3.0.0 || ^4.0.0" 2339 | } 2340 | }, 2341 | "lru-cache": { 2342 | "version": "5.1.1", 2343 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2344 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2345 | "dev": true, 2346 | "requires": { 2347 | "yallist": "^3.0.2" 2348 | } 2349 | }, 2350 | "magic-string": { 2351 | "version": "0.27.0", 2352 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 2353 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 2354 | "dev": true, 2355 | "requires": { 2356 | "@jridgewell/sourcemap-codec": "^1.4.13" 2357 | } 2358 | }, 2359 | "match-sorter": { 2360 | "version": "6.3.1", 2361 | "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", 2362 | "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", 2363 | "requires": { 2364 | "@babel/runtime": "^7.12.5", 2365 | "remove-accents": "0.4.2" 2366 | } 2367 | }, 2368 | "ms": { 2369 | "version": "2.1.2", 2370 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2371 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2372 | "dev": true 2373 | }, 2374 | "nanoid": { 2375 | "version": "3.3.4", 2376 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 2377 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 2378 | "dev": true 2379 | }, 2380 | "node-releases": { 2381 | "version": "2.0.10", 2382 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 2383 | "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 2384 | "dev": true 2385 | }, 2386 | "object-assign": { 2387 | "version": "4.1.1", 2388 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2389 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 2390 | }, 2391 | "object-path": { 2392 | "version": "0.6.0", 2393 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.6.0.tgz", 2394 | "integrity": "sha512-fxrwsCFi3/p+LeLOAwo/wyRMODZxdGBtUlWRzsEpsUVrisZbEfZ21arxLGfaWfcnqb8oHPNihIb4XPE8CQPN5A==" 2395 | }, 2396 | "path-parse": { 2397 | "version": "1.0.7", 2398 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2399 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2400 | "dev": true 2401 | }, 2402 | "picocolors": { 2403 | "version": "1.0.0", 2404 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2405 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2406 | "dev": true 2407 | }, 2408 | "postcss": { 2409 | "version": "8.4.21", 2410 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 2411 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 2412 | "dev": true, 2413 | "requires": { 2414 | "nanoid": "^3.3.4", 2415 | "picocolors": "^1.0.0", 2416 | "source-map-js": "^1.0.2" 2417 | } 2418 | }, 2419 | "prop-types": { 2420 | "version": "15.8.1", 2421 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2422 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2423 | "requires": { 2424 | "loose-envify": "^1.4.0", 2425 | "object-assign": "^4.1.1", 2426 | "react-is": "^16.13.1" 2427 | } 2428 | }, 2429 | "react": { 2430 | "version": "18.2.0", 2431 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 2432 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 2433 | "requires": { 2434 | "loose-envify": "^1.1.0" 2435 | } 2436 | }, 2437 | "react-dom": { 2438 | "version": "18.2.0", 2439 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 2440 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 2441 | "requires": { 2442 | "loose-envify": "^1.1.0", 2443 | "scheduler": "^0.23.0" 2444 | } 2445 | }, 2446 | "react-is": { 2447 | "version": "16.13.1", 2448 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2449 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2450 | }, 2451 | "react-refresh": { 2452 | "version": "0.14.0", 2453 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", 2454 | "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", 2455 | "dev": true 2456 | }, 2457 | "react-router": { 2458 | "version": "6.10.0", 2459 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", 2460 | "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", 2461 | "requires": { 2462 | "@remix-run/router": "1.5.0" 2463 | } 2464 | }, 2465 | "react-router-dom": { 2466 | "version": "6.10.0", 2467 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", 2468 | "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", 2469 | "requires": { 2470 | "@remix-run/router": "1.5.0", 2471 | "react-router": "6.10.0" 2472 | } 2473 | }, 2474 | "regenerator-runtime": { 2475 | "version": "0.13.11", 2476 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 2477 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 2478 | }, 2479 | "remove-accents": { 2480 | "version": "0.4.2", 2481 | "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", 2482 | "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" 2483 | }, 2484 | "resolve": { 2485 | "version": "1.22.1", 2486 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2487 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2488 | "dev": true, 2489 | "requires": { 2490 | "is-core-module": "^2.9.0", 2491 | "path-parse": "^1.0.7", 2492 | "supports-preserve-symlinks-flag": "^1.0.0" 2493 | } 2494 | }, 2495 | "rollup": { 2496 | "version": "3.20.1", 2497 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.1.tgz", 2498 | "integrity": "sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==", 2499 | "dev": true, 2500 | "requires": { 2501 | "fsevents": "~2.3.2" 2502 | } 2503 | }, 2504 | "scheduler": { 2505 | "version": "0.23.0", 2506 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 2507 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 2508 | "requires": { 2509 | "loose-envify": "^1.1.0" 2510 | } 2511 | }, 2512 | "semver": { 2513 | "version": "6.3.0", 2514 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2515 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2516 | "dev": true 2517 | }, 2518 | "sort-by": { 2519 | "version": "1.2.0", 2520 | "resolved": "https://registry.npmjs.org/sort-by/-/sort-by-1.2.0.tgz", 2521 | "integrity": "sha512-aRyW65r3xMnf4nxJRluCg0H/woJpksU1dQxRtXYzau30sNBOmf5HACpDd9MZDhKh7ALQ5FgSOfMPwZEtUmMqcg==", 2522 | "requires": { 2523 | "object-path": "0.6.0" 2524 | } 2525 | }, 2526 | "source-map-js": { 2527 | "version": "1.0.2", 2528 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2529 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2530 | "dev": true 2531 | }, 2532 | "supports-color": { 2533 | "version": "5.5.0", 2534 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2535 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2536 | "dev": true, 2537 | "requires": { 2538 | "has-flag": "^3.0.0" 2539 | } 2540 | }, 2541 | "supports-preserve-symlinks-flag": { 2542 | "version": "1.0.0", 2543 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2544 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2545 | "dev": true 2546 | }, 2547 | "to-fast-properties": { 2548 | "version": "2.0.0", 2549 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2550 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2551 | "dev": true 2552 | }, 2553 | "update-browserslist-db": { 2554 | "version": "1.0.10", 2555 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2556 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2557 | "dev": true, 2558 | "requires": { 2559 | "escalade": "^3.1.1", 2560 | "picocolors": "^1.0.0" 2561 | } 2562 | }, 2563 | "vite": { 2564 | "version": "4.2.1", 2565 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", 2566 | "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 2567 | "dev": true, 2568 | "requires": { 2569 | "esbuild": "^0.17.5", 2570 | "fsevents": "~2.3.2", 2571 | "postcss": "^8.4.21", 2572 | "resolve": "^1.22.1", 2573 | "rollup": "^3.18.0" 2574 | } 2575 | }, 2576 | "yallist": { 2577 | "version": "3.1.1", 2578 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2579 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2580 | "dev": true 2581 | } 2582 | } 2583 | } 2584 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ema-john-simple", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@fortawesome/fontawesome-svg-core": "^6.3.0", 13 | "@fortawesome/free-solid-svg-icons": "^6.3.0", 14 | "@fortawesome/react-fontawesome": "^0.2.0", 15 | "localforage": "^1.10.0", 16 | "match-sorter": "^6.3.1", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0", 19 | "react-router-dom": "^6.10.0", 20 | "sort-by": "^1.2.0" 21 | }, 22 | "devDependencies": { 23 | "@types/react": "^18.0.28", 24 | "@types/react-dom": "^18.0.11", 25 | "@vitejs/plugin-react": "^3.1.0", 26 | "vite": "^4.2.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProgrammingHero1/ema-john-simple-with-router-module-55/8d2dae1c2b6657a2bf913fa29b389a610b35be9f/public/favicon.ico -------------------------------------------------------------------------------- /public/products.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "124e13b9-2d54-4b2f-a74d-a77b362d6ead", 4 | "category": "Men's Sneaker", 5 | "name": "ULTRABOOST 22 SHOES", 6 | "seller": "Addidas", 7 | "price": 420, 8 | "stock": 20, 9 | "ratings": 4, 10 | "ratingsCount": 3725, 11 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/fbaf991a78bc4896a3e9ad7800abcec6_9366/Ultraboost_22_Shoes_Black_GZ0127_01_standard.jpg", 12 | "shipping": 1, 13 | "quantity": 0 14 | }, 15 | { 16 | "id": "13cbc7ed-a61b-4883-9d42-82d7d8642b86", 17 | "category": "Men's Sneaker", 18 | "name": "LUNAR NEW YEAR ULTRABOOST DNA SHOES", 19 | "seller": "Addidas", 20 | "price": 196, 21 | "stock": 19, 22 | "ratings": 5, 23 | "ratingsCount": 4355, 24 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/2cee64414e1f4f31baf1ae270099d950_9366/Lunar_New_Year_Ultraboost_DNA_Shoes_Black_GZ6074_01_standard.jpg", 25 | "shipping": 14, 26 | "quantity": 0 27 | }, 28 | { 29 | "id": "307f166f-1d04-4573-bc37-2f461ea9d4f7", 30 | "category": "Men's Sneaker", 31 | "name": "SUPERNOVA SHOES", 32 | "seller": "Addidas", 33 | "price": 245, 34 | "stock": 20, 35 | "ratings": 4, 36 | "ratingsCount": 3972, 37 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/69cbc73d0cb846889f89acbb011e68cb_9366/Supernova_Shoes_Black_S42722_01_standard.jpg", 38 | "shipping": 1, 39 | "quantity": 0 40 | }, 41 | { 42 | "id": "4bf9798f-63bc-4a83-b0c6-6a3b816fe922", 43 | "category": "Men's Sneaker", 44 | "name": "LITE RACER ADAPT 3.0 SHOES", 45 | "seller": "Addidas", 46 | "price": 229, 47 | "stock": 10, 48 | "ratings": 5, 49 | "ratingsCount": 1764, 50 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/96a5f085fedf4e678095abad01056711_9366/Lite_Racer_Adapt_3.0_Shoes_Black_FX8802_01_standard.jpg", 51 | "shipping": 32, 52 | "quantity": 0 53 | }, 54 | { 55 | "id": "9496d72b-04ec-41f8-9bc3-0a7c9697be8e", 56 | "category": "Men's Sneaker", 57 | "name": "4DFWD SHOES", 58 | "seller": "Addidas", 59 | "price": 287, 60 | "stock": 11, 61 | "ratings": 4, 62 | "ratingsCount": 799, 63 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/8c5d1994dfd343e28567ad4400dd351d_9366/4DFWD_Shoes_Black_Q46447_01_standard.jpg", 64 | "shipping": 49, 65 | "quantity": 0 66 | }, 67 | { 68 | "id": "6e5593d3-557b-43cf-8dab-a5140faedfb0", 69 | "category": "Men's Sneaker", 70 | "name": "KAPTIR 2.0 SHOES", 71 | "seller": "Addidas", 72 | "price": 138, 73 | "stock": 19, 74 | "ratings": 3, 75 | "ratingsCount": 4372, 76 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0846e90b15144861b33dacf500e3cfd1_9366/Kaptir_2.0_Shoes_White_H00276_01_standard.jpg", 77 | "shipping": 19, 78 | "quantity": 0 79 | }, 80 | { 81 | "id": "9c0c13c2-54e4-4001-809b-afbd9d84037d", 82 | "category": "Men's Sneaker", 83 | "name": "4DFWD PULSE SHOES", 84 | "seller": "Addidas", 85 | "price": 226, 86 | "stock": 1, 87 | "ratings": 4, 88 | "ratingsCount": 2870, 89 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9a8256bb7ca34da49ff8ad5600bb2812_9366/4DFWD_Pulse_Shoes_White_Q46221_01_standard.jpg", 90 | "shipping": 15, 91 | "quantity": 0 92 | }, 93 | { 94 | "id": "c9d1f410-d28f-49d9-9b01-d759b5acbeea", 95 | "category": "Men's Sneaker", 96 | "name": "ZX 1K BOOST SHOES", 97 | "seller": "Addidas", 98 | "price": 319, 99 | "stock": 7, 100 | "ratings": 4, 101 | "ratingsCount": 1360, 102 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0e540bae86d5456aa034ada300ebf46c_9366/ZX_1K_Boost_Shoes_Grey_H00430_01_standard.jpg", 103 | "shipping": 50, 104 | "quantity": 0 105 | }, 106 | { 107 | "id": "1564a06b-692f-4f2e-8413-9c8a1cc2da77", 108 | "category": "Men's Sneaker", 109 | "name": "NMD_R1 V2 SHOES", 110 | "seller": "Addidas", 111 | "price": 260, 112 | "stock": 4, 113 | "ratings": 5, 114 | "ratingsCount": 1976, 115 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c2a18c4e3f104d52a697ad6a01477bb7_9366/NMD_R1_V2_Shoes_Black_GX6367_01_standard.jpg", 116 | "shipping": 46, 117 | "quantity": 0 118 | }, 119 | { 120 | "id": "ac44095f-230e-4502-8816-dea3eaae8320", 121 | "category": "Men's Sneaker", 122 | "name": "NMD_R1 PRIMEBLUE SHOES", 123 | "seller": "Addidas", 124 | "price": 437, 125 | "stock": 1, 126 | "ratings": 4, 127 | "ratingsCount": 565, 128 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0e03e7a2a9cb44dfac2bad6a00f95888_9366/NMD_R1_Primeblue_Shoes_White_GZ9261_01_standard.jpg", 129 | "shipping": 36, 130 | "quantity": 0 131 | }, 132 | { 133 | "id": "d0803f97-966f-4296-ad31-a7f70fc86fab", 134 | "category": "Men's Pants", 135 | "name": "TIRO TRACK PANTS", 136 | "seller": "Addidas", 137 | "price": 146, 138 | "stock": 15, 139 | "ratings": 5, 140 | "ratingsCount": 3702, 141 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 142 | "shipping": 29, 143 | "quantity": 0 144 | }, 145 | { 146 | "id": "8a5b4a9c-76ea-4fbb-9c70-9548de4eab01", 147 | "category": "Men's Pants", 148 | "name": "TIRO 21 TRACK PANTS", 149 | "seller": "Addidas", 150 | "price": 109, 151 | "stock": 6, 152 | "ratings": 5, 153 | "ratingsCount": 1688, 154 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 155 | "shipping": 48, 156 | "quantity": 0 157 | }, 158 | { 159 | "id": "b357e19b-4dd9-4fc7-b5c0-9ed5255464ba", 160 | "category": "Men's Pants", 161 | "name": "PRIMEBLUE SST TRACK PANTS", 162 | "seller": "Addidas", 163 | "price": 63, 164 | "stock": 46, 165 | "ratings": 4, 166 | "ratingsCount": 50, 167 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/52b5fde5829a4a04820dacf50127b969_9366/Adicolor_Classics_Primeblue_SST_Track_Pants_Blue_H06714_21_model.jpg", 168 | "shipping": 20, 169 | "quantity": 0 170 | }, 171 | { 172 | "id": "e4220958-06d2-4d50-96fa-0163a563f43d", 173 | "category": "Men's Pants", 174 | "name": "TIRO 21 TRACK PANTS", 175 | "seller": "Addidas", 176 | "price": 148, 177 | "stock": 41, 178 | "ratings": 3, 179 | "ratingsCount": 4483, 180 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 181 | "shipping": 8, 182 | "quantity": 0 183 | }, 184 | { 185 | "id": "ae69f0e4-559c-4b24-8032-80b63f9b5073", 186 | "category": "Men's Pants", 187 | "name": "TIRO TRACK PANTS RED", 188 | "seller": "Addidas", 189 | "price": 122, 190 | "stock": 43, 191 | "ratings": 4, 192 | "ratingsCount": 1239, 193 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 194 | "shipping": 27, 195 | "quantity": 0 196 | }, 197 | { 198 | "id": "dbf7ab3f-b383-4d95-8ab7-f55fcf6fa5f2", 199 | "category": "Men's Pants", 200 | "name": "TIRO PANTS BLACK GOLD", 201 | "seller": "Addidas", 202 | "price": 115, 203 | "stock": 26, 204 | "ratings": 5, 205 | "ratingsCount": 4557, 206 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c447324cf06544b78105ade500fd9e2f_9366/Tiro_Pants_Black_HI1073_21_model.jpg", 207 | "shipping": 33, 208 | "quantity": 0 209 | }, 210 | { 211 | "id": "ed6a7ac3-7e67-4e3f-8461-bceb5178be42", 212 | "category": "Men's Pants", 213 | "name": "TAPERED-CUFF 3-STRIPES PANTS", 214 | "seller": "Addidas", 215 | "price": 108, 216 | "stock": 5, 217 | "ratings": 3, 218 | "ratingsCount": 3383, 219 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 220 | "shipping": 26, 221 | "quantity": 0 222 | }, 223 | { 224 | "id": "fd52819a-cb78-4510-ad2f-c5bdd888ae78", 225 | "category": "Men's Pants", 226 | "name": "FRENCH TERRY TAPERED CUFF LOGO PANTS", 227 | "seller": "Addidas", 228 | "price": 189, 229 | "stock": 27, 230 | "ratings": 3, 231 | "ratingsCount": 1974, 232 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/d47f8bc94b2c401b9eafad23007fd8c4_9366/Primegreen_Essentials_Warm-Up_Open_Hem_3-Stripes_Track_Pants_Black_H48430_21_model.jpg", 233 | "shipping": 20, 234 | "quantity": 0 235 | }, 236 | { 237 | "id": "c667d3ff-41eb-4cf7-a433-819d959ea768", 238 | "category": "Men's Pants", 239 | "name": "OPEN HEM 3-STRIPES TRACK PANTS", 240 | "seller": "Addidas", 241 | "price": 58, 242 | "stock": 41, 243 | "ratings": 5, 244 | "ratingsCount": 2140, 245 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/d47f8bc94b2c401b9eafad23007fd8c4_9366/Primegreen_Essentials_Warm-Up_Open_Hem_3-Stripes_Track_Pants_Black_H48430_21_model.jpg", 246 | "shipping": 49, 247 | "quantity": 0 248 | }, 249 | { 250 | "id": "e1dbc7fe-be17-4e0f-9e2d-6ad5dbc102fc", 251 | "category": "Men's Pants", 252 | "name": "ESSENTIALS4GAMEDAY PANTS", 253 | "seller": "Addidas", 254 | "price": 185, 255 | "stock": 43, 256 | "ratings": 5, 257 | "ratingsCount": 2676, 258 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/64f1ba254925439d88eaad920127d77e_9366/Essentials4Gameday_Pants_Black_HE1800_21_model.jpg", 259 | "shipping": 27, 260 | "quantity": 0 261 | }, 262 | { 263 | "id": "0298e695-1f9b-49b1-9961-8a8460f95b1c", 264 | "category": "Men's Boot", 265 | "name": "TERREX FREE HIKER GORE-TEX HIKING SHOES", 266 | "seller": "Addidas", 267 | "price": 132, 268 | "stock": 1, 269 | "ratings": 3, 270 | "ratingsCount": 128, 271 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/12cf12ac1c8e484ea487ad6400ee3444_9366/Terrex_Free_Hiker_Gore-Tex_Hiking_Shoes_Black_GZ0355_01_standard.jpg", 272 | "shipping": 13, 273 | "quantity": 0 274 | }, 275 | { 276 | "id": "3cfe9adc-c27f-4be4-a859-a5c98ce88a27", 277 | "category": "Men's Boot", 278 | "name": "TERREX AX4 MID GORE-TEX HIKING SHOES", 279 | "seller": "Addidas", 280 | "price": 111, 281 | "stock": 19, 282 | "ratings": 4, 283 | "ratingsCount": 894, 284 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/dfa8c9a7d2864065b27fad7400b2e05e_9366/Terrex_AX4_Mid_GORE-TEX_Hiking_shoes_Black_FY9638_01_standard.jpg", 285 | "shipping": 27, 286 | "quantity": 0 287 | }, 288 | { 289 | "id": "6602468a-a3a8-4c2c-9d3a-fd54e2c5daf7", 290 | "category": "Men's Boot", 291 | "name": "RESPONSE 3MC ADV BOOTS", 292 | "seller": "Addidas", 293 | "price": 104, 294 | "stock": 6, 295 | "ratings": 5, 296 | "ratingsCount": 354, 297 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/b513f2cec8b440978d60ab6d014ad452_9366/Response_3MC_ADV_Boots_Black_EG9391_01_standard.jpg", 298 | "shipping": 26, 299 | "quantity": 0 300 | }, 301 | { 302 | "id": "5db3ee2f-2eb7-4764-942d-894f72198e86", 303 | "category": "Men's Boot", 304 | "name": "TACTICAL LEXICON ADV BOOTS", 305 | "seller": "Addidas", 306 | "price": 151, 307 | "stock": 3, 308 | "ratings": 4, 309 | "ratingsCount": 584, 310 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/f5350f3d583c46038534ab6d01445e2a_9366/Tactical_Lexicon_ADV_Boots_Grey_EG9386_01_standard.jpg", 311 | "shipping": 33, 312 | "quantity": 0 313 | }, 314 | { 315 | "id": "9b169efb-0966-40f3-b9c2-79b16cb96388", 316 | "category": "Men's Boot", 317 | "name": "Superstar Boots", 318 | "seller": "Addidas", 319 | "price": 151, 320 | "stock": 13, 321 | "ratings": 3, 322 | "ratingsCount": 1010, 323 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/6853ac5565a9407bae19ac080120d9d7_9366/Superstar_Boots_Red_FZ2642_01_standard.jpg", 324 | "shipping": 4, 325 | "quantity": 0 326 | }, 327 | { 328 | "id": "fb1f9913-d903-498c-9e4a-16d363aa2eba", 329 | "category": "Men's Boot", 330 | "name": "TACTICAL LEXICON ADV BOOTS", 331 | "seller": "Addidas", 332 | "price": 199, 333 | "stock": 14, 334 | "ratings": 4, 335 | "ratingsCount": 2422, 336 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/3a819de9f29c498fae13ab6d01473c4d_9366/Tactical_Lexicon_ADV_Boots_White_EG9385_01_standard.jpg", 337 | "shipping": 39, 338 | "quantity": 0 339 | }, 340 | { 341 | "id": "fe48e340-4dc9-44b3-911b-9308b4f530b3", 342 | "category": "Men's Boot", 343 | "name": "TERREX TRAILMAKER MID COLD.RDY HIKING SHOES", 344 | "seller": "Addidas", 345 | "price": 110, 346 | "stock": 16, 347 | "ratings": 3, 348 | "ratingsCount": 1533, 349 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c2ee4c27eba64258bcbaad5100e5d998_9366/Terrex_Trailmaker_Mid_COLD.RDY_Hiking_Shoes_Brown_FZ3370_01_standard.jpg", 350 | "shipping": 33, 351 | "quantity": 0 352 | }, 353 | { 354 | "id": "2e06fa90-2961-4867-8322-6fdcca2f086a", 355 | "category": "Men's Boot", 356 | "name": "TERREX FREE HIKER GORE-TEX HIKING SHOES", 357 | "seller": "Addidas", 358 | "price": 155, 359 | "stock": 4, 360 | "ratings": 5, 361 | "ratingsCount": 1351, 362 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/efbedb26b92e4affa103ad6b008a789a_9366/Terrex_Free_Hiker_Gore-Tex_Hiking_Shoes_Grey_GZ0356_01_standard.jpg", 363 | "shipping": 38, 364 | "quantity": 0 365 | }, 366 | { 367 | "id": "008c06dd-04e4-4923-b840-927bd6b4c2de", 368 | "category": "Men's Boot", 369 | "name": "TERREX AGRAVIC TECH PRO TRAIL RUNNING SHOES", 370 | "seller": "Addidas", 371 | "price": 118, 372 | "stock": 8, 373 | "ratings": 3, 374 | "ratingsCount": 1798, 375 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0a340319370844e99645abc90091df96_9366/Terrex_Agravic_Tech_Pro_Trail_Running_Shoes_Black_FU7634_01_standard.jpg", 376 | "shipping": 37, 377 | "quantity": 0 378 | }, 379 | { 380 | "id": "b4d83415-d20a-4bba-8629-22b2780b6e93", 381 | "category": "Men's Boot", 382 | "name": "TERREX FREE HIKER COLD.RDY HIKING BOOTS", 383 | "seller": "Addidas", 384 | "price": 169, 385 | "stock": 17, 386 | "ratings": 5, 387 | "ratingsCount": 2833, 388 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/2ded0bee28b249bbb19cad5000818b77_9366/Terrex_Free_Hiker_COLD.RDY_Hiking_Boots_Black_FZ3364_01_standard.jpg", 389 | "shipping": 10, 390 | "quantity": 0 391 | }, 392 | { 393 | "id": "1d54fd83-83df-42f8-ae2b-f5ef9d4987ea", 394 | "category": "Men's Sneaker", 395 | "name": "MOVE FEELREADY SPORT TEE", 396 | "seller": "Addidas", 397 | "price": 14, 398 | "stock": 19, 399 | "ratings": 3, 400 | "ratingsCount": 4041, 401 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/ec81fbd781fe4aa3a8cead230019c192_9366/AEROREADY_Designed_2_Move_Feelready_Sport_Tee_Burgundy_H30268_21_model.jpg", 402 | "shipping": 5, 403 | "quantity": 0 404 | }, 405 | { 406 | "id": "1ce97e0e-3611-4406-8788-7b413640f59e", 407 | "category": "Men's Sneaker", 408 | "name": "ADIDAS CAMO BOX GRAPHIC TEE", 409 | "seller": "Addidas", 410 | "price": 16, 411 | "stock": 10, 412 | "ratings": 3, 413 | "ratingsCount": 4505, 414 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/809d5f06a7c74e93aef3ad08017c415a_9366/adidas_Camo_Box_Graphic_Tee_Grey_HB4828_21_model.jpg", 415 | "shipping": 11, 416 | "quantity": 0 417 | }, 418 | { 419 | "id": "f088beb8-d664-4166-99f8-6995c2f08465", 420 | "category": "Men's Sneaker", 421 | "name": "ADICOLOR CLASSICS TREFOIL TEE", 422 | "seller": "Addidas", 423 | "price": 20, 424 | "stock": 12, 425 | "ratings": 4, 426 | "ratingsCount": 41, 427 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/de7b5dc9e5a341b9bf5aad570106ba06_9366/Adicolor_Classics_Trefoil_Tee_Burgundy_H06641_21_model.jpg", 428 | "shipping": 38, 429 | "quantity": 0 430 | }, 431 | { 432 | "id": "26dd7da8-c854-4bab-aaf5-32cc964da2ec", 433 | "category": "Men's Sneaker", 434 | "name": "LNY TREFOIL FILL TEE", 435 | "seller": "Addidas", 436 | "price": 16, 437 | "stock": 17, 438 | "ratings": 4, 439 | "ratingsCount": 4985, 440 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 441 | "shipping": 35, 442 | "quantity": 0 443 | }, 444 | { 445 | "id": "a2615943-7eeb-4d6a-ab1b-78fb51ce39da", 446 | "category": "Men's Sneaker", 447 | "name": "CREATOR 365 TEE", 448 | "seller": "Addidas", 449 | "price": 34, 450 | "stock": 20, 451 | "ratings": 3, 452 | "ratingsCount": 4727, 453 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 454 | "shipping": 2, 455 | "quantity": 0 456 | }, 457 | { 458 | "id": "27cf3efa-7352-4889-85c4-44a4de2aa93a", 459 | "category": "Men's Sneaker", 460 | "name": "OWN THE RUN LONG SLEEVE TEE", 461 | "seller": "Addidas", 462 | "price": 23, 463 | "stock": 17, 464 | "ratings": 3, 465 | "ratingsCount": 4003, 466 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c6a321b7bb7243d28fe9ac71011393c7_9366/Own_the_Run_Long_Sleeve_Tee_Black_GJ9977_21_model.jpg", 467 | "shipping": 2, 468 | "quantity": 0 469 | }, 470 | { 471 | "id": "6add9d60-1339-4115-b2ac-00d4886f4ad7", 472 | "category": "Men's Sneaker", 473 | "name": "NYC BADGE OF SPORT LOGO GRAPHIC TEE", 474 | "seller": "Addidas", 475 | "price": 29, 476 | "stock": 6, 477 | "ratings": 3, 478 | "ratingsCount": 805, 479 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/e0101e13ac1940208478add1000e953a_9366/NYC_Badge_of_Sport_Logo_Graphic_Tee_White_HE2363_21_model.jpg", 480 | "shipping": 6, 481 | "quantity": 0 482 | }, 483 | { 484 | "id": "1b6f1af1-2103-4838-932d-2b98dfdb6c1f", 485 | "category": "Men's Sneaker", 486 | "name": "RUNNER TEE", 487 | "seller": "Addidas", 488 | "price": 20, 489 | "stock": 7, 490 | "ratings": 5, 491 | "ratingsCount": 3343, 492 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/8c3f5445517340e8bc02ad8100ffd3f6_9366/Runner_Tee_Burgundy_H25050_21_model.jpg", 493 | "shipping": 48, 494 | "quantity": 0 495 | }, 496 | { 497 | "id": "c6cb80a7-3542-4270-bd2b-920efd5f3f85", 498 | "category": "Men's Sneaker", 499 | "name": "V-DAY TEE (GENDER NEUTRAL)", 500 | "seller": "Addidas", 501 | "price": 18, 502 | "stock": 2, 503 | "ratings": 4, 504 | "ratingsCount": 1590, 505 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 506 | "shipping": 13, 507 | "quantity": 0 508 | }, 509 | { 510 | "id": "f54a4763-b8c2-4922-ba8d-80652a64f5bc", 511 | "category": "Men's Sneaker", 512 | "name": "ESSENTIALS COLORBLOCK TEE", 513 | "seller": "Addidas", 514 | "price": 35, 515 | "stock": 6, 516 | "ratings": 3, 517 | "ratingsCount": 2680, 518 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9889d39ac10243a2bb0fad1a0097ef07_9366/Essentials_Colorblock_Tee_Black_H14627_21_model.jpg", 519 | "shipping": 39, 520 | "quantity": 0 521 | }, 522 | { 523 | "id": "4a0090e7-b65d-4f6e-a42b-5603a3f51883", 524 | "category": "Bag", 525 | "name": "3-Stripes Backpack 2.0", 526 | "seller": "Addidas", 527 | "price": 74, 528 | "stock": 7, 529 | "ratings": 5, 530 | "ratingsCount": 365, 531 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/ba79ccb861fd4fd49e3aac9f006a6407_9366/3-Stripes_Backpack_2.0_Grey_EX6735_01_standard.jpg", 532 | "shipping": 23, 533 | "quantity": 0 534 | }, 535 | { 536 | "id": "0ac76ee7-53f1-45ba-b5ca-81ff6063bc1a", 537 | "category": "Bag", 538 | "name": "Trefoil Backpack", 539 | "seller": "Addidas", 540 | "price": 65, 541 | "stock": 3, 542 | "ratings": 4, 543 | "ratingsCount": 465, 544 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a520df1b51384c00af9caca100489f04_9366/Trefoil_Backpack_Black_EX6752_01_standard.jpg", 545 | "shipping": 36, 546 | "quantity": 0 547 | }, 548 | { 549 | "id": "1770549a-571b-4baf-bc58-7bae7a228dcb", 550 | "category": "Bag", 551 | "name": "Santiago Lunch Bag", 552 | "seller": "Addidas", 553 | "price": 63, 554 | "stock": 10, 555 | "ratings": 3, 556 | "ratingsCount": 346, 557 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c2aaf5e8a7924f1d9277ac9f005b5f37_9366/Santiago_Lunch_Bag_Black_EX6532_01_standard.jpg", 558 | "shipping": 42, 559 | "quantity": 0 560 | }, 561 | { 562 | "id": "24b20ba6-9024-4b0a-b8a9-cf937521cede", 563 | "category": "Bag", 564 | "name": "Blue Version Backpack", 565 | "seller": "Addidas", 566 | "price": 87, 567 | "stock": 15, 568 | "ratings": 5, 569 | "ratingsCount": 234, 570 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a9e0c5635057425daab5ad0b0089194b_9366/Blue_Version_Backpack_Black_H22735_01_standard.jpg", 571 | "shipping": 21, 572 | "quantity": 0 573 | }, 574 | { 575 | "id": "a7231186-0316-4cc0-94bf-4f496a382346", 576 | "category": "Bag", 577 | "name": "Defender Backpack", 578 | "seller": "Addidas", 579 | "price": 96, 580 | "stock": 10, 581 | "ratings": 4, 582 | "ratingsCount": 241, 583 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/d6ee0177281f42f0a254acb1016aa051_9366/Defender_Backpack_Red_EX7011_01_standard.jpg", 584 | "shipping": 15, 585 | "quantity": 0 586 | }, 587 | { 588 | "id": "35ac57f9-870a-4299-aac8-e5d8d2716b31", 589 | "category": "Bag", 590 | "name": "Excel Backpack", 591 | "seller": "Addidas", 592 | "price": 62, 593 | "stock": 18, 594 | "ratings": 5, 595 | "ratingsCount": 168, 596 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/ac09bb56249b43158485aca1007cc1ef_9366/Excel_Backpack_Black_EX6933_01_standard.jpg", 597 | "shipping": 14, 598 | "quantity": 0 599 | }, 600 | { 601 | "id": "c50bebaf-2633-4674-aba2-25be34bfdbba", 602 | "category": "Bag", 603 | "name": "Alliance Sackpack", 604 | "seller": "Addidas", 605 | "price": 99, 606 | "stock": 16, 607 | "ratings": 3, 608 | "ratingsCount": 311, 609 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/2e8a6f09838d49c3b00fad4f0017f753_9366/Alliance_Sackpack_White_FZ6823_01_standard.jpg", 610 | "shipping": 40, 611 | "quantity": 0 612 | }, 613 | { 614 | "id": "ff5bf372-7ed1-4904-aac5-7a2ce98e70ef", 615 | "category": "Bag", 616 | "name": "R.Y.V. Toploader Backpack", 617 | "seller": "Addidas", 618 | "price": 56, 619 | "stock": 19, 620 | "ratings": 3, 621 | "ratingsCount": 471, 622 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1c87c940836e4628852bad130101e5c6_9366/R.Y.V._Toploader_Backpack_Black_H32458_01_standard.jpg", 623 | "shipping": 20, 624 | "quantity": 0 625 | }, 626 | { 627 | "id": "83ef9902-0224-48d3-ba7c-eeff3e678d13", 628 | "category": "Bag", 629 | "name": "Adicolor Archive Backpack", 630 | "seller": "Addidas", 631 | "price": 84, 632 | "stock": 5, 633 | "ratings": 4, 634 | "ratingsCount": 445, 635 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0bb325f9cc174ea4bed7ad9e0101b682_9366/Adicolor_Archive_Backpack_Green_HE9804_01_standard.jpg", 636 | "shipping": 19, 637 | "quantity": 0 638 | }, 639 | { 640 | "id": "7490b4c8-8242-4de5-b161-b8ac96ea0e0b", 641 | "category": "Bag", 642 | "name": "R.Y.V. Backpack", 643 | "seller": "Addidas", 644 | "price": 67, 645 | "stock": 10, 646 | "ratings": 5, 647 | "ratingsCount": 83, 648 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/dc7dca21df62473ea518ade101251809_9366/R.Y.V._Backpack_Black_HD9650_01_standard.jpg", 649 | "shipping": 24, 650 | "quantity": 0 651 | }, 652 | { 653 | "id": "b1872b25-ba91-48ed-9468-1822df0637b9", 654 | "category": "Cap", 655 | "name": "Relaxed Strap-Back Hat", 656 | "seller": "Addidas", 657 | "price": 30, 658 | "stock": 6, 659 | "ratings": 4, 660 | "ratingsCount": 4, 661 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/4feb20f4d990407cb4f1a88a0040b212_9366/Relaxed_Strap-Back_Hat_Black_BH7137_01_standard.jpg", 662 | "shipping": 1, 663 | "quantity": 0 664 | }, 665 | { 666 | "id": "ea028038-4e9d-42bf-b033-88aa5e6cc477", 667 | "category": "Cap", 668 | "name": "Icon Snapback Hat", 669 | "seller": "Addidas", 670 | "price": 21, 671 | "stock": 13, 672 | "ratings": 4, 673 | "ratingsCount": 1, 674 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1e27ae8bbfb647489261ac8e015d181f_9366/Icon_Snapback_Hat_Grey_EX6798_01_standard.jpg", 675 | "shipping": 26, 676 | "quantity": 0 677 | }, 678 | { 679 | "id": "d48e0fcb-904c-499e-93a0-312d77e6dbf9", 680 | "category": "Cap", 681 | "name": "Superlite Hat", 682 | "seller": "Addidas", 683 | "price": 11, 684 | "stock": 18, 685 | "ratings": 3, 686 | "ratingsCount": 39, 687 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0ae141db6fce44999337ac8e015954ea_9366/Superlite_Hat_Grey_EX7054_01_standard.jpg", 688 | "shipping": 32, 689 | "quantity": 0 690 | }, 691 | { 692 | "id": "71dfc7f9-844b-4be7-816f-891a5cbaa0f1", 693 | "category": "Cap", 694 | "name": "Superlite Hat", 695 | "seller": "Addidas", 696 | "price": 10, 697 | "stock": 10, 698 | "ratings": 5, 699 | "ratingsCount": 47, 700 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/272d5d9cb7b74415a6c9ac8e015a4ccc_9366/Superlite_Hat_Black_EX7048_01_standard.jpg", 701 | "shipping": 24, 702 | "quantity": 0 703 | }, 704 | { 705 | "id": "a9d89eac-7418-4bca-a484-c8238c356270", 706 | "category": "Cap", 707 | "name": "Tee Time 5-Panel Hat", 708 | "seller": "Addidas", 709 | "price": 24, 710 | "stock": 1, 711 | "ratings": 4, 712 | "ratingsCount": 14, 713 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/df67ab60b5574c368b76adf9010f2d2d_9366/Tee_Time_5-Panel_Hat_Black_HA9254_01_standard.jpg", 714 | "shipping": 48, 715 | "quantity": 0 716 | }, 717 | { 718 | "id": "f6a5e6c0-5aec-4f10-84d7-bde9b6199045", 719 | "category": "Cap", 720 | "name": "Baseball Cap", 721 | "seller": "Addidas", 722 | "price": 17, 723 | "stock": 7, 724 | "ratings": 5, 725 | "ratingsCount": 37, 726 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0ce5f49aa0914deabf16adc600d09e60_9366/Baseball_Cap_Black_HD7039_01_standard.jpg", 727 | "shipping": 48, 728 | "quantity": 0 729 | }, 730 | { 731 | "id": "625b4b60-611c-490c-ac0a-f3c2d2afd05c", 732 | "category": "Cap", 733 | "name": "Relaxed Strap-Back Hat", 734 | "seller": "Addidas", 735 | "price": 24, 736 | "stock": 9, 737 | "ratings": 5, 738 | "ratingsCount": 15, 739 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/aaa5ae549c624178bc25a740012dd61f_9366/Relaxed_Strap-Back_Hat_White_BH7135_01_standard.jpg", 740 | "shipping": 6, 741 | "quantity": 0 742 | }, 743 | { 744 | "id": "5960bf40-9603-4a39-9ff6-6cf9f1ce4815", 745 | "category": "Cap", 746 | "name": "UNISEX ORIGINALS WASHED BUCKET", 747 | "seller": "Addidas", 748 | "price": 27, 749 | "stock": 14, 750 | "ratings": 4, 751 | "ratingsCount": 3, 752 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/e1e758585df14bbbb7d8aaf000c95bd7_9366/UNISEX_ORIGINALS_WASHED_BUCKET_White_CM3933_01_standard.jpg", 753 | "shipping": 14, 754 | "quantity": 0 755 | }, 756 | { 757 | "id": "5991add1-f4ba-4fb9-9b6b-ec59aa2dda60", 758 | "category": "Cap", 759 | "name": "SST Plus Strap-Back Hat", 760 | "seller": "Addidas", 761 | "price": 23, 762 | "stock": 14, 763 | "ratings": 4, 764 | "ratingsCount": 32, 765 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/92e77a8d84d845d19171ad50003f2ea1_9366/SST_Plus_Strap-Back_Hat_White_FZ8569_01_standard.jpg", 766 | "shipping": 47, 767 | "quantity": 0 768 | }, 769 | { 770 | "id": "5690e579-a943-4b42-9ffe-dfc65b71c560", 771 | "category": "Cap", 772 | "name": "Dispatch Trucker Hat", 773 | "seller": "Addidas", 774 | "price": 28, 775 | "stock": 16, 776 | "ratings": 4, 777 | "ratingsCount": 30, 778 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c3981523051c4a978674ad3c01015664_9366/Dispatch_Trucker_Hat_Black_EY5534_01_standard.jpg", 779 | "shipping": 14, 780 | "quantity": 0 781 | }, 782 | { 783 | "id": "be7a4d0a-c681-416c-ab8d-f9be28223f4e", 784 | "category": "Earphones", 785 | "name": "adidas Z.N.E. 01 True Wireless Earbuds", 786 | "seller": "Addidas", 787 | "price": 142, 788 | "stock": 11, 789 | "ratings": 5, 790 | "ratingsCount": 22, 791 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/00276c6c380b41bcb29fadcc00f98312_9366/adidas_Z.N.E._01_True_Wireless_Earbuds_Grey_EY5116_42_detail.jpg", 792 | "shipping": 23, 793 | "quantity": 0 794 | }, 795 | { 796 | "id": "b278e667-ca17-465c-b603-af1af4319b7b", 797 | "category": "Earphones", 798 | "name": "adidas Z.N.E. 01 ANC True Wireless Earbuds", 799 | "seller": "Addidas", 800 | "price": 135, 801 | "stock": 16, 802 | "ratings": 5, 803 | "ratingsCount": 51, 804 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/b322cdef8e654551ace9adcc00f963ed_9366/adidas_Z.N.E._01_ANC_True_Wireless_Earbuds_Grey_EY5114_41_detail.jpg", 805 | "shipping": 30, 806 | "quantity": 0 807 | }, 808 | { 809 | "id": "1f56c0e5-4407-44bf-9225-90f592d2924a", 810 | "category": "Earphones", 811 | "name": "FWD-01 Sport In-Ear Headphones", 812 | "seller": "Addidas", 813 | "price": 185, 814 | "stock": 8, 815 | "ratings": 4, 816 | "ratingsCount": 66, 817 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/2cdb8652aa2340369ba2aa79010062d1_9366/FWD-01_Sport_In-Ear_Headphones_Black_CM5016_01_standard.jpg", 818 | "shipping": 15, 819 | "quantity": 0 820 | }, 821 | { 822 | "id": "4ead4708-68e8-4a93-b28e-5e99ccc4d75c", 823 | "category": "Earphones", 824 | "name": "adidas FWD-02 Sport True Wireless Earbuds", 825 | "seller": "Addidas", 826 | "price": 162, 827 | "stock": 14, 828 | "ratings": 4, 829 | "ratingsCount": 6, 830 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/523731a02e914d318cb4adcc00f985ba_9366/adidas_FWD-02_Sport_True_Wireless_Earbuds_Grey_EY5113_03_standard_hover.jpg", 831 | "shipping": 29, 832 | "quantity": 0 833 | }, 834 | { 835 | "id": "d1116075-10f2-49c4-985e-0d41e19ce1b3", 836 | "category": "Earphones", 837 | "name": "adidas Z.N.E. 01 ANC True Wireless Earbuds", 838 | "seller": "Addidas", 839 | "price": 110, 840 | "stock": 15, 841 | "ratings": 5, 842 | "ratingsCount": 9, 843 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/9e6e7967b3b24ef298f5adcc00f983ec_9366/adidas_Z.N.E._01_ANC_True_Wireless_Earbuds_Grey_EY5115_41_detail.jpg", 844 | "shipping": 48, 845 | "quantity": 0 846 | }, 847 | { 848 | "id": "d1116075-10f2-49c4-985e-fg41e19dc1b8", 849 | "category": "Earphones", 850 | "name": "RPT-01 Sport On-Ear Headphones", 851 | "seller": "Addidas", 852 | "price": 170, 853 | "stock": 15, 854 | "ratings": 5, 855 | "ratingsCount": 55, 856 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c697ceddb0c2469aaa2eaa7101121d10_9366/RPT-01_Sport_On-Ear_Headphones_Black_CM5015_01_standard.jpg", 857 | "shipping": 48, 858 | "quantity": 0 859 | }, 860 | { 861 | "id": "9e7cda87-8160-458f-bd32-ecf253a2d86a", 862 | "category": "Bottle", 863 | "name": "Steel Metal Bottle 1L", 864 | "seller": "Addidas", 865 | "price": 33, 866 | "stock": 7, 867 | "ratings": 4, 868 | "ratingsCount": 62, 869 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a9c04ca9fa51408faf2fac8e0117abb9_9366/Steel_Metal_Bottle_1L_Black_EX7288_01_standard.jpg", 870 | "shipping": 15, 871 | "quantity": 0 872 | }, 873 | { 874 | "id": "eaff8921-f7eb-446f-b072-d96559685de0", 875 | "category": "Bottle", 876 | "name": "Steel Metal Bottle 1L", 877 | "seller": "Addidas", 878 | "price": 40, 879 | "stock": 14, 880 | "ratings": 5, 881 | "ratingsCount": 58, 882 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c45df020e3ae4e9199a4ac7d0001cfb7_9366/Steel_Metal_Bottle_1L_White_EX7301_01_standard.jpg", 883 | "shipping": 17, 884 | "quantity": 0 885 | }, 886 | { 887 | "id": "96fd22a5-f22f-4ad8-b7b5-f1cfd0852553", 888 | "category": "Bottle", 889 | "name": "Steel Metal Bottle 1 L", 890 | "seller": "Addidas", 891 | "price": 46, 892 | "stock": 2, 893 | "ratings": 5, 894 | "ratingsCount": 73, 895 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c670a94f6388451a868fad440014460d_9366/Steel_Metal_Bottle_1_L_Purple_EY5529_01_standard.jpg", 896 | "shipping": 45, 897 | "quantity": 0 898 | }, 899 | { 900 | "id": "e1a7c529-f91b-4ef5-a661-c2317c5c314e", 901 | "category": "Bottle", 902 | "name": "Steel Metal Bottle 1L", 903 | "seller": "Addidas", 904 | "price": 20, 905 | "stock": 14, 906 | "ratings": 5, 907 | "ratingsCount": 63, 908 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/29ef510920b54492a721aa1c01782cb2_9366/Steel_Metal_Bottle_1L_White_CL6092_01_standard.jpg", 909 | "shipping": 21, 910 | "quantity": 0 911 | }, 912 | { 913 | "id": "e912ad01-2551-48dc-a709-4054cbfbcbbc", 914 | "category": "Bottle", 915 | "name": "Steel Metal Bottle 600 ML", 916 | "seller": "Addidas", 917 | "price": 43, 918 | "stock": 19, 919 | "ratings": 4, 920 | "ratingsCount": 64, 921 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1105dc0c9232477eb80dac7d000edc0c_9366/Steel_Metal_Bottle_600_ML_White_EX7306_01_standard.jpg", 922 | "shipping": 43, 923 | "quantity": 0 924 | }, 925 | { 926 | "id": "afc5d640-9943-437a-b644-ba1f6f12baa9", 927 | "category": "Bottle", 928 | "name": "Steel Straw Metal Bottle 600 ML", 929 | "seller": "Addidas", 930 | "price": 43, 931 | "stock": 10, 932 | "ratings": 3, 933 | "ratingsCount": 15, 934 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/f7fb63986ed34112bc57ac7d002c9f43_9366/Steel_Straw_Metal_Bottle_600_ML_White_EX7316_01_standard.jpg", 935 | "shipping": 46, 936 | "quantity": 0 937 | }, 938 | { 939 | "id": "5b5c43d9-950d-4b9a-b7d9-ca489224a7b2", 940 | "category": "Bottle", 941 | "name": "Steel Metal Bottle 600 ML", 942 | "seller": "Addidas", 943 | "price": 26, 944 | "stock": 20, 945 | "ratings": 5, 946 | "ratingsCount": 83, 947 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/e2d870a680644e4d98e9ac7d0008ecc7_9366/Steel_Metal_Bottle_600_ML_Yellow_EX7307_01_standard.jpg", 948 | "shipping": 6, 949 | "quantity": 0 950 | }, 951 | { 952 | "id": "96239c09-8b1c-4c81-99f9-f43e7613eab3", 953 | "category": "Bottle", 954 | "name": "Squad Glass Bottle 720 ML", 955 | "seller": "Addidas", 956 | "price": 39, 957 | "stock": 20, 958 | "ratings": 3, 959 | "ratingsCount": 1, 960 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/77ad16764abf4e828560ad44001cd640_9366/Squad_Glass_Bottle_720_ML_Black_FZ7115_01_standard.jpg", 961 | "shipping": 5, 962 | "quantity": 0 963 | }, 964 | { 965 | "id": "30698483-f7aa-49ba-9de9-9070f64dc263", 966 | "category": "Bottle", 967 | "name": "Steel Bottle 600 ML", 968 | "seller": "Addidas", 969 | "price": 23, 970 | "stock": 11, 971 | "ratings": 5, 972 | "ratingsCount": 35, 973 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/48057b65216644f683a9aa1c0172ae6e_9366/Steel_Bottle_600_ML_Black_CL6093_01_standard.jpg", 974 | "shipping": 5, 975 | "quantity": 0 976 | }, 977 | { 978 | "id": "02871edc-272b-4e20-bcc2-b32681213b3c", 979 | "category": "Bottle", 980 | "name": "Steel Metal Bottle 2L", 981 | "seller": "Addidas", 982 | "price": 37, 983 | "stock": 14, 984 | "ratings": 4, 985 | "ratingsCount": 68, 986 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/f8d89293c9cb4bf08d52adb100f95a3a_9366/Steel_Metal_Bottle_2L_Black_EX7302_01_standard.jpg", 987 | "shipping": 27, 988 | "quantity": 0 989 | } 990 | ] 991 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | min-width: 100%; 3 | } 4 | 5 | .logo { 6 | height: 6em; 7 | padding: 1.5em; 8 | will-change: filter; 9 | transition: filter 300ms; 10 | } 11 | .logo:hover { 12 | filter: drop-shadow(0 0 2em #646cffaa); 13 | } 14 | .logo.react:hover { 15 | filter: drop-shadow(0 0 2em #61dafbaa); 16 | } 17 | 18 | @keyframes logo-spin { 19 | from { 20 | transform: rotate(0deg); 21 | } 22 | to { 23 | transform: rotate(360deg); 24 | } 25 | } 26 | 27 | @media (prefers-reduced-motion: no-preference) { 28 | a:nth-of-type(2) .logo { 29 | animation: logo-spin infinite 20s linear; 30 | } 31 | } 32 | 33 | .card { 34 | padding: 2em; 35 | } 36 | 37 | .read-the-docs { 38 | color: #888; 39 | } 40 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | import './App.css' 3 | import Header from './components/Header/Header' 4 | import Shop from './components/Shop/Shop' 5 | 6 | function App() { 7 | const [count, setCount] = useState(0) 8 | 9 | return ( 10 |
11 |
12 | 13 |
14 | ) 15 | } 16 | 17 | export default App 18 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Cart/Cart.css: -------------------------------------------------------------------------------- 1 | .cart { 2 | background-color: rgba(255, 153, 0, 0.3); 3 | ; 4 | padding: 25px; 5 | position: sticky; 6 | top: 0; 7 | } 8 | 9 | .btn-clear-cart { 10 | width: 90%; 11 | height: 56px; 12 | font-size: 21px; 13 | margin: 10px auto; 14 | background: #FF3030; 15 | border-radius: 4px; 16 | color: white; 17 | display: flex; 18 | justify-content: space-between; 19 | align-items: center; 20 | } -------------------------------------------------------------------------------- /src/components/Cart/Cart.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './Cart.css'; 3 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 4 | import { faTrashAlt } from '@fortawesome/free-solid-svg-icons' 5 | 6 | const Cart = ({ cart, handleClearCart, children }) => { 7 | // const cart = props.cart; // option 1 8 | // const {cart} = props; // option 2 9 | 10 | // console.log(cart); 11 | 12 | let totalPrice = 0; 13 | let totalShipping = 0; 14 | let quantity = 0; 15 | for (const product of cart) { 16 | // if(product.quantity === 0){ 17 | // product.quantity = 1; 18 | // } 19 | // product.quantity = product.quantity || 1; 20 | 21 | totalPrice = totalPrice + product.price * product.quantity; 22 | totalShipping = totalShipping + product.shipping; 23 | quantity = quantity + product.quantity; 24 | } 25 | const tax = totalPrice * 7 / 100; 26 | 27 | const grandTotal = totalPrice + totalShipping + tax; 28 | 29 | return ( 30 |
31 |

Order Summary

32 |

Selected Items: {quantity}

33 |

Total Price: ${totalPrice}

34 |

Shipping: ${totalShipping}

35 |

Tax: ${tax.toFixed(2)}

36 |
Grand Total: ${grandTotal.toFixed(2)}
37 | 41 | {children} 42 |
43 | ); 44 | }; 45 | 46 | export default Cart; -------------------------------------------------------------------------------- /src/components/Checkout/Checkout.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Checkout = () => { 4 | return ( 5 |
6 |

Checkout your order!!! page

7 |
8 | ); 9 | }; 10 | 11 | export default Checkout; -------------------------------------------------------------------------------- /src/components/Header/Header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | height: 80px; 3 | background-color: #1C2B35;; 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | padding-left: 100px; 8 | padding-right: 100px; 9 | } 10 | 11 | nav.header a{ 12 | text-decoration: none; 13 | color: #FFFFFF; 14 | margin-left: 30px; 15 | } 16 | nav.header a:hover{ 17 | color: orange; 18 | } -------------------------------------------------------------------------------- /src/components/Header/Header.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './Header.css'; 3 | import logo from '../../images/Logo.svg'; 4 | import { Link } from 'react-router-dom'; 5 | 6 | const Header = () => { 7 | return ( 8 | 17 | ); 18 | }; 19 | 20 | export default Header; -------------------------------------------------------------------------------- /src/components/Inventory/Inventory.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Inventory = () => { 4 | return ( 5 |
6 |

Inventory page

7 |
8 | ); 9 | }; 10 | 11 | export default Inventory; -------------------------------------------------------------------------------- /src/components/Layout/Home.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Header from '../Header/Header'; 3 | import { Outlet } from 'react-router-dom'; 4 | 5 | const Home = () => { 6 | return ( 7 |
8 |
9 | 10 |
11 | ); 12 | }; 13 | 14 | export default Home; -------------------------------------------------------------------------------- /src/components/Login/Login.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Login = () => { 4 | return ( 5 |
6 |

Login coming sooon

7 |
8 | ); 9 | }; 10 | 11 | export default Login; -------------------------------------------------------------------------------- /src/components/Orders/Orders.css: -------------------------------------------------------------------------------- 1 | .review-container{ 2 | margin: 50px auto; 3 | } -------------------------------------------------------------------------------- /src/components/Orders/Orders.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import Cart from '../Cart/Cart'; 3 | import { Link, useLoaderData } from 'react-router-dom'; 4 | import ReviewItem from '../ReviewItem/ReviewItem'; 5 | import './Orders.css'; 6 | import { deleteShoppingCart, removeFromDb } from '../../utilities/fakedb'; 7 | 8 | const Orders = () => { 9 | const savedCart = useLoaderData(); 10 | const [cart, setCart] = useState(savedCart); 11 | 12 | const handleRemoveFromCart = (id) => { 13 | const remaining = cart.filter(product => product.id !== id); 14 | setCart(remaining); 15 | removeFromDb(id); 16 | } 17 | 18 | const handleClearCart = () => { 19 | setCart([]); 20 | deleteShoppingCart(); 21 | } 22 | 23 | return ( 24 |
25 |
26 | { 27 | cart.map(product => ) 32 | } 33 |
34 |
35 | 39 | 40 | 41 | 42 | 43 |
44 |
45 | ); 46 | }; 47 | 48 | export default Orders; -------------------------------------------------------------------------------- /src/components/Product/Product.css: -------------------------------------------------------------------------------- 1 | .product { 2 | width: 300px; 3 | height: 510px; 4 | border: 1px solid #95A0A7; 5 | border-radius: 8px; 6 | position: relative; 7 | } 8 | 9 | .product img { 10 | width: 286px; 11 | height: 286px; 12 | margin: 7px; 13 | border-radius: 8px; 14 | } 15 | 16 | .product-name { 17 | margin-top: 0px; 18 | margin-bottom: 0px; 19 | font-family: 'Lato'; 20 | font-style: normal; 21 | font-weight: 400; 22 | font-size: 21px; 23 | line-height: 25px; 24 | letter-spacing: 0.0015em; 25 | color: #0E161A; 26 | } 27 | .product-info{ 28 | margin-left: 14px; 29 | } 30 | .product-info p{ 31 | margin-top: 5px; 32 | } 33 | .btn-cart{ 34 | width: 100%; 35 | background: #FFE0B3; 36 | border: 1px solid #95A0A7; 37 | border-radius: 0px 0px 8px 8px; 38 | position: absolute; 39 | bottom: 0; 40 | } 41 | .btn-cart:hover{ 42 | background-color: orange; 43 | } -------------------------------------------------------------------------------- /src/components/Product/Product.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 3 | import { faShoppingCart } from '@fortawesome/free-solid-svg-icons' 4 | import './Product.css'; 5 | 6 | const Product = (props) => { 7 | 8 | const { img, name, seller, ratings, price } = props.product; 9 | const handleAddToCart = props.handleAddToCart; 10 | 11 | 12 | return ( 13 |
14 | 15 |
16 |
{name}
17 |

Price: ${price}

18 |

Manufacturer: {seller}

19 |

Rating: {ratings} Stars

20 |
21 | 25 |
26 | ); 27 | }; 28 | 29 | export default Product; -------------------------------------------------------------------------------- /src/components/ReviewItem/ReviewItem.css: -------------------------------------------------------------------------------- 1 | .review-item { 2 | width: 571px; 3 | border: 1px solid #95A0A7; 4 | border-radius: 8px; 5 | margin-bottom: 25px; 6 | padding: 8px 25px 8px 8px; 7 | display: flex; 8 | align-items: center; 9 | } 10 | 11 | .review-item .product-title { 12 | font-weight: 400; 13 | font-size: 21px; 14 | line-height: 25px; 15 | letter-spacing: 0.0015em; 16 | } 17 | 18 | .review-details { 19 | flex-grow: 1; 20 | } 21 | 22 | 23 | .review-details p{ 24 | margin: 0 15px; 25 | } 26 | 27 | .review-item img { 28 | width: 91px; 29 | height: 91px; 30 | border-radius: 6px; 31 | } 32 | 33 | .orange-text{ 34 | color: #FF9900; 35 | } 36 | 37 | /* delete button styles */ 38 | .btn-delete{ 39 | height: 55px; 40 | width: 55px; 41 | border-radius: 50%; 42 | background-color: rgba(235, 87, 87, 0.3); 43 | display: flex; 44 | justify-content: center; 45 | align-items: center; 46 | } 47 | .delete-icon{ 48 | color: #EB5757; 49 | font-size: 27px; 50 | } -------------------------------------------------------------------------------- /src/components/ReviewItem/ReviewItem.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 3 | import { faTrashAlt } from '@fortawesome/free-solid-svg-icons' 4 | import './ReviewItem.css'; 5 | 6 | const ReviewItem = ({ product, handleRemoveFromCart }) => { 7 | const { id, img, price, name, quantity } = product; 8 | return ( 9 |
10 | 11 |
12 |

{name}

13 |

Price: ${price}

14 |

Order Quantity: {quantity}

15 |
16 | 19 |
20 | ); 21 | }; 22 | 23 | export default ReviewItem; -------------------------------------------------------------------------------- /src/components/Shop/Shop.css: -------------------------------------------------------------------------------- 1 | .shop-container { 2 | display: grid; 3 | grid-template-columns: 4fr 1fr; 4 | /* position: relative; */ 5 | } 6 | 7 | .products-container { 8 | margin: 50px; 9 | display: grid; 10 | grid-template-columns: repeat(3, 1fr); 11 | gap: 45px; 12 | } 13 | .proceed-link{ 14 | text-decoration: none; 15 | } 16 | .btn-proceed { 17 | background: #FF9900; 18 | width: 90%; 19 | height: 56px; 20 | font-size: 21px; 21 | margin: 10px auto; 22 | border-radius: 4px; 23 | color: white; 24 | display: flex; 25 | justify-content: space-between; 26 | align-items: center; 27 | } -------------------------------------------------------------------------------- /src/components/Shop/Shop.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { addToDb, deleteShoppingCart, getShoppingCart } from '../../utilities/fakedb'; 3 | import Cart from '../Cart/Cart'; 4 | import Product from '../Product/Product'; 5 | import './Shop.css'; 6 | import { Link } from 'react-router-dom'; 7 | 8 | const Shop = () => { 9 | const [products, setProducts] = useState([]); 10 | const [cart, setCart] = useState([]) 11 | 12 | useEffect(() => { 13 | fetch('products.json') 14 | .then(res => res.json()) 15 | .then(data => setProducts(data)) 16 | }, []); 17 | 18 | useEffect(() => { 19 | const storedCart = getShoppingCart(); 20 | const savedCart = []; 21 | // step 1: get id of the addedProduct 22 | for (const id in storedCart) { 23 | // step 2: get product from products state by using id 24 | const addedProduct = products.find(product => product.id === id) 25 | if (addedProduct) { 26 | // step 3: add quantity 27 | const quantity = storedCart[id]; 28 | addedProduct.quantity = quantity; 29 | // step 4: add the added product to the saved cart 30 | savedCart.push(addedProduct); 31 | } 32 | // console.log('added Product', addedProduct) 33 | } 34 | // step 5: set the cart 35 | setCart(savedCart); 36 | }, [products]) 37 | 38 | const handleAddToCart = (product) => { 39 | // cart.push(product); ' 40 | let newCart = []; 41 | // const newCart = [...cart, product]; 42 | // if product doesn't exist in the cart, then set quantity = 1 43 | // if exist update quantity by 1 44 | const exists = cart.find(pd => pd.id === product.id); 45 | if (!exists) { 46 | product.quantity = 1; 47 | newCart = [...cart, product] 48 | } 49 | else { 50 | exists.quantity = exists.quantity + 1; 51 | const remaining = cart.filter(pd => pd.id !== product.id); 52 | newCart = [...remaining, exists]; 53 | } 54 | 55 | setCart(newCart); 56 | addToDb(product.id) 57 | } 58 | 59 | const handleClearCart = () => { 60 | setCart([]); 61 | deleteShoppingCart(); 62 | } 63 | 64 | return ( 65 |
66 |
67 | { 68 | products.map(product => ) 73 | } 74 |
75 |
76 | 80 | 81 | 82 | 83 | 84 |
85 |
86 | ); 87 | }; 88 | 89 | export default Shop; -------------------------------------------------------------------------------- /src/fakeData/products.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "124e13b9-2d54-4b2f-a74d-a77b362d6ead", 4 | "category": "Men's Sneaker", 5 | "name": "ULTRABOOST 22 SHOES", 6 | "seller": "Addidas", 7 | "price": 420, 8 | "stock": 20, 9 | "ratings": 4, 10 | "ratingsCount": 3725, 11 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/fbaf991a78bc4896a3e9ad7800abcec6_9366/Ultraboost_22_Shoes_Black_GZ0127_01_standard.jpg", 12 | "shipping": 1, 13 | "quantity": 0 14 | }, 15 | { 16 | "id": "13cbc7ed-a61b-4883-9d42-82d7d8642b86", 17 | "category": "Men's Sneaker", 18 | "name": "LUNAR NEW YEAR ULTRABOOST DNA SHOES", 19 | "seller": "Addidas", 20 | "price": 196, 21 | "stock": 19, 22 | "ratings": 5, 23 | "ratingsCount": 4355, 24 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/2cee64414e1f4f31baf1ae270099d950_9366/Lunar_New_Year_Ultraboost_DNA_Shoes_Black_GZ6074_01_standard.jpg", 25 | "shipping": 14, 26 | "quantity": 0 27 | }, 28 | { 29 | "id": "307f166f-1d04-4573-bc37-2f461ea9d4f7", 30 | "category": "Men's Sneaker", 31 | "name": "SUPERNOVA SHOES", 32 | "seller": "Addidas", 33 | "price": 245, 34 | "stock": 20, 35 | "ratings": 4, 36 | "ratingsCount": 3972, 37 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/69cbc73d0cb846889f89acbb011e68cb_9366/Supernova_Shoes_Black_S42722_01_standard.jpg", 38 | "shipping": 1, 39 | "quantity": 0 40 | }, 41 | { 42 | "id": "4bf9798f-63bc-4a83-b0c6-6a3b816fe922", 43 | "category": "Men's Sneaker", 44 | "name": "LITE RACER ADAPT 3.0 SHOES", 45 | "seller": "Addidas", 46 | "price": 229, 47 | "stock": 10, 48 | "ratings": 5, 49 | "ratingsCount": 1764, 50 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/96a5f085fedf4e678095abad01056711_9366/Lite_Racer_Adapt_3.0_Shoes_Black_FX8802_01_standard.jpg", 51 | "shipping": 32, 52 | "quantity": 0 53 | }, 54 | { 55 | "id": "9496d72b-04ec-41f8-9bc3-0a7c9697be8e", 56 | "category": "Men's Sneaker", 57 | "name": "4DFWD SHOES", 58 | "seller": "Addidas", 59 | "price": 287, 60 | "stock": 11, 61 | "ratings": 4, 62 | "ratingsCount": 799, 63 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/8c5d1994dfd343e28567ad4400dd351d_9366/4DFWD_Shoes_Black_Q46447_01_standard.jpg", 64 | "shipping": 49, 65 | "quantity": 0 66 | }, 67 | { 68 | "id": "6e5593d3-557b-43cf-8dab-a5140faedfb0", 69 | "category": "Men's Sneaker", 70 | "name": "KAPTIR 2.0 SHOES", 71 | "seller": "Addidas", 72 | "price": 138, 73 | "stock": 19, 74 | "ratings": 3, 75 | "ratingsCount": 4372, 76 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0846e90b15144861b33dacf500e3cfd1_9366/Kaptir_2.0_Shoes_White_H00276_01_standard.jpg", 77 | "shipping": 19, 78 | "quantity": 0 79 | }, 80 | { 81 | "id": "9c0c13c2-54e4-4001-809b-afbd9d84037d", 82 | "category": "Men's Sneaker", 83 | "name": "4DFWD PULSE SHOES", 84 | "seller": "Addidas", 85 | "price": 226, 86 | "stock": 1, 87 | "ratings": 4, 88 | "ratingsCount": 2870, 89 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9a8256bb7ca34da49ff8ad5600bb2812_9366/4DFWD_Pulse_Shoes_White_Q46221_01_standard.jpg", 90 | "shipping": 15, 91 | "quantity": 0 92 | }, 93 | { 94 | "id": "c9d1f410-d28f-49d9-9b01-d759b5acbeea", 95 | "category": "Men's Sneaker", 96 | "name": "ZX 1K BOOST SHOES", 97 | "seller": "Addidas", 98 | "price": 319, 99 | "stock": 7, 100 | "ratings": 4, 101 | "ratingsCount": 1360, 102 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0e540bae86d5456aa034ada300ebf46c_9366/ZX_1K_Boost_Shoes_Grey_H00430_01_standard.jpg", 103 | "shipping": 50, 104 | "quantity": 0 105 | }, 106 | { 107 | "id": "1564a06b-692f-4f2e-8413-9c8a1cc2da77", 108 | "category": "Men's Sneaker", 109 | "name": "NMD_R1 V2 SHOES", 110 | "seller": "Addidas", 111 | "price": 260, 112 | "stock": 4, 113 | "ratings": 5, 114 | "ratingsCount": 1976, 115 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c2a18c4e3f104d52a697ad6a01477bb7_9366/NMD_R1_V2_Shoes_Black_GX6367_01_standard.jpg", 116 | "shipping": 46, 117 | "quantity": 0 118 | }, 119 | { 120 | "id": "ac44095f-230e-4502-8816-dea3eaae8320", 121 | "category": "Men's Sneaker", 122 | "name": "NMD_R1 PRIMEBLUE SHOES", 123 | "seller": "Addidas", 124 | "price": 437, 125 | "stock": 1, 126 | "ratings": 4, 127 | "ratingsCount": 565, 128 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0e03e7a2a9cb44dfac2bad6a00f95888_9366/NMD_R1_Primeblue_Shoes_White_GZ9261_01_standard.jpg", 129 | "shipping": 36, 130 | "quantity": 0 131 | }, 132 | { 133 | "id": "d0803f97-966f-4296-ad31-a7f70fc86fab", 134 | "category": "Men's Pants", 135 | "name": "TIRO TRACK PANTS", 136 | "seller": "Addidas", 137 | "price": 146, 138 | "stock": 15, 139 | "ratings": 5, 140 | "ratingsCount": 3702, 141 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 142 | "shipping": 29, 143 | "quantity": 0 144 | }, 145 | { 146 | "id": "8a5b4a9c-76ea-4fbb-9c70-9548de4eab01", 147 | "category": "Men's Pants", 148 | "name": "TIRO 21 TRACK PANTS", 149 | "seller": "Addidas", 150 | "price": 109, 151 | "stock": 6, 152 | "ratings": 5, 153 | "ratingsCount": 1688, 154 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 155 | "shipping": 48, 156 | "quantity": 0 157 | }, 158 | { 159 | "id": "b357e19b-4dd9-4fc7-b5c0-9ed5255464ba", 160 | "category": "Men's Pants", 161 | "name": "PRIMEBLUE SST TRACK PANTS", 162 | "seller": "Addidas", 163 | "price": 63, 164 | "stock": 46, 165 | "ratings": 4, 166 | "ratingsCount": 50, 167 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/52b5fde5829a4a04820dacf50127b969_9366/Adicolor_Classics_Primeblue_SST_Track_Pants_Blue_H06714_21_model.jpg", 168 | "shipping": 20, 169 | "quantity": 0 170 | }, 171 | { 172 | "id": "e4220958-06d2-4d50-96fa-0163a563f43d", 173 | "category": "Men's Pants", 174 | "name": "TIRO 21 TRACK PANTS", 175 | "seller": "Addidas", 176 | "price": 148, 177 | "stock": 41, 178 | "ratings": 3, 179 | "ratingsCount": 4483, 180 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 181 | "shipping": 8, 182 | "quantity": 0 183 | }, 184 | { 185 | "id": "ae69f0e4-559c-4b24-8032-80b63f9b5073", 186 | "category": "Men's Pants", 187 | "name": "TIRO TRACK PANTS RED", 188 | "seller": "Addidas", 189 | "price": 122, 190 | "stock": 43, 191 | "ratings": 4, 192 | "ratingsCount": 1239, 193 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 194 | "shipping": 27, 195 | "quantity": 0 196 | }, 197 | { 198 | "id": "dbf7ab3f-b383-4d95-8ab7-f55fcf6fa5f2", 199 | "category": "Men's Pants", 200 | "name": "TIRO PANTS BLACK GOLD", 201 | "seller": "Addidas", 202 | "price": 115, 203 | "stock": 26, 204 | "ratings": 5, 205 | "ratingsCount": 4557, 206 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c447324cf06544b78105ade500fd9e2f_9366/Tiro_Pants_Black_HI1073_21_model.jpg", 207 | "shipping": 33, 208 | "quantity": 0 209 | }, 210 | { 211 | "id": "ed6a7ac3-7e67-4e3f-8461-bceb5178be42", 212 | "category": "Men's Pants", 213 | "name": "TAPERED-CUFF 3-STRIPES PANTS", 214 | "seller": "Addidas", 215 | "price": 108, 216 | "stock": 5, 217 | "ratings": 3, 218 | "ratingsCount": 3383, 219 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9c7058d8677742ac8519ac3f009cdcf4_9366/Tiro_21_Track_Pants_Black_GH7305_21_model.jpg", 220 | "shipping": 26, 221 | "quantity": 0 222 | }, 223 | { 224 | "id": "fd52819a-cb78-4510-ad2f-c5bdd888ae78", 225 | "category": "Men's Pants", 226 | "name": "FRENCH TERRY TAPERED CUFF LOGO PANTS", 227 | "seller": "Addidas", 228 | "price": 189, 229 | "stock": 27, 230 | "ratings": 3, 231 | "ratingsCount": 1974, 232 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/d47f8bc94b2c401b9eafad23007fd8c4_9366/Primegreen_Essentials_Warm-Up_Open_Hem_3-Stripes_Track_Pants_Black_H48430_21_model.jpg", 233 | "shipping": 20, 234 | "quantity": 0 235 | }, 236 | { 237 | "id": "c667d3ff-41eb-4cf7-a433-819d959ea768", 238 | "category": "Men's Pants", 239 | "name": "OPEN HEM 3-STRIPES TRACK PANTS", 240 | "seller": "Addidas", 241 | "price": 58, 242 | "stock": 41, 243 | "ratings": 5, 244 | "ratingsCount": 2140, 245 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/d47f8bc94b2c401b9eafad23007fd8c4_9366/Primegreen_Essentials_Warm-Up_Open_Hem_3-Stripes_Track_Pants_Black_H48430_21_model.jpg", 246 | "shipping": 49, 247 | "quantity": 0 248 | }, 249 | { 250 | "id": "e1dbc7fe-be17-4e0f-9e2d-6ad5dbc102fc", 251 | "category": "Men's Pants", 252 | "name": "ESSENTIALS4GAMEDAY PANTS", 253 | "seller": "Addidas", 254 | "price": 185, 255 | "stock": 43, 256 | "ratings": 5, 257 | "ratingsCount": 2676, 258 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/64f1ba254925439d88eaad920127d77e_9366/Essentials4Gameday_Pants_Black_HE1800_21_model.jpg", 259 | "shipping": 27, 260 | "quantity": 0 261 | }, 262 | { 263 | "id": "0298e695-1f9b-49b1-9961-8a8460f95b1c", 264 | "category": "Men's Boot", 265 | "name": "TERREX FREE HIKER GORE-TEX HIKING SHOES", 266 | "seller": "Addidas", 267 | "price": 132, 268 | "stock": 1, 269 | "ratings": 3, 270 | "ratingsCount": 128, 271 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/12cf12ac1c8e484ea487ad6400ee3444_9366/Terrex_Free_Hiker_Gore-Tex_Hiking_Shoes_Black_GZ0355_01_standard.jpg", 272 | "shipping": 13, 273 | "quantity": 0 274 | }, 275 | { 276 | "id": "3cfe9adc-c27f-4be4-a859-a5c98ce88a27", 277 | "category": "Men's Boot", 278 | "name": "TERREX AX4 MID GORE-TEX HIKING SHOES", 279 | "seller": "Addidas", 280 | "price": 111, 281 | "stock": 19, 282 | "ratings": 4, 283 | "ratingsCount": 894, 284 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/dfa8c9a7d2864065b27fad7400b2e05e_9366/Terrex_AX4_Mid_GORE-TEX_Hiking_shoes_Black_FY9638_01_standard.jpg", 285 | "shipping": 27, 286 | "quantity": 0 287 | }, 288 | { 289 | "id": "6602468a-a3a8-4c2c-9d3a-fd54e2c5daf7", 290 | "category": "Men's Boot", 291 | "name": "RESPONSE 3MC ADV BOOTS", 292 | "seller": "Addidas", 293 | "price": 104, 294 | "stock": 6, 295 | "ratings": 5, 296 | "ratingsCount": 354, 297 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/b513f2cec8b440978d60ab6d014ad452_9366/Response_3MC_ADV_Boots_Black_EG9391_01_standard.jpg", 298 | "shipping": 26, 299 | "quantity": 0 300 | }, 301 | { 302 | "id": "5db3ee2f-2eb7-4764-942d-894f72198e86", 303 | "category": "Men's Boot", 304 | "name": "TACTICAL LEXICON ADV BOOTS", 305 | "seller": "Addidas", 306 | "price": 151, 307 | "stock": 3, 308 | "ratings": 4, 309 | "ratingsCount": 584, 310 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/f5350f3d583c46038534ab6d01445e2a_9366/Tactical_Lexicon_ADV_Boots_Grey_EG9386_01_standard.jpg", 311 | "shipping": 33, 312 | "quantity": 0 313 | }, 314 | { 315 | "id": "9b169efb-0966-40f3-b9c2-79b16cb96388", 316 | "category": "Men's Boot", 317 | "name": "Superstar Boots", 318 | "seller": "Addidas", 319 | "price": 151, 320 | "stock": 13, 321 | "ratings": 3, 322 | "ratingsCount": 1010, 323 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/6853ac5565a9407bae19ac080120d9d7_9366/Superstar_Boots_Red_FZ2642_01_standard.jpg", 324 | "shipping": 4, 325 | "quantity": 0 326 | }, 327 | { 328 | "id": "fb1f9913-d903-498c-9e4a-16d363aa2eba", 329 | "category": "Men's Boot", 330 | "name": "TACTICAL LEXICON ADV BOOTS", 331 | "seller": "Addidas", 332 | "price": 199, 333 | "stock": 14, 334 | "ratings": 4, 335 | "ratingsCount": 2422, 336 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/3a819de9f29c498fae13ab6d01473c4d_9366/Tactical_Lexicon_ADV_Boots_White_EG9385_01_standard.jpg", 337 | "shipping": 39, 338 | "quantity": 0 339 | }, 340 | { 341 | "id": "fe48e340-4dc9-44b3-911b-9308b4f530b3", 342 | "category": "Men's Boot", 343 | "name": "TERREX TRAILMAKER MID COLD.RDY HIKING SHOES", 344 | "seller": "Addidas", 345 | "price": 110, 346 | "stock": 16, 347 | "ratings": 3, 348 | "ratingsCount": 1533, 349 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c2ee4c27eba64258bcbaad5100e5d998_9366/Terrex_Trailmaker_Mid_COLD.RDY_Hiking_Shoes_Brown_FZ3370_01_standard.jpg", 350 | "shipping": 33, 351 | "quantity": 0 352 | }, 353 | { 354 | "id": "2e06fa90-2961-4867-8322-6fdcca2f086a", 355 | "category": "Men's Boot", 356 | "name": "TERREX FREE HIKER GORE-TEX HIKING SHOES", 357 | "seller": "Addidas", 358 | "price": 155, 359 | "stock": 4, 360 | "ratings": 5, 361 | "ratingsCount": 1351, 362 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/efbedb26b92e4affa103ad6b008a789a_9366/Terrex_Free_Hiker_Gore-Tex_Hiking_Shoes_Grey_GZ0356_01_standard.jpg", 363 | "shipping": 38, 364 | "quantity": 0 365 | }, 366 | { 367 | "id": "008c06dd-04e4-4923-b840-927bd6b4c2de", 368 | "category": "Men's Boot", 369 | "name": "TERREX AGRAVIC TECH PRO TRAIL RUNNING SHOES", 370 | "seller": "Addidas", 371 | "price": 118, 372 | "stock": 8, 373 | "ratings": 3, 374 | "ratingsCount": 1798, 375 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/0a340319370844e99645abc90091df96_9366/Terrex_Agravic_Tech_Pro_Trail_Running_Shoes_Black_FU7634_01_standard.jpg", 376 | "shipping": 37, 377 | "quantity": 0 378 | }, 379 | { 380 | "id": "b4d83415-d20a-4bba-8629-22b2780b6e93", 381 | "category": "Men's Boot", 382 | "name": "TERREX FREE HIKER COLD.RDY HIKING BOOTS", 383 | "seller": "Addidas", 384 | "price": 169, 385 | "stock": 17, 386 | "ratings": 5, 387 | "ratingsCount": 2833, 388 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/2ded0bee28b249bbb19cad5000818b77_9366/Terrex_Free_Hiker_COLD.RDY_Hiking_Boots_Black_FZ3364_01_standard.jpg", 389 | "shipping": 10, 390 | "quantity": 0 391 | }, 392 | { 393 | "id": "1d54fd83-83df-42f8-ae2b-f5ef9d4987ea", 394 | "category": "Men's Sneaker", 395 | "name": "MOVE FEELREADY SPORT TEE", 396 | "seller": "Addidas", 397 | "price": 14, 398 | "stock": 19, 399 | "ratings": 3, 400 | "ratingsCount": 4041, 401 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/ec81fbd781fe4aa3a8cead230019c192_9366/AEROREADY_Designed_2_Move_Feelready_Sport_Tee_Burgundy_H30268_21_model.jpg", 402 | "shipping": 5, 403 | "quantity": 0 404 | }, 405 | { 406 | "id": "1ce97e0e-3611-4406-8788-7b413640f59e", 407 | "category": "Men's Sneaker", 408 | "name": "ADIDAS CAMO BOX GRAPHIC TEE", 409 | "seller": "Addidas", 410 | "price": 16, 411 | "stock": 10, 412 | "ratings": 3, 413 | "ratingsCount": 4505, 414 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/809d5f06a7c74e93aef3ad08017c415a_9366/adidas_Camo_Box_Graphic_Tee_Grey_HB4828_21_model.jpg", 415 | "shipping": 11, 416 | "quantity": 0 417 | }, 418 | { 419 | "id": "f088beb8-d664-4166-99f8-6995c2f08465", 420 | "category": "Men's Sneaker", 421 | "name": "ADICOLOR CLASSICS TREFOIL TEE", 422 | "seller": "Addidas", 423 | "price": 20, 424 | "stock": 12, 425 | "ratings": 4, 426 | "ratingsCount": 41, 427 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/de7b5dc9e5a341b9bf5aad570106ba06_9366/Adicolor_Classics_Trefoil_Tee_Burgundy_H06641_21_model.jpg", 428 | "shipping": 38, 429 | "quantity": 0 430 | }, 431 | { 432 | "id": "26dd7da8-c854-4bab-aaf5-32cc964da2ec", 433 | "category": "Men's Sneaker", 434 | "name": "LNY TREFOIL FILL TEE", 435 | "seller": "Addidas", 436 | "price": 16, 437 | "stock": 17, 438 | "ratings": 4, 439 | "ratingsCount": 4985, 440 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 441 | "shipping": 35, 442 | "quantity": 0 443 | }, 444 | { 445 | "id": "a2615943-7eeb-4d6a-ab1b-78fb51ce39da", 446 | "category": "Men's Sneaker", 447 | "name": "CREATOR 365 TEE", 448 | "seller": "Addidas", 449 | "price": 34, 450 | "stock": 20, 451 | "ratings": 3, 452 | "ratingsCount": 4727, 453 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 454 | "shipping": 2, 455 | "quantity": 0 456 | }, 457 | { 458 | "id": "27cf3efa-7352-4889-85c4-44a4de2aa93a", 459 | "category": "Men's Sneaker", 460 | "name": "OWN THE RUN LONG SLEEVE TEE", 461 | "seller": "Addidas", 462 | "price": 23, 463 | "stock": 17, 464 | "ratings": 3, 465 | "ratingsCount": 4003, 466 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c6a321b7bb7243d28fe9ac71011393c7_9366/Own_the_Run_Long_Sleeve_Tee_Black_GJ9977_21_model.jpg", 467 | "shipping": 2, 468 | "quantity": 0 469 | }, 470 | { 471 | "id": "6add9d60-1339-4115-b2ac-00d4886f4ad7", 472 | "category": "Men's Sneaker", 473 | "name": "NYC BADGE OF SPORT LOGO GRAPHIC TEE", 474 | "seller": "Addidas", 475 | "price": 29, 476 | "stock": 6, 477 | "ratings": 3, 478 | "ratingsCount": 805, 479 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/e0101e13ac1940208478add1000e953a_9366/NYC_Badge_of_Sport_Logo_Graphic_Tee_White_HE2363_21_model.jpg", 480 | "shipping": 6, 481 | "quantity": 0 482 | }, 483 | { 484 | "id": "1b6f1af1-2103-4838-932d-2b98dfdb6c1f", 485 | "category": "Men's Sneaker", 486 | "name": "RUNNER TEE", 487 | "seller": "Addidas", 488 | "price": 20, 489 | "stock": 7, 490 | "ratings": 5, 491 | "ratingsCount": 3343, 492 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/8c3f5445517340e8bc02ad8100ffd3f6_9366/Runner_Tee_Burgundy_H25050_21_model.jpg", 493 | "shipping": 48, 494 | "quantity": 0 495 | }, 496 | { 497 | "id": "c6cb80a7-3542-4270-bd2b-920efd5f3f85", 498 | "category": "Men's Sneaker", 499 | "name": "V-DAY TEE (GENDER NEUTRAL)", 500 | "seller": "Addidas", 501 | "price": 18, 502 | "stock": 2, 503 | "ratings": 4, 504 | "ratingsCount": 1590, 505 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/c53945c38b614702ba6fae1d0164b2f1_9366/LNY_Trefoil_Fill_Tee_Black_HR9040_21_model.jpg", 506 | "shipping": 13, 507 | "quantity": 0 508 | }, 509 | { 510 | "id": "f54a4763-b8c2-4922-ba8d-80652a64f5bc", 511 | "category": "Men's Sneaker", 512 | "name": "ESSENTIALS COLORBLOCK TEE", 513 | "seller": "Addidas", 514 | "price": 35, 515 | "stock": 6, 516 | "ratings": 3, 517 | "ratingsCount": 2680, 518 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto,fl_lossy,c_fill,g_auto/9889d39ac10243a2bb0fad1a0097ef07_9366/Essentials_Colorblock_Tee_Black_H14627_21_model.jpg", 519 | "shipping": 39, 520 | "quantity": 0 521 | }, 522 | { 523 | "id": "4a0090e7-b65d-4f6e-a42b-5603a3f51883", 524 | "category": "Bag", 525 | "name": "3-Stripes Backpack 2.0", 526 | "seller": "Addidas", 527 | "price": 74, 528 | "stock": 7, 529 | "ratings": 5, 530 | "ratingsCount": 365, 531 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/ba79ccb861fd4fd49e3aac9f006a6407_9366/3-Stripes_Backpack_2.0_Grey_EX6735_01_standard.jpg", 532 | "shipping": 23, 533 | "quantity": 0 534 | }, 535 | { 536 | "id": "0ac76ee7-53f1-45ba-b5ca-81ff6063bc1a", 537 | "category": "Bag", 538 | "name": "Trefoil Backpack", 539 | "seller": "Addidas", 540 | "price": 65, 541 | "stock": 3, 542 | "ratings": 4, 543 | "ratingsCount": 465, 544 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a520df1b51384c00af9caca100489f04_9366/Trefoil_Backpack_Black_EX6752_01_standard.jpg", 545 | "shipping": 36, 546 | "quantity": 0 547 | }, 548 | { 549 | "id": "1770549a-571b-4baf-bc58-7bae7a228dcb", 550 | "category": "Bag", 551 | "name": "Santiago Lunch Bag", 552 | "seller": "Addidas", 553 | "price": 63, 554 | "stock": 10, 555 | "ratings": 3, 556 | "ratingsCount": 346, 557 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c2aaf5e8a7924f1d9277ac9f005b5f37_9366/Santiago_Lunch_Bag_Black_EX6532_01_standard.jpg", 558 | "shipping": 42, 559 | "quantity": 0 560 | }, 561 | { 562 | "id": "24b20ba6-9024-4b0a-b8a9-cf937521cede", 563 | "category": "Bag", 564 | "name": "Blue Version Backpack", 565 | "seller": "Addidas", 566 | "price": 87, 567 | "stock": 15, 568 | "ratings": 5, 569 | "ratingsCount": 234, 570 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a9e0c5635057425daab5ad0b0089194b_9366/Blue_Version_Backpack_Black_H22735_01_standard.jpg", 571 | "shipping": 21, 572 | "quantity": 0 573 | }, 574 | { 575 | "id": "a7231186-0316-4cc0-94bf-4f496a382346", 576 | "category": "Bag", 577 | "name": "Defender Backpack", 578 | "seller": "Addidas", 579 | "price": 96, 580 | "stock": 10, 581 | "ratings": 4, 582 | "ratingsCount": 241, 583 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/d6ee0177281f42f0a254acb1016aa051_9366/Defender_Backpack_Red_EX7011_01_standard.jpg", 584 | "shipping": 15, 585 | "quantity": 0 586 | }, 587 | { 588 | "id": "35ac57f9-870a-4299-aac8-e5d8d2716b31", 589 | "category": "Bag", 590 | "name": "Excel Backpack", 591 | "seller": "Addidas", 592 | "price": 62, 593 | "stock": 18, 594 | "ratings": 5, 595 | "ratingsCount": 168, 596 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/ac09bb56249b43158485aca1007cc1ef_9366/Excel_Backpack_Black_EX6933_01_standard.jpg", 597 | "shipping": 14, 598 | "quantity": 0 599 | }, 600 | { 601 | "id": "c50bebaf-2633-4674-aba2-25be34bfdbba", 602 | "category": "Bag", 603 | "name": "Alliance Sackpack", 604 | "seller": "Addidas", 605 | "price": 99, 606 | "stock": 16, 607 | "ratings": 3, 608 | "ratingsCount": 311, 609 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/2e8a6f09838d49c3b00fad4f0017f753_9366/Alliance_Sackpack_White_FZ6823_01_standard.jpg", 610 | "shipping": 40, 611 | "quantity": 0 612 | }, 613 | { 614 | "id": "ff5bf372-7ed1-4904-aac5-7a2ce98e70ef", 615 | "category": "Bag", 616 | "name": "R.Y.V. Toploader Backpack", 617 | "seller": "Addidas", 618 | "price": 56, 619 | "stock": 19, 620 | "ratings": 3, 621 | "ratingsCount": 471, 622 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1c87c940836e4628852bad130101e5c6_9366/R.Y.V._Toploader_Backpack_Black_H32458_01_standard.jpg", 623 | "shipping": 20, 624 | "quantity": 0 625 | }, 626 | { 627 | "id": "83ef9902-0224-48d3-ba7c-eeff3e678d13", 628 | "category": "Bag", 629 | "name": "Adicolor Archive Backpack", 630 | "seller": "Addidas", 631 | "price": 84, 632 | "stock": 5, 633 | "ratings": 4, 634 | "ratingsCount": 445, 635 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0bb325f9cc174ea4bed7ad9e0101b682_9366/Adicolor_Archive_Backpack_Green_HE9804_01_standard.jpg", 636 | "shipping": 19, 637 | "quantity": 0 638 | }, 639 | { 640 | "id": "7490b4c8-8242-4de5-b161-b8ac96ea0e0b", 641 | "category": "Bag", 642 | "name": "R.Y.V. Backpack", 643 | "seller": "Addidas", 644 | "price": 67, 645 | "stock": 10, 646 | "ratings": 5, 647 | "ratingsCount": 83, 648 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/dc7dca21df62473ea518ade101251809_9366/R.Y.V._Backpack_Black_HD9650_01_standard.jpg", 649 | "shipping": 24, 650 | "quantity": 0 651 | }, 652 | { 653 | "id": "b1872b25-ba91-48ed-9468-1822df0637b9", 654 | "category": "Cap", 655 | "name": "Relaxed Strap-Back Hat", 656 | "seller": "Addidas", 657 | "price": 30, 658 | "stock": 6, 659 | "ratings": 4, 660 | "ratingsCount": 4, 661 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/4feb20f4d990407cb4f1a88a0040b212_9366/Relaxed_Strap-Back_Hat_Black_BH7137_01_standard.jpg", 662 | "shipping": 1, 663 | "quantity": 0 664 | }, 665 | { 666 | "id": "ea028038-4e9d-42bf-b033-88aa5e6cc477", 667 | "category": "Cap", 668 | "name": "Icon Snapback Hat", 669 | "seller": "Addidas", 670 | "price": 21, 671 | "stock": 13, 672 | "ratings": 4, 673 | "ratingsCount": 1, 674 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1e27ae8bbfb647489261ac8e015d181f_9366/Icon_Snapback_Hat_Grey_EX6798_01_standard.jpg", 675 | "shipping": 26, 676 | "quantity": 0 677 | }, 678 | { 679 | "id": "d48e0fcb-904c-499e-93a0-312d77e6dbf9", 680 | "category": "Cap", 681 | "name": "Superlite Hat", 682 | "seller": "Addidas", 683 | "price": 11, 684 | "stock": 18, 685 | "ratings": 3, 686 | "ratingsCount": 39, 687 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0ae141db6fce44999337ac8e015954ea_9366/Superlite_Hat_Grey_EX7054_01_standard.jpg", 688 | "shipping": 32, 689 | "quantity": 0 690 | }, 691 | { 692 | "id": "71dfc7f9-844b-4be7-816f-891a5cbaa0f1", 693 | "category": "Cap", 694 | "name": "Superlite Hat", 695 | "seller": "Addidas", 696 | "price": 10, 697 | "stock": 10, 698 | "ratings": 5, 699 | "ratingsCount": 47, 700 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/272d5d9cb7b74415a6c9ac8e015a4ccc_9366/Superlite_Hat_Black_EX7048_01_standard.jpg", 701 | "shipping": 24, 702 | "quantity": 0 703 | }, 704 | { 705 | "id": "a9d89eac-7418-4bca-a484-c8238c356270", 706 | "category": "Cap", 707 | "name": "Tee Time 5-Panel Hat", 708 | "seller": "Addidas", 709 | "price": 24, 710 | "stock": 1, 711 | "ratings": 4, 712 | "ratingsCount": 14, 713 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/df67ab60b5574c368b76adf9010f2d2d_9366/Tee_Time_5-Panel_Hat_Black_HA9254_01_standard.jpg", 714 | "shipping": 48, 715 | "quantity": 0 716 | }, 717 | { 718 | "id": "f6a5e6c0-5aec-4f10-84d7-bde9b6199045", 719 | "category": "Cap", 720 | "name": "Baseball Cap", 721 | "seller": "Addidas", 722 | "price": 17, 723 | "stock": 7, 724 | "ratings": 5, 725 | "ratingsCount": 37, 726 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/0ce5f49aa0914deabf16adc600d09e60_9366/Baseball_Cap_Black_HD7039_01_standard.jpg", 727 | "shipping": 48, 728 | "quantity": 0 729 | }, 730 | { 731 | "id": "625b4b60-611c-490c-ac0a-f3c2d2afd05c", 732 | "category": "Cap", 733 | "name": "Relaxed Strap-Back Hat", 734 | "seller": "Addidas", 735 | "price": 24, 736 | "stock": 9, 737 | "ratings": 5, 738 | "ratingsCount": 15, 739 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/aaa5ae549c624178bc25a740012dd61f_9366/Relaxed_Strap-Back_Hat_White_BH7135_01_standard.jpg", 740 | "shipping": 6, 741 | "quantity": 0 742 | }, 743 | { 744 | "id": "5960bf40-9603-4a39-9ff6-6cf9f1ce4815", 745 | "category": "Cap", 746 | "name": "UNISEX ORIGINALS WASHED BUCKET", 747 | "seller": "Addidas", 748 | "price": 27, 749 | "stock": 14, 750 | "ratings": 4, 751 | "ratingsCount": 3, 752 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/e1e758585df14bbbb7d8aaf000c95bd7_9366/UNISEX_ORIGINALS_WASHED_BUCKET_White_CM3933_01_standard.jpg", 753 | "shipping": 14, 754 | "quantity": 0 755 | }, 756 | { 757 | "id": "5991add1-f4ba-4fb9-9b6b-ec59aa2dda60", 758 | "category": "Cap", 759 | "name": "SST Plus Strap-Back Hat", 760 | "seller": "Addidas", 761 | "price": 23, 762 | "stock": 14, 763 | "ratings": 4, 764 | "ratingsCount": 32, 765 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/92e77a8d84d845d19171ad50003f2ea1_9366/SST_Plus_Strap-Back_Hat_White_FZ8569_01_standard.jpg", 766 | "shipping": 47, 767 | "quantity": 0 768 | }, 769 | { 770 | "id": "5690e579-a943-4b42-9ffe-dfc65b71c560", 771 | "category": "Cap", 772 | "name": "Dispatch Trucker Hat", 773 | "seller": "Addidas", 774 | "price": 28, 775 | "stock": 16, 776 | "ratings": 4, 777 | "ratingsCount": 30, 778 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c3981523051c4a978674ad3c01015664_9366/Dispatch_Trucker_Hat_Black_EY5534_01_standard.jpg", 779 | "shipping": 14, 780 | "quantity": 0 781 | }, 782 | { 783 | "id": "be7a4d0a-c681-416c-ab8d-f9be28223f4e", 784 | "category": "Earphones", 785 | "name": "adidas Z.N.E. 01 True Wireless Earbuds", 786 | "seller": "Addidas", 787 | "price": 142, 788 | "stock": 11, 789 | "ratings": 5, 790 | "ratingsCount": 22, 791 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/00276c6c380b41bcb29fadcc00f98312_9366/adidas_Z.N.E._01_True_Wireless_Earbuds_Grey_EY5116_42_detail.jpg", 792 | "shipping": 23, 793 | "quantity": 0 794 | }, 795 | { 796 | "id": "b278e667-ca17-465c-b603-af1af4319b7b", 797 | "category": "Earphones", 798 | "name": "adidas Z.N.E. 01 ANC True Wireless Earbuds", 799 | "seller": "Addidas", 800 | "price": 135, 801 | "stock": 16, 802 | "ratings": 5, 803 | "ratingsCount": 51, 804 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/b322cdef8e654551ace9adcc00f963ed_9366/adidas_Z.N.E._01_ANC_True_Wireless_Earbuds_Grey_EY5114_41_detail.jpg", 805 | "shipping": 30, 806 | "quantity": 0 807 | }, 808 | { 809 | "id": "1f56c0e5-4407-44bf-9225-90f592d2924a", 810 | "category": "Earphones", 811 | "name": "FWD-01 Sport In-Ear Headphones", 812 | "seller": "Addidas", 813 | "price": 185, 814 | "stock": 8, 815 | "ratings": 4, 816 | "ratingsCount": 66, 817 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/2cdb8652aa2340369ba2aa79010062d1_9366/FWD-01_Sport_In-Ear_Headphones_Black_CM5016_01_standard.jpg", 818 | "shipping": 15, 819 | "quantity": 0 820 | }, 821 | { 822 | "id": "4ead4708-68e8-4a93-b28e-5e99ccc4d75c", 823 | "category": "Earphones", 824 | "name": "adidas FWD-02 Sport True Wireless Earbuds", 825 | "seller": "Addidas", 826 | "price": 162, 827 | "stock": 14, 828 | "ratings": 4, 829 | "ratingsCount": 6, 830 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/523731a02e914d318cb4adcc00f985ba_9366/adidas_FWD-02_Sport_True_Wireless_Earbuds_Grey_EY5113_03_standard_hover.jpg", 831 | "shipping": 29, 832 | "quantity": 0 833 | }, 834 | { 835 | "id": "d1116075-10f2-49c4-985e-0d41e19ce1b3", 836 | "category": "Earphones", 837 | "name": "adidas Z.N.E. 01 ANC True Wireless Earbuds", 838 | "seller": "Addidas", 839 | "price": 110, 840 | "stock": 15, 841 | "ratings": 5, 842 | "ratingsCount": 9, 843 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/9e6e7967b3b24ef298f5adcc00f983ec_9366/adidas_Z.N.E._01_ANC_True_Wireless_Earbuds_Grey_EY5115_41_detail.jpg", 844 | "shipping": 48, 845 | "quantity": 0 846 | }, 847 | { 848 | "id": "d1116075-10f2-49c4-985e-fg41e19dc1b8", 849 | "category": "Earphones", 850 | "name": "RPT-01 Sport On-Ear Headphones", 851 | "seller": "Addidas", 852 | "price": 170, 853 | "stock": 15, 854 | "ratings": 5, 855 | "ratingsCount": 55, 856 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c697ceddb0c2469aaa2eaa7101121d10_9366/RPT-01_Sport_On-Ear_Headphones_Black_CM5015_01_standard.jpg", 857 | "shipping": 48, 858 | "quantity": 0 859 | }, 860 | { 861 | "id": "9e7cda87-8160-458f-bd32-ecf253a2d86a", 862 | "category": "Bottle", 863 | "name": "Steel Metal Bottle 1L", 864 | "seller": "Addidas", 865 | "price": 33, 866 | "stock": 7, 867 | "ratings": 4, 868 | "ratingsCount": 62, 869 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/a9c04ca9fa51408faf2fac8e0117abb9_9366/Steel_Metal_Bottle_1L_Black_EX7288_01_standard.jpg", 870 | "shipping": 15, 871 | "quantity": 0 872 | }, 873 | { 874 | "id": "eaff8921-f7eb-446f-b072-d96559685de0", 875 | "category": "Bottle", 876 | "name": "Steel Metal Bottle 1L", 877 | "seller": "Addidas", 878 | "price": 40, 879 | "stock": 14, 880 | "ratings": 5, 881 | "ratingsCount": 58, 882 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c45df020e3ae4e9199a4ac7d0001cfb7_9366/Steel_Metal_Bottle_1L_White_EX7301_01_standard.jpg", 883 | "shipping": 17, 884 | "quantity": 0 885 | }, 886 | { 887 | "id": "96fd22a5-f22f-4ad8-b7b5-f1cfd0852553", 888 | "category": "Bottle", 889 | "name": "Steel Metal Bottle 1 L", 890 | "seller": "Addidas", 891 | "price": 46, 892 | "stock": 2, 893 | "ratings": 5, 894 | "ratingsCount": 73, 895 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/c670a94f6388451a868fad440014460d_9366/Steel_Metal_Bottle_1_L_Purple_EY5529_01_standard.jpg", 896 | "shipping": 45, 897 | "quantity": 0 898 | }, 899 | { 900 | "id": "e1a7c529-f91b-4ef5-a661-c2317c5c314e", 901 | "category": "Bottle", 902 | "name": "Steel Metal Bottle 1L", 903 | "seller": "Addidas", 904 | "price": 20, 905 | "stock": 14, 906 | "ratings": 5, 907 | "ratingsCount": 63, 908 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/29ef510920b54492a721aa1c01782cb2_9366/Steel_Metal_Bottle_1L_White_CL6092_01_standard.jpg", 909 | "shipping": 21, 910 | "quantity": 0 911 | }, 912 | { 913 | "id": "e912ad01-2551-48dc-a709-4054cbfbcbbc", 914 | "category": "Bottle", 915 | "name": "Steel Metal Bottle 600 ML", 916 | "seller": "Addidas", 917 | "price": 43, 918 | "stock": 19, 919 | "ratings": 4, 920 | "ratingsCount": 64, 921 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/1105dc0c9232477eb80dac7d000edc0c_9366/Steel_Metal_Bottle_600_ML_White_EX7306_01_standard.jpg", 922 | "shipping": 43, 923 | "quantity": 0 924 | }, 925 | { 926 | "id": "afc5d640-9943-437a-b644-ba1f6f12baa9", 927 | "category": "Bottle", 928 | "name": "Steel Straw Metal Bottle 600 ML", 929 | "seller": "Addidas", 930 | "price": 43, 931 | "stock": 10, 932 | "ratings": 3, 933 | "ratingsCount": 15, 934 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/f7fb63986ed34112bc57ac7d002c9f43_9366/Steel_Straw_Metal_Bottle_600_ML_White_EX7316_01_standard.jpg", 935 | "shipping": 46, 936 | "quantity": 0 937 | }, 938 | { 939 | "id": "5b5c43d9-950d-4b9a-b7d9-ca489224a7b2", 940 | "category": "Bottle", 941 | "name": "Steel Metal Bottle 600 ML", 942 | "seller": "Addidas", 943 | "price": 26, 944 | "stock": 20, 945 | "ratings": 5, 946 | "ratingsCount": 83, 947 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/e2d870a680644e4d98e9ac7d0008ecc7_9366/Steel_Metal_Bottle_600_ML_Yellow_EX7307_01_standard.jpg", 948 | "shipping": 6, 949 | "quantity": 0 950 | }, 951 | { 952 | "id": "96239c09-8b1c-4c81-99f9-f43e7613eab3", 953 | "category": "Bottle", 954 | "name": "Squad Glass Bottle 720 ML", 955 | "seller": "Addidas", 956 | "price": 39, 957 | "stock": 20, 958 | "ratings": 3, 959 | "ratingsCount": 1, 960 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/77ad16764abf4e828560ad44001cd640_9366/Squad_Glass_Bottle_720_ML_Black_FZ7115_01_standard.jpg", 961 | "shipping": 5, 962 | "quantity": 0 963 | }, 964 | { 965 | "id": "30698483-f7aa-49ba-9de9-9070f64dc263", 966 | "category": "Bottle", 967 | "name": "Steel Bottle 600 ML", 968 | "seller": "Addidas", 969 | "price": 23, 970 | "stock": 11, 971 | "ratings": 5, 972 | "ratingsCount": 35, 973 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/48057b65216644f683a9aa1c0172ae6e_9366/Steel_Bottle_600_ML_Black_CL6093_01_standard.jpg", 974 | "shipping": 5, 975 | "quantity": 0 976 | }, 977 | { 978 | "id": "02871edc-272b-4e20-bcc2-b32681213b3c", 979 | "category": "Bottle", 980 | "name": "Steel Metal Bottle 2L", 981 | "seller": "Addidas", 982 | "price": 37, 983 | "stock": 14, 984 | "ratings": 4, 985 | "ratingsCount": 68, 986 | "img": "https://assets.adidas.com/images/h_840,f_auto,q_auto:sensitive,fl_lossy,c_fill,g_auto/f8d89293c9cb4bf08d52adb100f95a3a_9366/Steel_Metal_Bottle_2L_Black_EX7302_01_standard.jpg", 987 | "shipping": 27, 988 | "quantity": 0 989 | } 990 | ] 991 | -------------------------------------------------------------------------------- /src/images/Logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProgrammingHero1/ema-john-simple-with-router-module-55/8d2dae1c2b6657a2bf913fa29b389a610b35be9f/src/images/favicon.ico -------------------------------------------------------------------------------- /src/images/giphy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ProgrammingHero1/ema-john-simple-with-router-module-55/8d2dae1c2b6657a2bf913fa29b389a610b35be9f/src/images/giphy.gif -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-text-size-adjust: 100%; 15 | } 16 | 17 | 18 | body { 19 | margin: 0; 20 | display: flex; 21 | min-width: 320px; 22 | min-height: 100vh; 23 | } 24 | 25 | h1 { 26 | font-size: 3.2em; 27 | line-height: 1.1; 28 | } 29 | 30 | button { 31 | border-radius: 8px; 32 | border: 1px solid transparent; 33 | padding: 0.6em 1.2em; 34 | font-size: 1em; 35 | font-weight: 500; 36 | font-family: inherit; 37 | background-color: #1a1a1a; 38 | cursor: pointer; 39 | transition: border-color 0.25s; 40 | } 41 | button:hover { 42 | border-color: #646cff; 43 | } 44 | button:focus, 45 | button:focus-visible { 46 | outline: 4px auto -webkit-focus-ring-color; 47 | } 48 | 49 | @media (prefers-color-scheme: light) { 50 | :root { 51 | color: #213547; 52 | background-color: #ffffff; 53 | } 54 | a:hover { 55 | color: #747bff; 56 | } 57 | button { 58 | background-color: #f9f9f9; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/loaders/cartProductsLoader.js: -------------------------------------------------------------------------------- 1 | import { getShoppingCart } from "../utilities/fakedb"; 2 | 3 | const cartProductsLoader = async () => { 4 | const loadedProducts = await fetch('products.json'); 5 | const products = await loadedProducts.json(); 6 | 7 | // if cart data is in database, you have to use async await 8 | const storedCart = getShoppingCart(); 9 | 10 | const savedCart = []; 11 | 12 | for (const id in storedCart) { 13 | const addedProduct = products.find(pd => pd.id === id); 14 | if (addedProduct) { 15 | const quantity = storedCart[id]; 16 | addedProduct.quantity = quantity; 17 | savedCart.push(addedProduct); 18 | } 19 | } 20 | 21 | // if you need to send two things 22 | // return [products, savedCart] 23 | // another options 24 | // return { products, cart: savedCart } 25 | 26 | return savedCart; 27 | } 28 | 29 | export default cartProductsLoader; -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | import './index.css' 5 | import { 6 | createBrowserRouter, 7 | RouterProvider, 8 | } from "react-router-dom"; 9 | import Shop from './components/Shop/Shop'; 10 | import Home from './components/Layout/Home'; 11 | import Orders from './components/Orders/Orders'; 12 | import Inventory from './components/Inventory/Inventory'; 13 | import Login from './components/Login/Login'; 14 | import cartProductsLoader from './loaders/cartProductsLoader'; 15 | import Checkout from './components/Checkout/Checkout'; 16 | 17 | const router = createBrowserRouter([ 18 | { 19 | path: '/', 20 | element: , 21 | children: [ 22 | { 23 | path: '/', 24 | element: 25 | }, 26 | { 27 | path: 'orders', 28 | element: , 29 | loader: cartProductsLoader 30 | }, 31 | { 32 | path: 'inventory', 33 | element: 34 | }, 35 | { 36 | path:'checkout', 37 | element: 38 | }, 39 | { 40 | path: 'login', 41 | element: 42 | } 43 | ] 44 | } 45 | ]) 46 | 47 | ReactDOM.createRoot(document.getElementById('root')).render( 48 | 49 | 50 | , 51 | ) 52 | -------------------------------------------------------------------------------- /src/utilities/fakedb.js: -------------------------------------------------------------------------------- 1 | // use local storage to manage cart data 2 | const addToDb = id => { 3 | let shoppingCart = getShoppingCart(); 4 | // add quantity 5 | const quantity = shoppingCart[id]; 6 | if (!quantity) { 7 | shoppingCart[id] = 1; 8 | } 9 | else { 10 | const newQuantity = quantity + 1; 11 | shoppingCart[id] = newQuantity; 12 | } 13 | localStorage.setItem('shopping-cart', JSON.stringify(shoppingCart)); 14 | } 15 | 16 | const removeFromDb = id => { 17 | const shoppingCart = getShoppingCart(); 18 | if (id in shoppingCart) { 19 | delete shoppingCart[id]; 20 | localStorage.setItem('shopping-cart', JSON.stringify(shoppingCart)); 21 | } 22 | } 23 | 24 | const getShoppingCart = () => { 25 | let shoppingCart = {}; 26 | 27 | //get the shopping cart from local storage 28 | const storedCart = localStorage.getItem('shopping-cart'); 29 | if (storedCart) { 30 | shoppingCart = JSON.parse(storedCart); 31 | } 32 | return shoppingCart; 33 | } 34 | 35 | const deleteShoppingCart = () => { 36 | localStorage.removeItem('shopping-cart'); 37 | } 38 | 39 | export { 40 | addToDb, 41 | removeFromDb, 42 | getShoppingCart, 43 | deleteShoppingCart 44 | } -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | --------------------------------------------------------------------------------