├── .gitignore ├── LICENSE ├── index.html ├── package-lock.json ├── package.json ├── public └── imgs │ ├── banana.jpg │ ├── book.jpg │ ├── car.jpg │ └── computer.jpg ├── src ├── App.tsx ├── components │ ├── CartItem.tsx │ ├── Navbar.tsx │ ├── ShoppingCart.tsx │ └── StoreItem.tsx ├── context │ └── ShoppingCartContext.tsx ├── data │ └── items.json ├── hooks │ └── useLocalStorage.ts ├── main.tsx ├── pages │ ├── About.tsx │ ├── Home.tsx │ └── Store.tsx ├── utilities │ └── formatCurrency.ts └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 WebDevSimplified 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shopping-cart", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "shopping-cart", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "bootstrap": "^5.1.3", 12 | "react": "^18.0.0", 13 | "react-bootstrap": "^2.4.0", 14 | "react-dom": "^18.0.0", 15 | "react-router-dom": "^6.3.0" 16 | }, 17 | "devDependencies": { 18 | "@types/react": "^18.0.0", 19 | "@types/react-dom": "^18.0.0", 20 | "@vitejs/plugin-react": "^1.3.0", 21 | "typescript": "^4.6.3", 22 | "vite": "^2.9.9" 23 | } 24 | }, 25 | "node_modules/@ampproject/remapping": { 26 | "version": "2.2.0", 27 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 28 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 29 | "dev": true, 30 | "dependencies": { 31 | "@jridgewell/gen-mapping": "^0.1.0", 32 | "@jridgewell/trace-mapping": "^0.3.9" 33 | }, 34 | "engines": { 35 | "node": ">=6.0.0" 36 | } 37 | }, 38 | "node_modules/@babel/code-frame": { 39 | "version": "7.16.7", 40 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 41 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 42 | "dev": true, 43 | "dependencies": { 44 | "@babel/highlight": "^7.16.7" 45 | }, 46 | "engines": { 47 | "node": ">=6.9.0" 48 | } 49 | }, 50 | "node_modules/@babel/compat-data": { 51 | "version": "7.17.10", 52 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", 53 | "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", 54 | "dev": true, 55 | "engines": { 56 | "node": ">=6.9.0" 57 | } 58 | }, 59 | "node_modules/@babel/core": { 60 | "version": "7.18.2", 61 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", 62 | "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", 63 | "dev": true, 64 | "dependencies": { 65 | "@ampproject/remapping": "^2.1.0", 66 | "@babel/code-frame": "^7.16.7", 67 | "@babel/generator": "^7.18.2", 68 | "@babel/helper-compilation-targets": "^7.18.2", 69 | "@babel/helper-module-transforms": "^7.18.0", 70 | "@babel/helpers": "^7.18.2", 71 | "@babel/parser": "^7.18.0", 72 | "@babel/template": "^7.16.7", 73 | "@babel/traverse": "^7.18.2", 74 | "@babel/types": "^7.18.2", 75 | "convert-source-map": "^1.7.0", 76 | "debug": "^4.1.0", 77 | "gensync": "^1.0.0-beta.2", 78 | "json5": "^2.2.1", 79 | "semver": "^6.3.0" 80 | }, 81 | "engines": { 82 | "node": ">=6.9.0" 83 | }, 84 | "funding": { 85 | "type": "opencollective", 86 | "url": "https://opencollective.com/babel" 87 | } 88 | }, 89 | "node_modules/@babel/generator": { 90 | "version": "7.18.2", 91 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", 92 | "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", 93 | "dev": true, 94 | "dependencies": { 95 | "@babel/types": "^7.18.2", 96 | "@jridgewell/gen-mapping": "^0.3.0", 97 | "jsesc": "^2.5.1" 98 | }, 99 | "engines": { 100 | "node": ">=6.9.0" 101 | } 102 | }, 103 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 104 | "version": "0.3.1", 105 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", 106 | "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", 107 | "dev": true, 108 | "dependencies": { 109 | "@jridgewell/set-array": "^1.0.0", 110 | "@jridgewell/sourcemap-codec": "^1.4.10", 111 | "@jridgewell/trace-mapping": "^0.3.9" 112 | }, 113 | "engines": { 114 | "node": ">=6.0.0" 115 | } 116 | }, 117 | "node_modules/@babel/helper-annotate-as-pure": { 118 | "version": "7.16.7", 119 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", 120 | "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", 121 | "dev": true, 122 | "dependencies": { 123 | "@babel/types": "^7.16.7" 124 | }, 125 | "engines": { 126 | "node": ">=6.9.0" 127 | } 128 | }, 129 | "node_modules/@babel/helper-compilation-targets": { 130 | "version": "7.18.2", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", 132 | "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", 133 | "dev": true, 134 | "dependencies": { 135 | "@babel/compat-data": "^7.17.10", 136 | "@babel/helper-validator-option": "^7.16.7", 137 | "browserslist": "^4.20.2", 138 | "semver": "^6.3.0" 139 | }, 140 | "engines": { 141 | "node": ">=6.9.0" 142 | }, 143 | "peerDependencies": { 144 | "@babel/core": "^7.0.0" 145 | } 146 | }, 147 | "node_modules/@babel/helper-environment-visitor": { 148 | "version": "7.18.2", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", 150 | "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", 151 | "dev": true, 152 | "engines": { 153 | "node": ">=6.9.0" 154 | } 155 | }, 156 | "node_modules/@babel/helper-function-name": { 157 | "version": "7.17.9", 158 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", 159 | "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", 160 | "dev": true, 161 | "dependencies": { 162 | "@babel/template": "^7.16.7", 163 | "@babel/types": "^7.17.0" 164 | }, 165 | "engines": { 166 | "node": ">=6.9.0" 167 | } 168 | }, 169 | "node_modules/@babel/helper-hoist-variables": { 170 | "version": "7.16.7", 171 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", 172 | "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", 173 | "dev": true, 174 | "dependencies": { 175 | "@babel/types": "^7.16.7" 176 | }, 177 | "engines": { 178 | "node": ">=6.9.0" 179 | } 180 | }, 181 | "node_modules/@babel/helper-module-imports": { 182 | "version": "7.16.7", 183 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", 184 | "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", 185 | "dev": true, 186 | "dependencies": { 187 | "@babel/types": "^7.16.7" 188 | }, 189 | "engines": { 190 | "node": ">=6.9.0" 191 | } 192 | }, 193 | "node_modules/@babel/helper-module-transforms": { 194 | "version": "7.18.0", 195 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", 196 | "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", 197 | "dev": true, 198 | "dependencies": { 199 | "@babel/helper-environment-visitor": "^7.16.7", 200 | "@babel/helper-module-imports": "^7.16.7", 201 | "@babel/helper-simple-access": "^7.17.7", 202 | "@babel/helper-split-export-declaration": "^7.16.7", 203 | "@babel/helper-validator-identifier": "^7.16.7", 204 | "@babel/template": "^7.16.7", 205 | "@babel/traverse": "^7.18.0", 206 | "@babel/types": "^7.18.0" 207 | }, 208 | "engines": { 209 | "node": ">=6.9.0" 210 | } 211 | }, 212 | "node_modules/@babel/helper-plugin-utils": { 213 | "version": "7.17.12", 214 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", 215 | "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", 216 | "dev": true, 217 | "engines": { 218 | "node": ">=6.9.0" 219 | } 220 | }, 221 | "node_modules/@babel/helper-simple-access": { 222 | "version": "7.18.2", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", 224 | "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", 225 | "dev": true, 226 | "dependencies": { 227 | "@babel/types": "^7.18.2" 228 | }, 229 | "engines": { 230 | "node": ">=6.9.0" 231 | } 232 | }, 233 | "node_modules/@babel/helper-split-export-declaration": { 234 | "version": "7.16.7", 235 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", 236 | "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", 237 | "dev": true, 238 | "dependencies": { 239 | "@babel/types": "^7.16.7" 240 | }, 241 | "engines": { 242 | "node": ">=6.9.0" 243 | } 244 | }, 245 | "node_modules/@babel/helper-validator-identifier": { 246 | "version": "7.16.7", 247 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 248 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 249 | "dev": true, 250 | "engines": { 251 | "node": ">=6.9.0" 252 | } 253 | }, 254 | "node_modules/@babel/helper-validator-option": { 255 | "version": "7.16.7", 256 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", 257 | "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", 258 | "dev": true, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@babel/helpers": { 264 | "version": "7.18.2", 265 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", 266 | "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", 267 | "dev": true, 268 | "dependencies": { 269 | "@babel/template": "^7.16.7", 270 | "@babel/traverse": "^7.18.2", 271 | "@babel/types": "^7.18.2" 272 | }, 273 | "engines": { 274 | "node": ">=6.9.0" 275 | } 276 | }, 277 | "node_modules/@babel/highlight": { 278 | "version": "7.17.12", 279 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", 280 | "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", 281 | "dev": true, 282 | "dependencies": { 283 | "@babel/helper-validator-identifier": "^7.16.7", 284 | "chalk": "^2.0.0", 285 | "js-tokens": "^4.0.0" 286 | }, 287 | "engines": { 288 | "node": ">=6.9.0" 289 | } 290 | }, 291 | "node_modules/@babel/parser": { 292 | "version": "7.18.4", 293 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", 294 | "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", 295 | "dev": true, 296 | "bin": { 297 | "parser": "bin/babel-parser.js" 298 | }, 299 | "engines": { 300 | "node": ">=6.0.0" 301 | } 302 | }, 303 | "node_modules/@babel/plugin-syntax-jsx": { 304 | "version": "7.17.12", 305 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", 306 | "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", 307 | "dev": true, 308 | "dependencies": { 309 | "@babel/helper-plugin-utils": "^7.17.12" 310 | }, 311 | "engines": { 312 | "node": ">=6.9.0" 313 | }, 314 | "peerDependencies": { 315 | "@babel/core": "^7.0.0-0" 316 | } 317 | }, 318 | "node_modules/@babel/plugin-transform-react-jsx": { 319 | "version": "7.17.12", 320 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", 321 | "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", 322 | "dev": true, 323 | "dependencies": { 324 | "@babel/helper-annotate-as-pure": "^7.16.7", 325 | "@babel/helper-module-imports": "^7.16.7", 326 | "@babel/helper-plugin-utils": "^7.17.12", 327 | "@babel/plugin-syntax-jsx": "^7.17.12", 328 | "@babel/types": "^7.17.12" 329 | }, 330 | "engines": { 331 | "node": ">=6.9.0" 332 | }, 333 | "peerDependencies": { 334 | "@babel/core": "^7.0.0-0" 335 | } 336 | }, 337 | "node_modules/@babel/plugin-transform-react-jsx-development": { 338 | "version": "7.16.7", 339 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", 340 | "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", 341 | "dev": true, 342 | "dependencies": { 343 | "@babel/plugin-transform-react-jsx": "^7.16.7" 344 | }, 345 | "engines": { 346 | "node": ">=6.9.0" 347 | }, 348 | "peerDependencies": { 349 | "@babel/core": "^7.0.0-0" 350 | } 351 | }, 352 | "node_modules/@babel/plugin-transform-react-jsx-self": { 353 | "version": "7.17.12", 354 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.17.12.tgz", 355 | "integrity": "sha512-7S9G2B44EnYOx74mue02t1uD8ckWZ/ee6Uz/qfdzc35uWHX5NgRy9i+iJSb2LFRgMd+QV9zNcStQaazzzZ3n3Q==", 356 | "dev": true, 357 | "dependencies": { 358 | "@babel/helper-plugin-utils": "^7.17.12" 359 | }, 360 | "engines": { 361 | "node": ">=6.9.0" 362 | }, 363 | "peerDependencies": { 364 | "@babel/core": "^7.0.0-0" 365 | } 366 | }, 367 | "node_modules/@babel/plugin-transform-react-jsx-source": { 368 | "version": "7.16.7", 369 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz", 370 | "integrity": "sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==", 371 | "dev": true, 372 | "dependencies": { 373 | "@babel/helper-plugin-utils": "^7.16.7" 374 | }, 375 | "engines": { 376 | "node": ">=6.9.0" 377 | }, 378 | "peerDependencies": { 379 | "@babel/core": "^7.0.0-0" 380 | } 381 | }, 382 | "node_modules/@babel/runtime": { 383 | "version": "7.18.3", 384 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", 385 | "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", 386 | "dependencies": { 387 | "regenerator-runtime": "^0.13.4" 388 | }, 389 | "engines": { 390 | "node": ">=6.9.0" 391 | } 392 | }, 393 | "node_modules/@babel/template": { 394 | "version": "7.16.7", 395 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", 396 | "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", 397 | "dev": true, 398 | "dependencies": { 399 | "@babel/code-frame": "^7.16.7", 400 | "@babel/parser": "^7.16.7", 401 | "@babel/types": "^7.16.7" 402 | }, 403 | "engines": { 404 | "node": ">=6.9.0" 405 | } 406 | }, 407 | "node_modules/@babel/traverse": { 408 | "version": "7.18.2", 409 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", 410 | "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", 411 | "dev": true, 412 | "dependencies": { 413 | "@babel/code-frame": "^7.16.7", 414 | "@babel/generator": "^7.18.2", 415 | "@babel/helper-environment-visitor": "^7.18.2", 416 | "@babel/helper-function-name": "^7.17.9", 417 | "@babel/helper-hoist-variables": "^7.16.7", 418 | "@babel/helper-split-export-declaration": "^7.16.7", 419 | "@babel/parser": "^7.18.0", 420 | "@babel/types": "^7.18.2", 421 | "debug": "^4.1.0", 422 | "globals": "^11.1.0" 423 | }, 424 | "engines": { 425 | "node": ">=6.9.0" 426 | } 427 | }, 428 | "node_modules/@babel/types": { 429 | "version": "7.18.4", 430 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", 431 | "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", 432 | "dev": true, 433 | "dependencies": { 434 | "@babel/helper-validator-identifier": "^7.16.7", 435 | "to-fast-properties": "^2.0.0" 436 | }, 437 | "engines": { 438 | "node": ">=6.9.0" 439 | } 440 | }, 441 | "node_modules/@jridgewell/gen-mapping": { 442 | "version": "0.1.1", 443 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 444 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 445 | "dev": true, 446 | "dependencies": { 447 | "@jridgewell/set-array": "^1.0.0", 448 | "@jridgewell/sourcemap-codec": "^1.4.10" 449 | }, 450 | "engines": { 451 | "node": ">=6.0.0" 452 | } 453 | }, 454 | "node_modules/@jridgewell/resolve-uri": { 455 | "version": "3.0.7", 456 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", 457 | "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", 458 | "dev": true, 459 | "engines": { 460 | "node": ">=6.0.0" 461 | } 462 | }, 463 | "node_modules/@jridgewell/set-array": { 464 | "version": "1.1.1", 465 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", 466 | "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", 467 | "dev": true, 468 | "engines": { 469 | "node": ">=6.0.0" 470 | } 471 | }, 472 | "node_modules/@jridgewell/sourcemap-codec": { 473 | "version": "1.4.13", 474 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", 475 | "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", 476 | "dev": true 477 | }, 478 | "node_modules/@jridgewell/trace-mapping": { 479 | "version": "0.3.13", 480 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", 481 | "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", 482 | "dev": true, 483 | "dependencies": { 484 | "@jridgewell/resolve-uri": "^3.0.3", 485 | "@jridgewell/sourcemap-codec": "^1.4.10" 486 | } 487 | }, 488 | "node_modules/@popperjs/core": { 489 | "version": "2.11.5", 490 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", 491 | "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", 492 | "funding": { 493 | "type": "opencollective", 494 | "url": "https://opencollective.com/popperjs" 495 | } 496 | }, 497 | "node_modules/@react-aria/ssr": { 498 | "version": "3.2.0", 499 | "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.2.0.tgz", 500 | "integrity": "sha512-wwJFdkl+Q8NU5yJ4NvdAOqx5LM3QtUVoSjuK7Ey8jZ4WS4bB0EqT3Kr3IInBs257HzZ5nXCiKXKE4NGXXuIRWA==", 501 | "dependencies": { 502 | "@babel/runtime": "^7.6.2" 503 | }, 504 | "peerDependencies": { 505 | "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" 506 | } 507 | }, 508 | "node_modules/@restart/hooks": { 509 | "version": "0.4.7", 510 | "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", 511 | "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", 512 | "dependencies": { 513 | "dequal": "^2.0.2" 514 | }, 515 | "peerDependencies": { 516 | "react": ">=16.8.0" 517 | } 518 | }, 519 | "node_modules/@restart/ui": { 520 | "version": "1.2.0", 521 | "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.2.0.tgz", 522 | "integrity": "sha512-oIh2t3tG8drZtZ9SlaV5CY6wGsUViHk8ZajjhcI+74IQHyWy+AnxDv8rJR5wVgsgcgrPBUvGNkC1AEdcGNPaLQ==", 523 | "dependencies": { 524 | "@babel/runtime": "^7.13.16", 525 | "@popperjs/core": "^2.10.1", 526 | "@react-aria/ssr": "^3.0.1", 527 | "@restart/hooks": "^0.4.0", 528 | "@types/warning": "^3.0.0", 529 | "dequal": "^2.0.2", 530 | "dom-helpers": "^5.2.0", 531 | "uncontrollable": "^7.2.1", 532 | "warning": "^4.0.3" 533 | }, 534 | "peerDependencies": { 535 | "react": ">=16.14.0", 536 | "react-dom": ">=16.14.0" 537 | } 538 | }, 539 | "node_modules/@rollup/pluginutils": { 540 | "version": "4.2.1", 541 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 542 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 543 | "dev": true, 544 | "dependencies": { 545 | "estree-walker": "^2.0.1", 546 | "picomatch": "^2.2.2" 547 | }, 548 | "engines": { 549 | "node": ">= 8.0.0" 550 | } 551 | }, 552 | "node_modules/@types/prop-types": { 553 | "version": "15.7.5", 554 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 555 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" 556 | }, 557 | "node_modules/@types/react": { 558 | "version": "18.0.12", 559 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.12.tgz", 560 | "integrity": "sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg==", 561 | "dependencies": { 562 | "@types/prop-types": "*", 563 | "@types/scheduler": "*", 564 | "csstype": "^3.0.2" 565 | } 566 | }, 567 | "node_modules/@types/react-dom": { 568 | "version": "18.0.5", 569 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", 570 | "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", 571 | "dev": true, 572 | "dependencies": { 573 | "@types/react": "*" 574 | } 575 | }, 576 | "node_modules/@types/react-transition-group": { 577 | "version": "4.4.4", 578 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", 579 | "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", 580 | "dependencies": { 581 | "@types/react": "*" 582 | } 583 | }, 584 | "node_modules/@types/scheduler": { 585 | "version": "0.16.2", 586 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 587 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" 588 | }, 589 | "node_modules/@types/warning": { 590 | "version": "3.0.0", 591 | "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", 592 | "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" 593 | }, 594 | "node_modules/@vitejs/plugin-react": { 595 | "version": "1.3.2", 596 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz", 597 | "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==", 598 | "dev": true, 599 | "dependencies": { 600 | "@babel/core": "^7.17.10", 601 | "@babel/plugin-transform-react-jsx": "^7.17.3", 602 | "@babel/plugin-transform-react-jsx-development": "^7.16.7", 603 | "@babel/plugin-transform-react-jsx-self": "^7.16.7", 604 | "@babel/plugin-transform-react-jsx-source": "^7.16.7", 605 | "@rollup/pluginutils": "^4.2.1", 606 | "react-refresh": "^0.13.0", 607 | "resolve": "^1.22.0" 608 | }, 609 | "engines": { 610 | "node": ">=12.0.0" 611 | } 612 | }, 613 | "node_modules/ansi-styles": { 614 | "version": "3.2.1", 615 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 616 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 617 | "dev": true, 618 | "dependencies": { 619 | "color-convert": "^1.9.0" 620 | }, 621 | "engines": { 622 | "node": ">=4" 623 | } 624 | }, 625 | "node_modules/bootstrap": { 626 | "version": "5.1.3", 627 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", 628 | "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", 629 | "funding": { 630 | "type": "opencollective", 631 | "url": "https://opencollective.com/bootstrap" 632 | }, 633 | "peerDependencies": { 634 | "@popperjs/core": "^2.10.2" 635 | } 636 | }, 637 | "node_modules/browserslist": { 638 | "version": "4.20.4", 639 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", 640 | "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", 641 | "dev": true, 642 | "funding": [ 643 | { 644 | "type": "opencollective", 645 | "url": "https://opencollective.com/browserslist" 646 | }, 647 | { 648 | "type": "tidelift", 649 | "url": "https://tidelift.com/funding/github/npm/browserslist" 650 | } 651 | ], 652 | "dependencies": { 653 | "caniuse-lite": "^1.0.30001349", 654 | "electron-to-chromium": "^1.4.147", 655 | "escalade": "^3.1.1", 656 | "node-releases": "^2.0.5", 657 | "picocolors": "^1.0.0" 658 | }, 659 | "bin": { 660 | "browserslist": "cli.js" 661 | }, 662 | "engines": { 663 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 664 | } 665 | }, 666 | "node_modules/caniuse-lite": { 667 | "version": "1.0.30001352", 668 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", 669 | "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", 670 | "dev": true, 671 | "funding": [ 672 | { 673 | "type": "opencollective", 674 | "url": "https://opencollective.com/browserslist" 675 | }, 676 | { 677 | "type": "tidelift", 678 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 679 | } 680 | ] 681 | }, 682 | "node_modules/chalk": { 683 | "version": "2.4.2", 684 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 685 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 686 | "dev": true, 687 | "dependencies": { 688 | "ansi-styles": "^3.2.1", 689 | "escape-string-regexp": "^1.0.5", 690 | "supports-color": "^5.3.0" 691 | }, 692 | "engines": { 693 | "node": ">=4" 694 | } 695 | }, 696 | "node_modules/classnames": { 697 | "version": "2.3.1", 698 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", 699 | "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" 700 | }, 701 | "node_modules/color-convert": { 702 | "version": "1.9.3", 703 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 704 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 705 | "dev": true, 706 | "dependencies": { 707 | "color-name": "1.1.3" 708 | } 709 | }, 710 | "node_modules/color-name": { 711 | "version": "1.1.3", 712 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 713 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 714 | "dev": true 715 | }, 716 | "node_modules/convert-source-map": { 717 | "version": "1.8.0", 718 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 719 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 720 | "dev": true, 721 | "dependencies": { 722 | "safe-buffer": "~5.1.1" 723 | } 724 | }, 725 | "node_modules/csstype": { 726 | "version": "3.1.0", 727 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", 728 | "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" 729 | }, 730 | "node_modules/debug": { 731 | "version": "4.3.4", 732 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 733 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 734 | "dev": true, 735 | "dependencies": { 736 | "ms": "2.1.2" 737 | }, 738 | "engines": { 739 | "node": ">=6.0" 740 | }, 741 | "peerDependenciesMeta": { 742 | "supports-color": { 743 | "optional": true 744 | } 745 | } 746 | }, 747 | "node_modules/dequal": { 748 | "version": "2.0.2", 749 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", 750 | "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", 751 | "engines": { 752 | "node": ">=6" 753 | } 754 | }, 755 | "node_modules/dom-helpers": { 756 | "version": "5.2.1", 757 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", 758 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", 759 | "dependencies": { 760 | "@babel/runtime": "^7.8.7", 761 | "csstype": "^3.0.2" 762 | } 763 | }, 764 | "node_modules/electron-to-chromium": { 765 | "version": "1.4.150", 766 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.150.tgz", 767 | "integrity": "sha512-MP3oBer0X7ZeS9GJ0H6lmkn561UxiwOIY9TTkdxVY7lI9G6GVCKfgJaHaDcakwdKxBXA4T3ybeswH/WBIN/KTA==", 768 | "dev": true 769 | }, 770 | "node_modules/esbuild": { 771 | "version": "0.14.43", 772 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz", 773 | "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==", 774 | "dev": true, 775 | "hasInstallScript": true, 776 | "bin": { 777 | "esbuild": "bin/esbuild" 778 | }, 779 | "engines": { 780 | "node": ">=12" 781 | }, 782 | "optionalDependencies": { 783 | "esbuild-android-64": "0.14.43", 784 | "esbuild-android-arm64": "0.14.43", 785 | "esbuild-darwin-64": "0.14.43", 786 | "esbuild-darwin-arm64": "0.14.43", 787 | "esbuild-freebsd-64": "0.14.43", 788 | "esbuild-freebsd-arm64": "0.14.43", 789 | "esbuild-linux-32": "0.14.43", 790 | "esbuild-linux-64": "0.14.43", 791 | "esbuild-linux-arm": "0.14.43", 792 | "esbuild-linux-arm64": "0.14.43", 793 | "esbuild-linux-mips64le": "0.14.43", 794 | "esbuild-linux-ppc64le": "0.14.43", 795 | "esbuild-linux-riscv64": "0.14.43", 796 | "esbuild-linux-s390x": "0.14.43", 797 | "esbuild-netbsd-64": "0.14.43", 798 | "esbuild-openbsd-64": "0.14.43", 799 | "esbuild-sunos-64": "0.14.43", 800 | "esbuild-windows-32": "0.14.43", 801 | "esbuild-windows-64": "0.14.43", 802 | "esbuild-windows-arm64": "0.14.43" 803 | } 804 | }, 805 | "node_modules/esbuild-android-64": { 806 | "version": "0.14.43", 807 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz", 808 | "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==", 809 | "cpu": [ 810 | "x64" 811 | ], 812 | "dev": true, 813 | "optional": true, 814 | "os": [ 815 | "android" 816 | ], 817 | "engines": { 818 | "node": ">=12" 819 | } 820 | }, 821 | "node_modules/esbuild-android-arm64": { 822 | "version": "0.14.43", 823 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz", 824 | "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==", 825 | "cpu": [ 826 | "arm64" 827 | ], 828 | "dev": true, 829 | "optional": true, 830 | "os": [ 831 | "android" 832 | ], 833 | "engines": { 834 | "node": ">=12" 835 | } 836 | }, 837 | "node_modules/esbuild-darwin-64": { 838 | "version": "0.14.43", 839 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz", 840 | "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==", 841 | "cpu": [ 842 | "x64" 843 | ], 844 | "dev": true, 845 | "optional": true, 846 | "os": [ 847 | "darwin" 848 | ], 849 | "engines": { 850 | "node": ">=12" 851 | } 852 | }, 853 | "node_modules/esbuild-darwin-arm64": { 854 | "version": "0.14.43", 855 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz", 856 | "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==", 857 | "cpu": [ 858 | "arm64" 859 | ], 860 | "dev": true, 861 | "optional": true, 862 | "os": [ 863 | "darwin" 864 | ], 865 | "engines": { 866 | "node": ">=12" 867 | } 868 | }, 869 | "node_modules/esbuild-freebsd-64": { 870 | "version": "0.14.43", 871 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz", 872 | "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==", 873 | "cpu": [ 874 | "x64" 875 | ], 876 | "dev": true, 877 | "optional": true, 878 | "os": [ 879 | "freebsd" 880 | ], 881 | "engines": { 882 | "node": ">=12" 883 | } 884 | }, 885 | "node_modules/esbuild-freebsd-arm64": { 886 | "version": "0.14.43", 887 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz", 888 | "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==", 889 | "cpu": [ 890 | "arm64" 891 | ], 892 | "dev": true, 893 | "optional": true, 894 | "os": [ 895 | "freebsd" 896 | ], 897 | "engines": { 898 | "node": ">=12" 899 | } 900 | }, 901 | "node_modules/esbuild-linux-32": { 902 | "version": "0.14.43", 903 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz", 904 | "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==", 905 | "cpu": [ 906 | "ia32" 907 | ], 908 | "dev": true, 909 | "optional": true, 910 | "os": [ 911 | "linux" 912 | ], 913 | "engines": { 914 | "node": ">=12" 915 | } 916 | }, 917 | "node_modules/esbuild-linux-64": { 918 | "version": "0.14.43", 919 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz", 920 | "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==", 921 | "cpu": [ 922 | "x64" 923 | ], 924 | "dev": true, 925 | "optional": true, 926 | "os": [ 927 | "linux" 928 | ], 929 | "engines": { 930 | "node": ">=12" 931 | } 932 | }, 933 | "node_modules/esbuild-linux-arm": { 934 | "version": "0.14.43", 935 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz", 936 | "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==", 937 | "cpu": [ 938 | "arm" 939 | ], 940 | "dev": true, 941 | "optional": true, 942 | "os": [ 943 | "linux" 944 | ], 945 | "engines": { 946 | "node": ">=12" 947 | } 948 | }, 949 | "node_modules/esbuild-linux-arm64": { 950 | "version": "0.14.43", 951 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz", 952 | "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==", 953 | "cpu": [ 954 | "arm64" 955 | ], 956 | "dev": true, 957 | "optional": true, 958 | "os": [ 959 | "linux" 960 | ], 961 | "engines": { 962 | "node": ">=12" 963 | } 964 | }, 965 | "node_modules/esbuild-linux-mips64le": { 966 | "version": "0.14.43", 967 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz", 968 | "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==", 969 | "cpu": [ 970 | "mips64el" 971 | ], 972 | "dev": true, 973 | "optional": true, 974 | "os": [ 975 | "linux" 976 | ], 977 | "engines": { 978 | "node": ">=12" 979 | } 980 | }, 981 | "node_modules/esbuild-linux-ppc64le": { 982 | "version": "0.14.43", 983 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz", 984 | "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==", 985 | "cpu": [ 986 | "ppc64" 987 | ], 988 | "dev": true, 989 | "optional": true, 990 | "os": [ 991 | "linux" 992 | ], 993 | "engines": { 994 | "node": ">=12" 995 | } 996 | }, 997 | "node_modules/esbuild-linux-riscv64": { 998 | "version": "0.14.43", 999 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz", 1000 | "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==", 1001 | "cpu": [ 1002 | "riscv64" 1003 | ], 1004 | "dev": true, 1005 | "optional": true, 1006 | "os": [ 1007 | "linux" 1008 | ], 1009 | "engines": { 1010 | "node": ">=12" 1011 | } 1012 | }, 1013 | "node_modules/esbuild-linux-s390x": { 1014 | "version": "0.14.43", 1015 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz", 1016 | "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==", 1017 | "cpu": [ 1018 | "s390x" 1019 | ], 1020 | "dev": true, 1021 | "optional": true, 1022 | "os": [ 1023 | "linux" 1024 | ], 1025 | "engines": { 1026 | "node": ">=12" 1027 | } 1028 | }, 1029 | "node_modules/esbuild-netbsd-64": { 1030 | "version": "0.14.43", 1031 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz", 1032 | "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==", 1033 | "cpu": [ 1034 | "x64" 1035 | ], 1036 | "dev": true, 1037 | "optional": true, 1038 | "os": [ 1039 | "netbsd" 1040 | ], 1041 | "engines": { 1042 | "node": ">=12" 1043 | } 1044 | }, 1045 | "node_modules/esbuild-openbsd-64": { 1046 | "version": "0.14.43", 1047 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz", 1048 | "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==", 1049 | "cpu": [ 1050 | "x64" 1051 | ], 1052 | "dev": true, 1053 | "optional": true, 1054 | "os": [ 1055 | "openbsd" 1056 | ], 1057 | "engines": { 1058 | "node": ">=12" 1059 | } 1060 | }, 1061 | "node_modules/esbuild-sunos-64": { 1062 | "version": "0.14.43", 1063 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz", 1064 | "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==", 1065 | "cpu": [ 1066 | "x64" 1067 | ], 1068 | "dev": true, 1069 | "optional": true, 1070 | "os": [ 1071 | "sunos" 1072 | ], 1073 | "engines": { 1074 | "node": ">=12" 1075 | } 1076 | }, 1077 | "node_modules/esbuild-windows-32": { 1078 | "version": "0.14.43", 1079 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz", 1080 | "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==", 1081 | "cpu": [ 1082 | "ia32" 1083 | ], 1084 | "dev": true, 1085 | "optional": true, 1086 | "os": [ 1087 | "win32" 1088 | ], 1089 | "engines": { 1090 | "node": ">=12" 1091 | } 1092 | }, 1093 | "node_modules/esbuild-windows-64": { 1094 | "version": "0.14.43", 1095 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz", 1096 | "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==", 1097 | "cpu": [ 1098 | "x64" 1099 | ], 1100 | "dev": true, 1101 | "optional": true, 1102 | "os": [ 1103 | "win32" 1104 | ], 1105 | "engines": { 1106 | "node": ">=12" 1107 | } 1108 | }, 1109 | "node_modules/esbuild-windows-arm64": { 1110 | "version": "0.14.43", 1111 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz", 1112 | "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==", 1113 | "cpu": [ 1114 | "arm64" 1115 | ], 1116 | "dev": true, 1117 | "optional": true, 1118 | "os": [ 1119 | "win32" 1120 | ], 1121 | "engines": { 1122 | "node": ">=12" 1123 | } 1124 | }, 1125 | "node_modules/escalade": { 1126 | "version": "3.1.1", 1127 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1128 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1129 | "dev": true, 1130 | "engines": { 1131 | "node": ">=6" 1132 | } 1133 | }, 1134 | "node_modules/escape-string-regexp": { 1135 | "version": "1.0.5", 1136 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1137 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1138 | "dev": true, 1139 | "engines": { 1140 | "node": ">=0.8.0" 1141 | } 1142 | }, 1143 | "node_modules/estree-walker": { 1144 | "version": "2.0.2", 1145 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1146 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1147 | "dev": true 1148 | }, 1149 | "node_modules/fsevents": { 1150 | "version": "2.3.2", 1151 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1152 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1153 | "dev": true, 1154 | "hasInstallScript": true, 1155 | "optional": true, 1156 | "os": [ 1157 | "darwin" 1158 | ], 1159 | "engines": { 1160 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1161 | } 1162 | }, 1163 | "node_modules/function-bind": { 1164 | "version": "1.1.1", 1165 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1166 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1167 | "dev": true 1168 | }, 1169 | "node_modules/gensync": { 1170 | "version": "1.0.0-beta.2", 1171 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1172 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1173 | "dev": true, 1174 | "engines": { 1175 | "node": ">=6.9.0" 1176 | } 1177 | }, 1178 | "node_modules/globals": { 1179 | "version": "11.12.0", 1180 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1181 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1182 | "dev": true, 1183 | "engines": { 1184 | "node": ">=4" 1185 | } 1186 | }, 1187 | "node_modules/has": { 1188 | "version": "1.0.3", 1189 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1190 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1191 | "dev": true, 1192 | "dependencies": { 1193 | "function-bind": "^1.1.1" 1194 | }, 1195 | "engines": { 1196 | "node": ">= 0.4.0" 1197 | } 1198 | }, 1199 | "node_modules/has-flag": { 1200 | "version": "3.0.0", 1201 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1202 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1203 | "dev": true, 1204 | "engines": { 1205 | "node": ">=4" 1206 | } 1207 | }, 1208 | "node_modules/history": { 1209 | "version": "5.3.0", 1210 | "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", 1211 | "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", 1212 | "dependencies": { 1213 | "@babel/runtime": "^7.7.6" 1214 | } 1215 | }, 1216 | "node_modules/invariant": { 1217 | "version": "2.2.4", 1218 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1219 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1220 | "dependencies": { 1221 | "loose-envify": "^1.0.0" 1222 | } 1223 | }, 1224 | "node_modules/is-core-module": { 1225 | "version": "2.9.0", 1226 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1227 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "has": "^1.0.3" 1231 | }, 1232 | "funding": { 1233 | "url": "https://github.com/sponsors/ljharb" 1234 | } 1235 | }, 1236 | "node_modules/js-tokens": { 1237 | "version": "4.0.0", 1238 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1239 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1240 | }, 1241 | "node_modules/jsesc": { 1242 | "version": "2.5.2", 1243 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1244 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1245 | "dev": true, 1246 | "bin": { 1247 | "jsesc": "bin/jsesc" 1248 | }, 1249 | "engines": { 1250 | "node": ">=4" 1251 | } 1252 | }, 1253 | "node_modules/json5": { 1254 | "version": "2.2.1", 1255 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 1256 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 1257 | "dev": true, 1258 | "bin": { 1259 | "json5": "lib/cli.js" 1260 | }, 1261 | "engines": { 1262 | "node": ">=6" 1263 | } 1264 | }, 1265 | "node_modules/loose-envify": { 1266 | "version": "1.4.0", 1267 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1268 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1269 | "dependencies": { 1270 | "js-tokens": "^3.0.0 || ^4.0.0" 1271 | }, 1272 | "bin": { 1273 | "loose-envify": "cli.js" 1274 | } 1275 | }, 1276 | "node_modules/ms": { 1277 | "version": "2.1.2", 1278 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1279 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1280 | "dev": true 1281 | }, 1282 | "node_modules/nanoid": { 1283 | "version": "3.3.4", 1284 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1285 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1286 | "dev": true, 1287 | "bin": { 1288 | "nanoid": "bin/nanoid.cjs" 1289 | }, 1290 | "engines": { 1291 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1292 | } 1293 | }, 1294 | "node_modules/node-releases": { 1295 | "version": "2.0.5", 1296 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", 1297 | "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", 1298 | "dev": true 1299 | }, 1300 | "node_modules/object-assign": { 1301 | "version": "4.1.1", 1302 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1303 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1304 | "engines": { 1305 | "node": ">=0.10.0" 1306 | } 1307 | }, 1308 | "node_modules/path-parse": { 1309 | "version": "1.0.7", 1310 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1311 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1312 | "dev": true 1313 | }, 1314 | "node_modules/picocolors": { 1315 | "version": "1.0.0", 1316 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1317 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1318 | "dev": true 1319 | }, 1320 | "node_modules/picomatch": { 1321 | "version": "2.3.1", 1322 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1323 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1324 | "dev": true, 1325 | "engines": { 1326 | "node": ">=8.6" 1327 | }, 1328 | "funding": { 1329 | "url": "https://github.com/sponsors/jonschlinkert" 1330 | } 1331 | }, 1332 | "node_modules/postcss": { 1333 | "version": "8.4.14", 1334 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 1335 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 1336 | "dev": true, 1337 | "funding": [ 1338 | { 1339 | "type": "opencollective", 1340 | "url": "https://opencollective.com/postcss/" 1341 | }, 1342 | { 1343 | "type": "tidelift", 1344 | "url": "https://tidelift.com/funding/github/npm/postcss" 1345 | } 1346 | ], 1347 | "dependencies": { 1348 | "nanoid": "^3.3.4", 1349 | "picocolors": "^1.0.0", 1350 | "source-map-js": "^1.0.2" 1351 | }, 1352 | "engines": { 1353 | "node": "^10 || ^12 || >=14" 1354 | } 1355 | }, 1356 | "node_modules/prop-types": { 1357 | "version": "15.8.1", 1358 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 1359 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 1360 | "dependencies": { 1361 | "loose-envify": "^1.4.0", 1362 | "object-assign": "^4.1.1", 1363 | "react-is": "^16.13.1" 1364 | } 1365 | }, 1366 | "node_modules/prop-types-extra": { 1367 | "version": "1.1.1", 1368 | "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", 1369 | "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", 1370 | "dependencies": { 1371 | "react-is": "^16.3.2", 1372 | "warning": "^4.0.0" 1373 | }, 1374 | "peerDependencies": { 1375 | "react": ">=0.14.0" 1376 | } 1377 | }, 1378 | "node_modules/react": { 1379 | "version": "18.1.0", 1380 | "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", 1381 | "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", 1382 | "dependencies": { 1383 | "loose-envify": "^1.1.0" 1384 | }, 1385 | "engines": { 1386 | "node": ">=0.10.0" 1387 | } 1388 | }, 1389 | "node_modules/react-bootstrap": { 1390 | "version": "2.4.0", 1391 | "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.4.0.tgz", 1392 | "integrity": "sha512-dn599jNK1Fg5GGjJH+lQQDwELVzigh/MdusKpB/0el+sCjsO5MZDH5gRMmBjRhC+vb7VlCDr6OXffPIDSkNMLw==", 1393 | "dependencies": { 1394 | "@babel/runtime": "^7.17.2", 1395 | "@restart/hooks": "^0.4.6", 1396 | "@restart/ui": "^1.2.0", 1397 | "@types/react-transition-group": "^4.4.4", 1398 | "classnames": "^2.3.1", 1399 | "dom-helpers": "^5.2.1", 1400 | "invariant": "^2.2.4", 1401 | "prop-types": "^15.8.1", 1402 | "prop-types-extra": "^1.1.0", 1403 | "react-transition-group": "^4.4.2", 1404 | "uncontrollable": "^7.2.1", 1405 | "warning": "^4.0.3" 1406 | }, 1407 | "peerDependencies": { 1408 | "@types/react": ">=16.14.8", 1409 | "react": ">=16.14.0", 1410 | "react-dom": ">=16.14.0" 1411 | }, 1412 | "peerDependenciesMeta": { 1413 | "@types/react": { 1414 | "optional": true 1415 | } 1416 | } 1417 | }, 1418 | "node_modules/react-dom": { 1419 | "version": "18.1.0", 1420 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", 1421 | "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", 1422 | "dependencies": { 1423 | "loose-envify": "^1.1.0", 1424 | "scheduler": "^0.22.0" 1425 | }, 1426 | "peerDependencies": { 1427 | "react": "^18.1.0" 1428 | } 1429 | }, 1430 | "node_modules/react-is": { 1431 | "version": "16.13.1", 1432 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1433 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1434 | }, 1435 | "node_modules/react-lifecycles-compat": { 1436 | "version": "3.0.4", 1437 | "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", 1438 | "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" 1439 | }, 1440 | "node_modules/react-refresh": { 1441 | "version": "0.13.0", 1442 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 1443 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 1444 | "dev": true, 1445 | "engines": { 1446 | "node": ">=0.10.0" 1447 | } 1448 | }, 1449 | "node_modules/react-router": { 1450 | "version": "6.3.0", 1451 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", 1452 | "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", 1453 | "dependencies": { 1454 | "history": "^5.2.0" 1455 | }, 1456 | "peerDependencies": { 1457 | "react": ">=16.8" 1458 | } 1459 | }, 1460 | "node_modules/react-router-dom": { 1461 | "version": "6.3.0", 1462 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", 1463 | "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", 1464 | "dependencies": { 1465 | "history": "^5.2.0", 1466 | "react-router": "6.3.0" 1467 | }, 1468 | "peerDependencies": { 1469 | "react": ">=16.8", 1470 | "react-dom": ">=16.8" 1471 | } 1472 | }, 1473 | "node_modules/react-transition-group": { 1474 | "version": "4.4.2", 1475 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", 1476 | "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", 1477 | "dependencies": { 1478 | "@babel/runtime": "^7.5.5", 1479 | "dom-helpers": "^5.0.1", 1480 | "loose-envify": "^1.4.0", 1481 | "prop-types": "^15.6.2" 1482 | }, 1483 | "peerDependencies": { 1484 | "react": ">=16.6.0", 1485 | "react-dom": ">=16.6.0" 1486 | } 1487 | }, 1488 | "node_modules/regenerator-runtime": { 1489 | "version": "0.13.9", 1490 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1491 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 1492 | }, 1493 | "node_modules/resolve": { 1494 | "version": "1.22.0", 1495 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1496 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1497 | "dev": true, 1498 | "dependencies": { 1499 | "is-core-module": "^2.8.1", 1500 | "path-parse": "^1.0.7", 1501 | "supports-preserve-symlinks-flag": "^1.0.0" 1502 | }, 1503 | "bin": { 1504 | "resolve": "bin/resolve" 1505 | }, 1506 | "funding": { 1507 | "url": "https://github.com/sponsors/ljharb" 1508 | } 1509 | }, 1510 | "node_modules/rollup": { 1511 | "version": "2.75.6", 1512 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", 1513 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", 1514 | "dev": true, 1515 | "bin": { 1516 | "rollup": "dist/bin/rollup" 1517 | }, 1518 | "engines": { 1519 | "node": ">=10.0.0" 1520 | }, 1521 | "optionalDependencies": { 1522 | "fsevents": "~2.3.2" 1523 | } 1524 | }, 1525 | "node_modules/safe-buffer": { 1526 | "version": "5.1.2", 1527 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1528 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1529 | "dev": true 1530 | }, 1531 | "node_modules/scheduler": { 1532 | "version": "0.22.0", 1533 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", 1534 | "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", 1535 | "dependencies": { 1536 | "loose-envify": "^1.1.0" 1537 | } 1538 | }, 1539 | "node_modules/semver": { 1540 | "version": "6.3.0", 1541 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1542 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1543 | "dev": true, 1544 | "bin": { 1545 | "semver": "bin/semver.js" 1546 | } 1547 | }, 1548 | "node_modules/source-map-js": { 1549 | "version": "1.0.2", 1550 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1551 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1552 | "dev": true, 1553 | "engines": { 1554 | "node": ">=0.10.0" 1555 | } 1556 | }, 1557 | "node_modules/supports-color": { 1558 | "version": "5.5.0", 1559 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1560 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1561 | "dev": true, 1562 | "dependencies": { 1563 | "has-flag": "^3.0.0" 1564 | }, 1565 | "engines": { 1566 | "node": ">=4" 1567 | } 1568 | }, 1569 | "node_modules/supports-preserve-symlinks-flag": { 1570 | "version": "1.0.0", 1571 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1572 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1573 | "dev": true, 1574 | "engines": { 1575 | "node": ">= 0.4" 1576 | }, 1577 | "funding": { 1578 | "url": "https://github.com/sponsors/ljharb" 1579 | } 1580 | }, 1581 | "node_modules/to-fast-properties": { 1582 | "version": "2.0.0", 1583 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1584 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1585 | "dev": true, 1586 | "engines": { 1587 | "node": ">=4" 1588 | } 1589 | }, 1590 | "node_modules/typescript": { 1591 | "version": "4.7.3", 1592 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", 1593 | "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", 1594 | "dev": true, 1595 | "bin": { 1596 | "tsc": "bin/tsc", 1597 | "tsserver": "bin/tsserver" 1598 | }, 1599 | "engines": { 1600 | "node": ">=4.2.0" 1601 | } 1602 | }, 1603 | "node_modules/uncontrollable": { 1604 | "version": "7.2.1", 1605 | "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", 1606 | "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", 1607 | "dependencies": { 1608 | "@babel/runtime": "^7.6.3", 1609 | "@types/react": ">=16.9.11", 1610 | "invariant": "^2.2.4", 1611 | "react-lifecycles-compat": "^3.0.4" 1612 | }, 1613 | "peerDependencies": { 1614 | "react": ">=15.0.0" 1615 | } 1616 | }, 1617 | "node_modules/vite": { 1618 | "version": "2.9.10", 1619 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.10.tgz", 1620 | "integrity": "sha512-TwZRuSMYjpTurLqXspct+HZE7ONiW9d+wSWgvADGxhDPPyoIcNywY+RX4ng+QpK30DCa1l/oZgi2PLZDibhzbQ==", 1621 | "dev": true, 1622 | "dependencies": { 1623 | "esbuild": "^0.14.27", 1624 | "postcss": "^8.4.13", 1625 | "resolve": "^1.22.0", 1626 | "rollup": "^2.59.0" 1627 | }, 1628 | "bin": { 1629 | "vite": "bin/vite.js" 1630 | }, 1631 | "engines": { 1632 | "node": ">=12.2.0" 1633 | }, 1634 | "optionalDependencies": { 1635 | "fsevents": "~2.3.2" 1636 | }, 1637 | "peerDependencies": { 1638 | "less": "*", 1639 | "sass": "*", 1640 | "stylus": "*" 1641 | }, 1642 | "peerDependenciesMeta": { 1643 | "less": { 1644 | "optional": true 1645 | }, 1646 | "sass": { 1647 | "optional": true 1648 | }, 1649 | "stylus": { 1650 | "optional": true 1651 | } 1652 | } 1653 | }, 1654 | "node_modules/warning": { 1655 | "version": "4.0.3", 1656 | "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", 1657 | "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", 1658 | "dependencies": { 1659 | "loose-envify": "^1.0.0" 1660 | } 1661 | } 1662 | }, 1663 | "dependencies": { 1664 | "@ampproject/remapping": { 1665 | "version": "2.2.0", 1666 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 1667 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 1668 | "dev": true, 1669 | "requires": { 1670 | "@jridgewell/gen-mapping": "^0.1.0", 1671 | "@jridgewell/trace-mapping": "^0.3.9" 1672 | } 1673 | }, 1674 | "@babel/code-frame": { 1675 | "version": "7.16.7", 1676 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 1677 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 1678 | "dev": true, 1679 | "requires": { 1680 | "@babel/highlight": "^7.16.7" 1681 | } 1682 | }, 1683 | "@babel/compat-data": { 1684 | "version": "7.17.10", 1685 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", 1686 | "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", 1687 | "dev": true 1688 | }, 1689 | "@babel/core": { 1690 | "version": "7.18.2", 1691 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", 1692 | "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", 1693 | "dev": true, 1694 | "requires": { 1695 | "@ampproject/remapping": "^2.1.0", 1696 | "@babel/code-frame": "^7.16.7", 1697 | "@babel/generator": "^7.18.2", 1698 | "@babel/helper-compilation-targets": "^7.18.2", 1699 | "@babel/helper-module-transforms": "^7.18.0", 1700 | "@babel/helpers": "^7.18.2", 1701 | "@babel/parser": "^7.18.0", 1702 | "@babel/template": "^7.16.7", 1703 | "@babel/traverse": "^7.18.2", 1704 | "@babel/types": "^7.18.2", 1705 | "convert-source-map": "^1.7.0", 1706 | "debug": "^4.1.0", 1707 | "gensync": "^1.0.0-beta.2", 1708 | "json5": "^2.2.1", 1709 | "semver": "^6.3.0" 1710 | } 1711 | }, 1712 | "@babel/generator": { 1713 | "version": "7.18.2", 1714 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", 1715 | "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", 1716 | "dev": true, 1717 | "requires": { 1718 | "@babel/types": "^7.18.2", 1719 | "@jridgewell/gen-mapping": "^0.3.0", 1720 | "jsesc": "^2.5.1" 1721 | }, 1722 | "dependencies": { 1723 | "@jridgewell/gen-mapping": { 1724 | "version": "0.3.1", 1725 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", 1726 | "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", 1727 | "dev": true, 1728 | "requires": { 1729 | "@jridgewell/set-array": "^1.0.0", 1730 | "@jridgewell/sourcemap-codec": "^1.4.10", 1731 | "@jridgewell/trace-mapping": "^0.3.9" 1732 | } 1733 | } 1734 | } 1735 | }, 1736 | "@babel/helper-annotate-as-pure": { 1737 | "version": "7.16.7", 1738 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", 1739 | "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", 1740 | "dev": true, 1741 | "requires": { 1742 | "@babel/types": "^7.16.7" 1743 | } 1744 | }, 1745 | "@babel/helper-compilation-targets": { 1746 | "version": "7.18.2", 1747 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", 1748 | "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", 1749 | "dev": true, 1750 | "requires": { 1751 | "@babel/compat-data": "^7.17.10", 1752 | "@babel/helper-validator-option": "^7.16.7", 1753 | "browserslist": "^4.20.2", 1754 | "semver": "^6.3.0" 1755 | } 1756 | }, 1757 | "@babel/helper-environment-visitor": { 1758 | "version": "7.18.2", 1759 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", 1760 | "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", 1761 | "dev": true 1762 | }, 1763 | "@babel/helper-function-name": { 1764 | "version": "7.17.9", 1765 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", 1766 | "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", 1767 | "dev": true, 1768 | "requires": { 1769 | "@babel/template": "^7.16.7", 1770 | "@babel/types": "^7.17.0" 1771 | } 1772 | }, 1773 | "@babel/helper-hoist-variables": { 1774 | "version": "7.16.7", 1775 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", 1776 | "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", 1777 | "dev": true, 1778 | "requires": { 1779 | "@babel/types": "^7.16.7" 1780 | } 1781 | }, 1782 | "@babel/helper-module-imports": { 1783 | "version": "7.16.7", 1784 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", 1785 | "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", 1786 | "dev": true, 1787 | "requires": { 1788 | "@babel/types": "^7.16.7" 1789 | } 1790 | }, 1791 | "@babel/helper-module-transforms": { 1792 | "version": "7.18.0", 1793 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", 1794 | "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", 1795 | "dev": true, 1796 | "requires": { 1797 | "@babel/helper-environment-visitor": "^7.16.7", 1798 | "@babel/helper-module-imports": "^7.16.7", 1799 | "@babel/helper-simple-access": "^7.17.7", 1800 | "@babel/helper-split-export-declaration": "^7.16.7", 1801 | "@babel/helper-validator-identifier": "^7.16.7", 1802 | "@babel/template": "^7.16.7", 1803 | "@babel/traverse": "^7.18.0", 1804 | "@babel/types": "^7.18.0" 1805 | } 1806 | }, 1807 | "@babel/helper-plugin-utils": { 1808 | "version": "7.17.12", 1809 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", 1810 | "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", 1811 | "dev": true 1812 | }, 1813 | "@babel/helper-simple-access": { 1814 | "version": "7.18.2", 1815 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", 1816 | "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", 1817 | "dev": true, 1818 | "requires": { 1819 | "@babel/types": "^7.18.2" 1820 | } 1821 | }, 1822 | "@babel/helper-split-export-declaration": { 1823 | "version": "7.16.7", 1824 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", 1825 | "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", 1826 | "dev": true, 1827 | "requires": { 1828 | "@babel/types": "^7.16.7" 1829 | } 1830 | }, 1831 | "@babel/helper-validator-identifier": { 1832 | "version": "7.16.7", 1833 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 1834 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 1835 | "dev": true 1836 | }, 1837 | "@babel/helper-validator-option": { 1838 | "version": "7.16.7", 1839 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", 1840 | "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", 1841 | "dev": true 1842 | }, 1843 | "@babel/helpers": { 1844 | "version": "7.18.2", 1845 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", 1846 | "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", 1847 | "dev": true, 1848 | "requires": { 1849 | "@babel/template": "^7.16.7", 1850 | "@babel/traverse": "^7.18.2", 1851 | "@babel/types": "^7.18.2" 1852 | } 1853 | }, 1854 | "@babel/highlight": { 1855 | "version": "7.17.12", 1856 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", 1857 | "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", 1858 | "dev": true, 1859 | "requires": { 1860 | "@babel/helper-validator-identifier": "^7.16.7", 1861 | "chalk": "^2.0.0", 1862 | "js-tokens": "^4.0.0" 1863 | } 1864 | }, 1865 | "@babel/parser": { 1866 | "version": "7.18.4", 1867 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", 1868 | "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", 1869 | "dev": true 1870 | }, 1871 | "@babel/plugin-syntax-jsx": { 1872 | "version": "7.17.12", 1873 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", 1874 | "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", 1875 | "dev": true, 1876 | "requires": { 1877 | "@babel/helper-plugin-utils": "^7.17.12" 1878 | } 1879 | }, 1880 | "@babel/plugin-transform-react-jsx": { 1881 | "version": "7.17.12", 1882 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", 1883 | "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", 1884 | "dev": true, 1885 | "requires": { 1886 | "@babel/helper-annotate-as-pure": "^7.16.7", 1887 | "@babel/helper-module-imports": "^7.16.7", 1888 | "@babel/helper-plugin-utils": "^7.17.12", 1889 | "@babel/plugin-syntax-jsx": "^7.17.12", 1890 | "@babel/types": "^7.17.12" 1891 | } 1892 | }, 1893 | "@babel/plugin-transform-react-jsx-development": { 1894 | "version": "7.16.7", 1895 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", 1896 | "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", 1897 | "dev": true, 1898 | "requires": { 1899 | "@babel/plugin-transform-react-jsx": "^7.16.7" 1900 | } 1901 | }, 1902 | "@babel/plugin-transform-react-jsx-self": { 1903 | "version": "7.17.12", 1904 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.17.12.tgz", 1905 | "integrity": "sha512-7S9G2B44EnYOx74mue02t1uD8ckWZ/ee6Uz/qfdzc35uWHX5NgRy9i+iJSb2LFRgMd+QV9zNcStQaazzzZ3n3Q==", 1906 | "dev": true, 1907 | "requires": { 1908 | "@babel/helper-plugin-utils": "^7.17.12" 1909 | } 1910 | }, 1911 | "@babel/plugin-transform-react-jsx-source": { 1912 | "version": "7.16.7", 1913 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz", 1914 | "integrity": "sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==", 1915 | "dev": true, 1916 | "requires": { 1917 | "@babel/helper-plugin-utils": "^7.16.7" 1918 | } 1919 | }, 1920 | "@babel/runtime": { 1921 | "version": "7.18.3", 1922 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", 1923 | "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", 1924 | "requires": { 1925 | "regenerator-runtime": "^0.13.4" 1926 | } 1927 | }, 1928 | "@babel/template": { 1929 | "version": "7.16.7", 1930 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", 1931 | "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", 1932 | "dev": true, 1933 | "requires": { 1934 | "@babel/code-frame": "^7.16.7", 1935 | "@babel/parser": "^7.16.7", 1936 | "@babel/types": "^7.16.7" 1937 | } 1938 | }, 1939 | "@babel/traverse": { 1940 | "version": "7.18.2", 1941 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", 1942 | "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", 1943 | "dev": true, 1944 | "requires": { 1945 | "@babel/code-frame": "^7.16.7", 1946 | "@babel/generator": "^7.18.2", 1947 | "@babel/helper-environment-visitor": "^7.18.2", 1948 | "@babel/helper-function-name": "^7.17.9", 1949 | "@babel/helper-hoist-variables": "^7.16.7", 1950 | "@babel/helper-split-export-declaration": "^7.16.7", 1951 | "@babel/parser": "^7.18.0", 1952 | "@babel/types": "^7.18.2", 1953 | "debug": "^4.1.0", 1954 | "globals": "^11.1.0" 1955 | } 1956 | }, 1957 | "@babel/types": { 1958 | "version": "7.18.4", 1959 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", 1960 | "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", 1961 | "dev": true, 1962 | "requires": { 1963 | "@babel/helper-validator-identifier": "^7.16.7", 1964 | "to-fast-properties": "^2.0.0" 1965 | } 1966 | }, 1967 | "@jridgewell/gen-mapping": { 1968 | "version": "0.1.1", 1969 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 1970 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 1971 | "dev": true, 1972 | "requires": { 1973 | "@jridgewell/set-array": "^1.0.0", 1974 | "@jridgewell/sourcemap-codec": "^1.4.10" 1975 | } 1976 | }, 1977 | "@jridgewell/resolve-uri": { 1978 | "version": "3.0.7", 1979 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", 1980 | "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", 1981 | "dev": true 1982 | }, 1983 | "@jridgewell/set-array": { 1984 | "version": "1.1.1", 1985 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", 1986 | "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", 1987 | "dev": true 1988 | }, 1989 | "@jridgewell/sourcemap-codec": { 1990 | "version": "1.4.13", 1991 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", 1992 | "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", 1993 | "dev": true 1994 | }, 1995 | "@jridgewell/trace-mapping": { 1996 | "version": "0.3.13", 1997 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", 1998 | "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", 1999 | "dev": true, 2000 | "requires": { 2001 | "@jridgewell/resolve-uri": "^3.0.3", 2002 | "@jridgewell/sourcemap-codec": "^1.4.10" 2003 | } 2004 | }, 2005 | "@popperjs/core": { 2006 | "version": "2.11.5", 2007 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", 2008 | "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" 2009 | }, 2010 | "@react-aria/ssr": { 2011 | "version": "3.2.0", 2012 | "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.2.0.tgz", 2013 | "integrity": "sha512-wwJFdkl+Q8NU5yJ4NvdAOqx5LM3QtUVoSjuK7Ey8jZ4WS4bB0EqT3Kr3IInBs257HzZ5nXCiKXKE4NGXXuIRWA==", 2014 | "requires": { 2015 | "@babel/runtime": "^7.6.2" 2016 | } 2017 | }, 2018 | "@restart/hooks": { 2019 | "version": "0.4.7", 2020 | "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", 2021 | "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", 2022 | "requires": { 2023 | "dequal": "^2.0.2" 2024 | } 2025 | }, 2026 | "@restart/ui": { 2027 | "version": "1.2.0", 2028 | "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.2.0.tgz", 2029 | "integrity": "sha512-oIh2t3tG8drZtZ9SlaV5CY6wGsUViHk8ZajjhcI+74IQHyWy+AnxDv8rJR5wVgsgcgrPBUvGNkC1AEdcGNPaLQ==", 2030 | "requires": { 2031 | "@babel/runtime": "^7.13.16", 2032 | "@popperjs/core": "^2.10.1", 2033 | "@react-aria/ssr": "^3.0.1", 2034 | "@restart/hooks": "^0.4.0", 2035 | "@types/warning": "^3.0.0", 2036 | "dequal": "^2.0.2", 2037 | "dom-helpers": "^5.2.0", 2038 | "uncontrollable": "^7.2.1", 2039 | "warning": "^4.0.3" 2040 | } 2041 | }, 2042 | "@rollup/pluginutils": { 2043 | "version": "4.2.1", 2044 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 2045 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 2046 | "dev": true, 2047 | "requires": { 2048 | "estree-walker": "^2.0.1", 2049 | "picomatch": "^2.2.2" 2050 | } 2051 | }, 2052 | "@types/prop-types": { 2053 | "version": "15.7.5", 2054 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 2055 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" 2056 | }, 2057 | "@types/react": { 2058 | "version": "18.0.12", 2059 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.12.tgz", 2060 | "integrity": "sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg==", 2061 | "requires": { 2062 | "@types/prop-types": "*", 2063 | "@types/scheduler": "*", 2064 | "csstype": "^3.0.2" 2065 | } 2066 | }, 2067 | "@types/react-dom": { 2068 | "version": "18.0.5", 2069 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", 2070 | "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", 2071 | "dev": true, 2072 | "requires": { 2073 | "@types/react": "*" 2074 | } 2075 | }, 2076 | "@types/react-transition-group": { 2077 | "version": "4.4.4", 2078 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", 2079 | "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", 2080 | "requires": { 2081 | "@types/react": "*" 2082 | } 2083 | }, 2084 | "@types/scheduler": { 2085 | "version": "0.16.2", 2086 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 2087 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" 2088 | }, 2089 | "@types/warning": { 2090 | "version": "3.0.0", 2091 | "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", 2092 | "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" 2093 | }, 2094 | "@vitejs/plugin-react": { 2095 | "version": "1.3.2", 2096 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz", 2097 | "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==", 2098 | "dev": true, 2099 | "requires": { 2100 | "@babel/core": "^7.17.10", 2101 | "@babel/plugin-transform-react-jsx": "^7.17.3", 2102 | "@babel/plugin-transform-react-jsx-development": "^7.16.7", 2103 | "@babel/plugin-transform-react-jsx-self": "^7.16.7", 2104 | "@babel/plugin-transform-react-jsx-source": "^7.16.7", 2105 | "@rollup/pluginutils": "^4.2.1", 2106 | "react-refresh": "^0.13.0", 2107 | "resolve": "^1.22.0" 2108 | } 2109 | }, 2110 | "ansi-styles": { 2111 | "version": "3.2.1", 2112 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2113 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2114 | "dev": true, 2115 | "requires": { 2116 | "color-convert": "^1.9.0" 2117 | } 2118 | }, 2119 | "bootstrap": { 2120 | "version": "5.1.3", 2121 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", 2122 | "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", 2123 | "requires": {} 2124 | }, 2125 | "browserslist": { 2126 | "version": "4.20.4", 2127 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", 2128 | "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", 2129 | "dev": true, 2130 | "requires": { 2131 | "caniuse-lite": "^1.0.30001349", 2132 | "electron-to-chromium": "^1.4.147", 2133 | "escalade": "^3.1.1", 2134 | "node-releases": "^2.0.5", 2135 | "picocolors": "^1.0.0" 2136 | } 2137 | }, 2138 | "caniuse-lite": { 2139 | "version": "1.0.30001352", 2140 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", 2141 | "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", 2142 | "dev": true 2143 | }, 2144 | "chalk": { 2145 | "version": "2.4.2", 2146 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2147 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2148 | "dev": true, 2149 | "requires": { 2150 | "ansi-styles": "^3.2.1", 2151 | "escape-string-regexp": "^1.0.5", 2152 | "supports-color": "^5.3.0" 2153 | } 2154 | }, 2155 | "classnames": { 2156 | "version": "2.3.1", 2157 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", 2158 | "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" 2159 | }, 2160 | "color-convert": { 2161 | "version": "1.9.3", 2162 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2163 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2164 | "dev": true, 2165 | "requires": { 2166 | "color-name": "1.1.3" 2167 | } 2168 | }, 2169 | "color-name": { 2170 | "version": "1.1.3", 2171 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2172 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2173 | "dev": true 2174 | }, 2175 | "convert-source-map": { 2176 | "version": "1.8.0", 2177 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 2178 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 2179 | "dev": true, 2180 | "requires": { 2181 | "safe-buffer": "~5.1.1" 2182 | } 2183 | }, 2184 | "csstype": { 2185 | "version": "3.1.0", 2186 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", 2187 | "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" 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 | "dequal": { 2199 | "version": "2.0.2", 2200 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", 2201 | "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" 2202 | }, 2203 | "dom-helpers": { 2204 | "version": "5.2.1", 2205 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", 2206 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", 2207 | "requires": { 2208 | "@babel/runtime": "^7.8.7", 2209 | "csstype": "^3.0.2" 2210 | } 2211 | }, 2212 | "electron-to-chromium": { 2213 | "version": "1.4.150", 2214 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.150.tgz", 2215 | "integrity": "sha512-MP3oBer0X7ZeS9GJ0H6lmkn561UxiwOIY9TTkdxVY7lI9G6GVCKfgJaHaDcakwdKxBXA4T3ybeswH/WBIN/KTA==", 2216 | "dev": true 2217 | }, 2218 | "esbuild": { 2219 | "version": "0.14.43", 2220 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz", 2221 | "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==", 2222 | "dev": true, 2223 | "requires": { 2224 | "esbuild-android-64": "0.14.43", 2225 | "esbuild-android-arm64": "0.14.43", 2226 | "esbuild-darwin-64": "0.14.43", 2227 | "esbuild-darwin-arm64": "0.14.43", 2228 | "esbuild-freebsd-64": "0.14.43", 2229 | "esbuild-freebsd-arm64": "0.14.43", 2230 | "esbuild-linux-32": "0.14.43", 2231 | "esbuild-linux-64": "0.14.43", 2232 | "esbuild-linux-arm": "0.14.43", 2233 | "esbuild-linux-arm64": "0.14.43", 2234 | "esbuild-linux-mips64le": "0.14.43", 2235 | "esbuild-linux-ppc64le": "0.14.43", 2236 | "esbuild-linux-riscv64": "0.14.43", 2237 | "esbuild-linux-s390x": "0.14.43", 2238 | "esbuild-netbsd-64": "0.14.43", 2239 | "esbuild-openbsd-64": "0.14.43", 2240 | "esbuild-sunos-64": "0.14.43", 2241 | "esbuild-windows-32": "0.14.43", 2242 | "esbuild-windows-64": "0.14.43", 2243 | "esbuild-windows-arm64": "0.14.43" 2244 | } 2245 | }, 2246 | "esbuild-android-64": { 2247 | "version": "0.14.43", 2248 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz", 2249 | "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==", 2250 | "dev": true, 2251 | "optional": true 2252 | }, 2253 | "esbuild-android-arm64": { 2254 | "version": "0.14.43", 2255 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz", 2256 | "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==", 2257 | "dev": true, 2258 | "optional": true 2259 | }, 2260 | "esbuild-darwin-64": { 2261 | "version": "0.14.43", 2262 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz", 2263 | "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==", 2264 | "dev": true, 2265 | "optional": true 2266 | }, 2267 | "esbuild-darwin-arm64": { 2268 | "version": "0.14.43", 2269 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz", 2270 | "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==", 2271 | "dev": true, 2272 | "optional": true 2273 | }, 2274 | "esbuild-freebsd-64": { 2275 | "version": "0.14.43", 2276 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz", 2277 | "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==", 2278 | "dev": true, 2279 | "optional": true 2280 | }, 2281 | "esbuild-freebsd-arm64": { 2282 | "version": "0.14.43", 2283 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz", 2284 | "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==", 2285 | "dev": true, 2286 | "optional": true 2287 | }, 2288 | "esbuild-linux-32": { 2289 | "version": "0.14.43", 2290 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz", 2291 | "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==", 2292 | "dev": true, 2293 | "optional": true 2294 | }, 2295 | "esbuild-linux-64": { 2296 | "version": "0.14.43", 2297 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz", 2298 | "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==", 2299 | "dev": true, 2300 | "optional": true 2301 | }, 2302 | "esbuild-linux-arm": { 2303 | "version": "0.14.43", 2304 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz", 2305 | "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==", 2306 | "dev": true, 2307 | "optional": true 2308 | }, 2309 | "esbuild-linux-arm64": { 2310 | "version": "0.14.43", 2311 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz", 2312 | "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==", 2313 | "dev": true, 2314 | "optional": true 2315 | }, 2316 | "esbuild-linux-mips64le": { 2317 | "version": "0.14.43", 2318 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz", 2319 | "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==", 2320 | "dev": true, 2321 | "optional": true 2322 | }, 2323 | "esbuild-linux-ppc64le": { 2324 | "version": "0.14.43", 2325 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz", 2326 | "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==", 2327 | "dev": true, 2328 | "optional": true 2329 | }, 2330 | "esbuild-linux-riscv64": { 2331 | "version": "0.14.43", 2332 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz", 2333 | "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==", 2334 | "dev": true, 2335 | "optional": true 2336 | }, 2337 | "esbuild-linux-s390x": { 2338 | "version": "0.14.43", 2339 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz", 2340 | "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==", 2341 | "dev": true, 2342 | "optional": true 2343 | }, 2344 | "esbuild-netbsd-64": { 2345 | "version": "0.14.43", 2346 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz", 2347 | "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==", 2348 | "dev": true, 2349 | "optional": true 2350 | }, 2351 | "esbuild-openbsd-64": { 2352 | "version": "0.14.43", 2353 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz", 2354 | "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==", 2355 | "dev": true, 2356 | "optional": true 2357 | }, 2358 | "esbuild-sunos-64": { 2359 | "version": "0.14.43", 2360 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz", 2361 | "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==", 2362 | "dev": true, 2363 | "optional": true 2364 | }, 2365 | "esbuild-windows-32": { 2366 | "version": "0.14.43", 2367 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz", 2368 | "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==", 2369 | "dev": true, 2370 | "optional": true 2371 | }, 2372 | "esbuild-windows-64": { 2373 | "version": "0.14.43", 2374 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz", 2375 | "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==", 2376 | "dev": true, 2377 | "optional": true 2378 | }, 2379 | "esbuild-windows-arm64": { 2380 | "version": "0.14.43", 2381 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz", 2382 | "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==", 2383 | "dev": true, 2384 | "optional": true 2385 | }, 2386 | "escalade": { 2387 | "version": "3.1.1", 2388 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2389 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2390 | "dev": true 2391 | }, 2392 | "escape-string-regexp": { 2393 | "version": "1.0.5", 2394 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2395 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2396 | "dev": true 2397 | }, 2398 | "estree-walker": { 2399 | "version": "2.0.2", 2400 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2401 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2402 | "dev": true 2403 | }, 2404 | "fsevents": { 2405 | "version": "2.3.2", 2406 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2407 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2408 | "dev": true, 2409 | "optional": true 2410 | }, 2411 | "function-bind": { 2412 | "version": "1.1.1", 2413 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2414 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2415 | "dev": true 2416 | }, 2417 | "gensync": { 2418 | "version": "1.0.0-beta.2", 2419 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2420 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2421 | "dev": true 2422 | }, 2423 | "globals": { 2424 | "version": "11.12.0", 2425 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2426 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2427 | "dev": true 2428 | }, 2429 | "has": { 2430 | "version": "1.0.3", 2431 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2432 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2433 | "dev": true, 2434 | "requires": { 2435 | "function-bind": "^1.1.1" 2436 | } 2437 | }, 2438 | "has-flag": { 2439 | "version": "3.0.0", 2440 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2441 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2442 | "dev": true 2443 | }, 2444 | "history": { 2445 | "version": "5.3.0", 2446 | "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", 2447 | "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", 2448 | "requires": { 2449 | "@babel/runtime": "^7.7.6" 2450 | } 2451 | }, 2452 | "invariant": { 2453 | "version": "2.2.4", 2454 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 2455 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 2456 | "requires": { 2457 | "loose-envify": "^1.0.0" 2458 | } 2459 | }, 2460 | "is-core-module": { 2461 | "version": "2.9.0", 2462 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 2463 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 2464 | "dev": true, 2465 | "requires": { 2466 | "has": "^1.0.3" 2467 | } 2468 | }, 2469 | "js-tokens": { 2470 | "version": "4.0.0", 2471 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2472 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2473 | }, 2474 | "jsesc": { 2475 | "version": "2.5.2", 2476 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2477 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2478 | "dev": true 2479 | }, 2480 | "json5": { 2481 | "version": "2.2.1", 2482 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 2483 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 2484 | "dev": true 2485 | }, 2486 | "loose-envify": { 2487 | "version": "1.4.0", 2488 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2489 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2490 | "requires": { 2491 | "js-tokens": "^3.0.0 || ^4.0.0" 2492 | } 2493 | }, 2494 | "ms": { 2495 | "version": "2.1.2", 2496 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2497 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2498 | "dev": true 2499 | }, 2500 | "nanoid": { 2501 | "version": "3.3.4", 2502 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 2503 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 2504 | "dev": true 2505 | }, 2506 | "node-releases": { 2507 | "version": "2.0.5", 2508 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", 2509 | "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", 2510 | "dev": true 2511 | }, 2512 | "object-assign": { 2513 | "version": "4.1.1", 2514 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2515 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 2516 | }, 2517 | "path-parse": { 2518 | "version": "1.0.7", 2519 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2520 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2521 | "dev": true 2522 | }, 2523 | "picocolors": { 2524 | "version": "1.0.0", 2525 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2526 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2527 | "dev": true 2528 | }, 2529 | "picomatch": { 2530 | "version": "2.3.1", 2531 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2532 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2533 | "dev": true 2534 | }, 2535 | "postcss": { 2536 | "version": "8.4.14", 2537 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 2538 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 2539 | "dev": true, 2540 | "requires": { 2541 | "nanoid": "^3.3.4", 2542 | "picocolors": "^1.0.0", 2543 | "source-map-js": "^1.0.2" 2544 | } 2545 | }, 2546 | "prop-types": { 2547 | "version": "15.8.1", 2548 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2549 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2550 | "requires": { 2551 | "loose-envify": "^1.4.0", 2552 | "object-assign": "^4.1.1", 2553 | "react-is": "^16.13.1" 2554 | } 2555 | }, 2556 | "prop-types-extra": { 2557 | "version": "1.1.1", 2558 | "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", 2559 | "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", 2560 | "requires": { 2561 | "react-is": "^16.3.2", 2562 | "warning": "^4.0.0" 2563 | } 2564 | }, 2565 | "react": { 2566 | "version": "18.1.0", 2567 | "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", 2568 | "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", 2569 | "requires": { 2570 | "loose-envify": "^1.1.0" 2571 | } 2572 | }, 2573 | "react-bootstrap": { 2574 | "version": "2.4.0", 2575 | "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.4.0.tgz", 2576 | "integrity": "sha512-dn599jNK1Fg5GGjJH+lQQDwELVzigh/MdusKpB/0el+sCjsO5MZDH5gRMmBjRhC+vb7VlCDr6OXffPIDSkNMLw==", 2577 | "requires": { 2578 | "@babel/runtime": "^7.17.2", 2579 | "@restart/hooks": "^0.4.6", 2580 | "@restart/ui": "^1.2.0", 2581 | "@types/react-transition-group": "^4.4.4", 2582 | "classnames": "^2.3.1", 2583 | "dom-helpers": "^5.2.1", 2584 | "invariant": "^2.2.4", 2585 | "prop-types": "^15.8.1", 2586 | "prop-types-extra": "^1.1.0", 2587 | "react-transition-group": "^4.4.2", 2588 | "uncontrollable": "^7.2.1", 2589 | "warning": "^4.0.3" 2590 | } 2591 | }, 2592 | "react-dom": { 2593 | "version": "18.1.0", 2594 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", 2595 | "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", 2596 | "requires": { 2597 | "loose-envify": "^1.1.0", 2598 | "scheduler": "^0.22.0" 2599 | } 2600 | }, 2601 | "react-is": { 2602 | "version": "16.13.1", 2603 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2604 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2605 | }, 2606 | "react-lifecycles-compat": { 2607 | "version": "3.0.4", 2608 | "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", 2609 | "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" 2610 | }, 2611 | "react-refresh": { 2612 | "version": "0.13.0", 2613 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 2614 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 2615 | "dev": true 2616 | }, 2617 | "react-router": { 2618 | "version": "6.3.0", 2619 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", 2620 | "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", 2621 | "requires": { 2622 | "history": "^5.2.0" 2623 | } 2624 | }, 2625 | "react-router-dom": { 2626 | "version": "6.3.0", 2627 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", 2628 | "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", 2629 | "requires": { 2630 | "history": "^5.2.0", 2631 | "react-router": "6.3.0" 2632 | } 2633 | }, 2634 | "react-transition-group": { 2635 | "version": "4.4.2", 2636 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", 2637 | "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", 2638 | "requires": { 2639 | "@babel/runtime": "^7.5.5", 2640 | "dom-helpers": "^5.0.1", 2641 | "loose-envify": "^1.4.0", 2642 | "prop-types": "^15.6.2" 2643 | } 2644 | }, 2645 | "regenerator-runtime": { 2646 | "version": "0.13.9", 2647 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 2648 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 2649 | }, 2650 | "resolve": { 2651 | "version": "1.22.0", 2652 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 2653 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 2654 | "dev": true, 2655 | "requires": { 2656 | "is-core-module": "^2.8.1", 2657 | "path-parse": "^1.0.7", 2658 | "supports-preserve-symlinks-flag": "^1.0.0" 2659 | } 2660 | }, 2661 | "rollup": { 2662 | "version": "2.75.6", 2663 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", 2664 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", 2665 | "dev": true, 2666 | "requires": { 2667 | "fsevents": "~2.3.2" 2668 | } 2669 | }, 2670 | "safe-buffer": { 2671 | "version": "5.1.2", 2672 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2673 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2674 | "dev": true 2675 | }, 2676 | "scheduler": { 2677 | "version": "0.22.0", 2678 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", 2679 | "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", 2680 | "requires": { 2681 | "loose-envify": "^1.1.0" 2682 | } 2683 | }, 2684 | "semver": { 2685 | "version": "6.3.0", 2686 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2687 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2688 | "dev": true 2689 | }, 2690 | "source-map-js": { 2691 | "version": "1.0.2", 2692 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2693 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2694 | "dev": true 2695 | }, 2696 | "supports-color": { 2697 | "version": "5.5.0", 2698 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2699 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2700 | "dev": true, 2701 | "requires": { 2702 | "has-flag": "^3.0.0" 2703 | } 2704 | }, 2705 | "supports-preserve-symlinks-flag": { 2706 | "version": "1.0.0", 2707 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2708 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2709 | "dev": true 2710 | }, 2711 | "to-fast-properties": { 2712 | "version": "2.0.0", 2713 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2714 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2715 | "dev": true 2716 | }, 2717 | "typescript": { 2718 | "version": "4.7.3", 2719 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", 2720 | "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", 2721 | "dev": true 2722 | }, 2723 | "uncontrollable": { 2724 | "version": "7.2.1", 2725 | "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", 2726 | "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", 2727 | "requires": { 2728 | "@babel/runtime": "^7.6.3", 2729 | "@types/react": ">=16.9.11", 2730 | "invariant": "^2.2.4", 2731 | "react-lifecycles-compat": "^3.0.4" 2732 | } 2733 | }, 2734 | "vite": { 2735 | "version": "2.9.10", 2736 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.10.tgz", 2737 | "integrity": "sha512-TwZRuSMYjpTurLqXspct+HZE7ONiW9d+wSWgvADGxhDPPyoIcNywY+RX4ng+QpK30DCa1l/oZgi2PLZDibhzbQ==", 2738 | "dev": true, 2739 | "requires": { 2740 | "esbuild": "^0.14.27", 2741 | "fsevents": "~2.3.2", 2742 | "postcss": "^8.4.13", 2743 | "resolve": "^1.22.0", 2744 | "rollup": "^2.59.0" 2745 | } 2746 | }, 2747 | "warning": { 2748 | "version": "4.0.3", 2749 | "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", 2750 | "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", 2751 | "requires": { 2752 | "loose-envify": "^1.0.0" 2753 | } 2754 | } 2755 | } 2756 | } 2757 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shopping-cart", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "tsc && vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "bootstrap": "^5.1.3", 12 | "react": "^18.0.0", 13 | "react-bootstrap": "^2.4.0", 14 | "react-dom": "^18.0.0", 15 | "react-router-dom": "^6.3.0" 16 | }, 17 | "devDependencies": { 18 | "@types/react": "^18.0.0", 19 | "@types/react-dom": "^18.0.0", 20 | "@vitejs/plugin-react": "^1.3.0", 21 | "typescript": "^4.6.3", 22 | "vite": "^2.9.9" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /public/imgs/banana.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebDevSimplified/react-ts-shopping-cart/a2c836465c5e44bfa89af2ec1a86ffa2655c0231/public/imgs/banana.jpg -------------------------------------------------------------------------------- /public/imgs/book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebDevSimplified/react-ts-shopping-cart/a2c836465c5e44bfa89af2ec1a86ffa2655c0231/public/imgs/book.jpg -------------------------------------------------------------------------------- /public/imgs/car.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebDevSimplified/react-ts-shopping-cart/a2c836465c5e44bfa89af2ec1a86ffa2655c0231/public/imgs/car.jpg -------------------------------------------------------------------------------- /public/imgs/computer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebDevSimplified/react-ts-shopping-cart/a2c836465c5e44bfa89af2ec1a86ffa2655c0231/public/imgs/computer.jpg -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Routes, Route } from "react-router-dom" 2 | import { Container } from "react-bootstrap" 3 | import { Home } from "./pages/Home" 4 | import { Store } from "./pages/Store" 5 | import { About } from "./pages/About" 6 | import { Navbar } from "./components/Navbar" 7 | import { ShoppingCartProvider } from "./context/ShoppingCartContext" 8 | 9 | function App() { 10 | return ( 11 | 12 | 13 | 14 | 15 | } /> 16 | } /> 17 | } /> 18 | 19 | 20 | 21 | ) 22 | } 23 | 24 | export default App 25 | -------------------------------------------------------------------------------- /src/components/CartItem.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Stack } from "react-bootstrap" 2 | import { useShoppingCart } from "../context/ShoppingCartContext" 3 | import storeItems from "../data/items.json" 4 | import { formatCurrency } from "../utilities/formatCurrency" 5 | 6 | type CartItemProps = { 7 | id: number 8 | quantity: number 9 | } 10 | 11 | export function CartItem({ id, quantity }: CartItemProps) { 12 | const { removeFromCart } = useShoppingCart() 13 | const item = storeItems.find(i => i.id === id) 14 | if (item == null) return null 15 | 16 | return ( 17 | 18 | 22 |
23 |
24 | {item.name}{" "} 25 | {quantity > 1 && ( 26 | 27 | x{quantity} 28 | 29 | )} 30 |
31 |
32 | {formatCurrency(item.price)} 33 |
34 |
35 |
{formatCurrency(item.price * quantity)}
36 | 43 |
44 | ) 45 | } 46 | -------------------------------------------------------------------------------- /src/components/Navbar.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Container, Nav, Navbar as NavbarBs } from "react-bootstrap" 2 | import { NavLink } from "react-router-dom" 3 | import { useShoppingCart } from "../context/ShoppingCartContext" 4 | 5 | export function Navbar() { 6 | const { openCart, cartQuantity } = useShoppingCart() 7 | return ( 8 | 9 | 10 | 21 | {cartQuantity > 0 && ( 22 | 51 | )} 52 | 53 | 54 | ) 55 | } 56 | -------------------------------------------------------------------------------- /src/components/ShoppingCart.tsx: -------------------------------------------------------------------------------- 1 | import { Offcanvas, Stack } from "react-bootstrap" 2 | import { useShoppingCart } from "../context/ShoppingCartContext" 3 | import { formatCurrency } from "../utilities/formatCurrency" 4 | import { CartItem } from "./CartItem" 5 | import storeItems from "../data/items.json" 6 | 7 | type ShoppingCartProps = { 8 | isOpen: boolean 9 | } 10 | 11 | export function ShoppingCart({ isOpen }: ShoppingCartProps) { 12 | const { closeCart, cartItems } = useShoppingCart() 13 | return ( 14 | 15 | 16 | Cart 17 | 18 | 19 | 20 | {cartItems.map(item => ( 21 | 22 | ))} 23 |
24 | Total{" "} 25 | {formatCurrency( 26 | cartItems.reduce((total, cartItem) => { 27 | const item = storeItems.find(i => i.id === cartItem.id) 28 | return total + (item?.price || 0) * cartItem.quantity 29 | }, 0) 30 | )} 31 |
32 |
33 |
34 |
35 | ) 36 | } 37 | -------------------------------------------------------------------------------- /src/components/StoreItem.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Card } from "react-bootstrap" 2 | import { useShoppingCart } from "../context/ShoppingCartContext" 3 | import { formatCurrency } from "../utilities/formatCurrency" 4 | 5 | type StoreItemProps = { 6 | id: number 7 | name: string 8 | price: number 9 | imgUrl: string 10 | } 11 | 12 | export function StoreItem({ id, name, price, imgUrl }: StoreItemProps) { 13 | const { 14 | getItemQuantity, 15 | increaseCartQuantity, 16 | decreaseCartQuantity, 17 | removeFromCart, 18 | } = useShoppingCart() 19 | const quantity = getItemQuantity(id) 20 | 21 | return ( 22 | 23 | 29 | 30 | 31 | {name} 32 | {formatCurrency(price)} 33 | 34 |
35 | {quantity === 0 ? ( 36 | 39 | ) : ( 40 |
44 |
48 | 49 |
50 | {quantity} in cart 51 |
52 | 53 |
54 | 61 |
62 | )} 63 |
64 |
65 |
66 | ) 67 | } 68 | -------------------------------------------------------------------------------- /src/context/ShoppingCartContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, ReactNode, useContext, useState } from "react" 2 | import { ShoppingCart } from "../components/ShoppingCart" 3 | import { useLocalStorage } from "../hooks/useLocalStorage" 4 | 5 | type ShoppingCartProviderProps = { 6 | children: ReactNode 7 | } 8 | 9 | type CartItem = { 10 | id: number 11 | quantity: number 12 | } 13 | 14 | type ShoppingCartContext = { 15 | openCart: () => void 16 | closeCart: () => void 17 | getItemQuantity: (id: number) => number 18 | increaseCartQuantity: (id: number) => void 19 | decreaseCartQuantity: (id: number) => void 20 | removeFromCart: (id: number) => void 21 | cartQuantity: number 22 | cartItems: CartItem[] 23 | } 24 | 25 | const ShoppingCartContext = createContext({} as ShoppingCartContext) 26 | 27 | export function useShoppingCart() { 28 | return useContext(ShoppingCartContext) 29 | } 30 | export function ShoppingCartProvider({ children }: ShoppingCartProviderProps) { 31 | const [isOpen, setIsOpen] = useState(false) 32 | const [cartItems, setCartItems] = useLocalStorage( 33 | "shopping-cart", 34 | [] 35 | ) 36 | 37 | const cartQuantity = cartItems.reduce( 38 | (quantity, item) => item.quantity + quantity, 39 | 0 40 | ) 41 | 42 | const openCart = () => setIsOpen(true) 43 | const closeCart = () => setIsOpen(false) 44 | function getItemQuantity(id: number) { 45 | return cartItems.find(item => item.id === id)?.quantity || 0 46 | } 47 | function increaseCartQuantity(id: number) { 48 | setCartItems(currItems => { 49 | if (currItems.find(item => item.id === id) == null) { 50 | return [...currItems, { id, quantity: 1 }] 51 | } else { 52 | return currItems.map(item => { 53 | if (item.id === id) { 54 | return { ...item, quantity: item.quantity + 1 } 55 | } else { 56 | return item 57 | } 58 | }) 59 | } 60 | }) 61 | } 62 | function decreaseCartQuantity(id: number) { 63 | setCartItems(currItems => { 64 | if (currItems.find(item => item.id === id)?.quantity === 1) { 65 | return currItems.filter(item => item.id !== id) 66 | } else { 67 | return currItems.map(item => { 68 | if (item.id === id) { 69 | return { ...item, quantity: item.quantity - 1 } 70 | } else { 71 | return item 72 | } 73 | }) 74 | } 75 | }) 76 | } 77 | function removeFromCart(id: number) { 78 | setCartItems(currItems => { 79 | return currItems.filter(item => item.id !== id) 80 | }) 81 | } 82 | 83 | return ( 84 | 96 | {children} 97 | 98 | 99 | ) 100 | } 101 | -------------------------------------------------------------------------------- /src/data/items.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "Book", 5 | "price": 10.99, 6 | "imgUrl": "/imgs/book.jpg" 7 | }, 8 | { 9 | "id": 2, 10 | "name": "Computer", 11 | "price": 1199, 12 | "imgUrl": "/imgs/computer.jpg" 13 | }, 14 | { 15 | "id": 3, 16 | "name": "Banana", 17 | "price": 1.05, 18 | "imgUrl": "/imgs/banana.jpg" 19 | }, 20 | { 21 | "id": 4, 22 | "name": "Car", 23 | "price": 14000, 24 | "imgUrl": "/imgs/car.jpg" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /src/hooks/useLocalStorage.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | 3 | export function useLocalStorage(key: string, initialValue: T | (() => T)) { 4 | const [value, setValue] = useState(() => { 5 | const jsonValue = localStorage.getItem(key) 6 | if (jsonValue != null) return JSON.parse(jsonValue) 7 | 8 | if (typeof initialValue === "function") { 9 | return (initialValue as () => T)() 10 | } else { 11 | return initialValue 12 | } 13 | }) 14 | 15 | useEffect(() => { 16 | localStorage.setItem(key, JSON.stringify(value)) 17 | }, [key, value]) 18 | 19 | return [value, setValue] as [typeof value, typeof setValue] 20 | } 21 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import ReactDOM from "react-dom/client" 3 | import App from "./App" 4 | import "bootstrap/dist/css/bootstrap.min.css" 5 | import { BrowserRouter } from "react-router-dom" 6 | 7 | ReactDOM.createRoot(document.getElementById("root")!).render( 8 | 9 | 10 | 11 | 12 | 13 | ) 14 | -------------------------------------------------------------------------------- /src/pages/About.tsx: -------------------------------------------------------------------------------- 1 | export function About() { 2 | return

About

3 | } 4 | -------------------------------------------------------------------------------- /src/pages/Home.tsx: -------------------------------------------------------------------------------- 1 | export function Home() { 2 | return

Home

3 | } 4 | -------------------------------------------------------------------------------- /src/pages/Store.tsx: -------------------------------------------------------------------------------- 1 | import { Col, Row } from "react-bootstrap" 2 | import { StoreItem } from "../components/StoreItem" 3 | import storeItems from "../data/items.json" 4 | 5 | export function Store() { 6 | return ( 7 | <> 8 |

Store

9 | 10 | {storeItems.map(item => ( 11 | 12 | 13 | 14 | ))} 15 | 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /src/utilities/formatCurrency.ts: -------------------------------------------------------------------------------- 1 | const CURRENCY_FORMATTER = new Intl.NumberFormat(undefined, { 2 | currency: "USD", 3 | style: "currency", 4 | }) 5 | 6 | export function formatCurrency(number: number) { 7 | return CURRENCY_FORMATTER.format(number) 8 | } 9 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "esnext", 5 | "moduleResolution": "node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 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 | --------------------------------------------------------------------------------