├── README.md ├── .gitattributes ├── frontend ├── build │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── images │ │ ├── logo.png │ │ └── products │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ ├── 6.jpg │ │ │ └── 7.jpg │ ├── asset-manifest.json │ ├── manifest.json │ ├── index.html │ └── static │ │ ├── js │ │ └── main.2532b542.js.LICENSE.txt │ │ └── css │ │ ├── main.e7e95eeb.css │ │ └── main.e7e95eeb.css.map ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── images │ │ ├── logo.png │ │ └── products │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ ├── 6.jpg │ │ │ └── 7.jpg │ ├── manifest.json │ └── index.html ├── src │ ├── components │ │ ├── Footer.js │ │ ├── Header.js │ │ ├── Search.js │ │ └── ProductCard.js │ ├── index.css │ ├── index.js │ ├── pages │ │ ├── Home.js │ │ ├── ProductDetail.js │ │ └── Cart.js │ ├── App.js │ └── App.css ├── package.json └── README.md ├── backend ├── config │ ├── config.env │ └── connectDatabase.js ├── routes │ ├── order.js │ └── product.js ├── models │ ├── orderModel.js │ └── productModel.js ├── package.json ├── controllers │ ├── orderController.js │ └── productController.js ├── app.js ├── data │ └── products.json └── package-lock.json ├── templates ├── images │ ├── logo.png │ └── products │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ └── 7.jpg ├── details.html ├── cart.html ├── index.html └── css │ └── style.css └── package.json /README.md: -------------------------------------------------------------------------------- 1 | # Ecommerce_website -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /frontend/build/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /backend/config/config.env: -------------------------------------------------------------------------------- 1 | PORT=8000 2 | NODE_ENV=production 3 | DB_URL=mongodb://localhost:27017/mini-ecommerce -------------------------------------------------------------------------------- /frontend/build/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/favicon.ico -------------------------------------------------------------------------------- /frontend/build/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/logo192.png -------------------------------------------------------------------------------- /frontend/build/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/logo512.png -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/logo192.png -------------------------------------------------------------------------------- /frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/logo512.png -------------------------------------------------------------------------------- /templates/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/logo.png -------------------------------------------------------------------------------- /frontend/build/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/logo.png -------------------------------------------------------------------------------- /frontend/public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/logo.png -------------------------------------------------------------------------------- /templates/images/products/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/1.jpg -------------------------------------------------------------------------------- /templates/images/products/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/2.jpg -------------------------------------------------------------------------------- /templates/images/products/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/3.jpg -------------------------------------------------------------------------------- /templates/images/products/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/4.jpg -------------------------------------------------------------------------------- /templates/images/products/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/5.jpg -------------------------------------------------------------------------------- /templates/images/products/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/6.jpg -------------------------------------------------------------------------------- /templates/images/products/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/templates/images/products/7.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/1.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/2.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/3.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/4.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/5.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/6.jpg -------------------------------------------------------------------------------- /frontend/build/images/products/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/build/images/products/7.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/1.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/2.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/3.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/4.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/5.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/6.jpg -------------------------------------------------------------------------------- /frontend/public/images/products/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Selva-vignesh-7/Ecommerce_website/HEAD/frontend/public/images/products/7.jpg -------------------------------------------------------------------------------- /backend/routes/order.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const {createOrder} = require('../controllers/orderController'); 4 | 5 | router.route('/order').post(createOrder); 6 | 7 | module.exports = router; 8 | -------------------------------------------------------------------------------- /backend/config/connectDatabase.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const connectDatabase = () => { 4 | mongoose.connect(process.env.DB_URL).then((con) => { 5 | console.log('MongoDB connected to host: '+con.connection.host) 6 | }) 7 | }; 8 | 9 | module.exports = connectDatabase; -------------------------------------------------------------------------------- /frontend/src/components/Footer.js: -------------------------------------------------------------------------------- 1 | export default function Footer() { 2 | return 7 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mini-ecommerce", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "prod" : "node backend/app.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC" 12 | } 13 | -------------------------------------------------------------------------------- /backend/routes/product.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const { getProducts, getSingleProduct } = require('../controllers/productController'); 3 | const router = express.Router(); 4 | 5 | router.route('/products').get(getProducts); 6 | router.route('/product/:id').get(getSingleProduct); 7 | 8 | module.exports = router; -------------------------------------------------------------------------------- /backend/models/orderModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const orderSchema = new mongoose.Schema({ 4 | cartItems: Array, 5 | amount: String, 6 | status: String, 7 | createdAt: Date 8 | }) 9 | 10 | const orderModel = mongoose.model('Order', orderSchema); 11 | 12 | module.exports = orderModel; -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /frontend/build/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "/static/css/main.e7e95eeb.css", 4 | "main.js": "/static/js/main.2532b542.js", 5 | "index.html": "/index.html", 6 | "main.e7e95eeb.css.map": "/static/css/main.e7e95eeb.css.map", 7 | "main.2532b542.js.map": "/static/js/main.2532b542.js.map" 8 | }, 9 | "entrypoints": [ 10 | "static/css/main.e7e95eeb.css", 11 | "static/js/main.2532b542.js" 12 | ] 13 | } -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon app.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "cors": "^2.8.5", 14 | "dotenv": "^16.3.1", 15 | "express": "^4.18.2", 16 | "mongoose": "^8.0.3", 17 | "nodemon": "^3.0.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | const root = ReactDOM.createRoot(document.getElementById('root')); 7 | root.render( 8 | 9 | 10 | 11 | ); 12 | 13 | // If you want to start measuring performance in your app, pass a function 14 | // to log results (for example: reportWebVitals(console.log)) 15 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 16 | -------------------------------------------------------------------------------- /backend/models/productModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const productSchema = new mongoose.Schema({ 4 | name: String, 5 | price: String, 6 | description: String, 7 | ratings: String, 8 | images : [ 9 | { 10 | image: String 11 | } 12 | ], 13 | category: String, 14 | seller: String, 15 | stock: String, 16 | numOfReviews: String, 17 | createdAt: Date 18 | }); 19 | 20 | const productModel = mongoose.model('Product', productSchema); 21 | 22 | module.exports = productModel; -------------------------------------------------------------------------------- /frontend/build/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /frontend/build/index.html: -------------------------------------------------------------------------------- 1 | React App
-------------------------------------------------------------------------------- /backend/controllers/orderController.js: -------------------------------------------------------------------------------- 1 | const orderModel = require('../models/orderModel'); 2 | const productModel = require('../models/productModel'); 3 | 4 | //Create Order - /api/v1/order 5 | exports.createOrder = async (req, res, next) => { 6 | const cartItems = req.body; 7 | const amount = Number(cartItems.reduce((acc, item) => (acc + item.product.price * item.qty), 0)).toFixed(2); 8 | const status = 'pending'; 9 | const order = await orderModel.create({cartItems, amount, status}) 10 | 11 | // Updating product stock 12 | cartItems.forEach(async (item)=> { 13 | const product = await productModel.findById(item.product._id); 14 | product.stock = product.stock - item.qty; 15 | await product.save(); 16 | }) 17 | 18 | 19 | res.json( 20 | { 21 | success:true, 22 | order 23 | } 24 | ) 25 | } -------------------------------------------------------------------------------- /frontend/src/pages/Home.js: -------------------------------------------------------------------------------- 1 | import {Fragment, useEffect, useState} from 'react' 2 | import ProductCard from '../components/ProductCard' 3 | import { useSearchParams } from 'react-router-dom'; 4 | 5 | export default function Home() { 6 | const [products, setProducts] = useState([]); 7 | const [searchParams, setSearchParams] = useSearchParams() 8 | 9 | useEffect(() => { 10 | fetch(process.env.REACT_APP_API_URL+'/products?'+searchParams) 11 | .then(res => res.json()) 12 | .then( res => setProducts(res.products)) 13 | },[searchParams]) 14 | 15 | return 16 |

Latest Products

17 | 18 |
19 |
20 | {products.map(product =>)} 21 |
22 |
23 |
24 | } -------------------------------------------------------------------------------- /frontend/src/components/Header.js: -------------------------------------------------------------------------------- 1 | import { Link } from "react-router-dom"; 2 | import Search from "./Search"; 3 | 4 | export default function Header({cartItems}) { 5 | return 23 | } -------------------------------------------------------------------------------- /backend/controllers/productController.js: -------------------------------------------------------------------------------- 1 | const ProductModel = require('../models/productModel'); 2 | 3 | //Get Products API - /api/v1/products 4 | exports.getProducts = async (req, res, next) => { 5 | const query = req.query.keyword?{ name : { 6 | $regex: req.query.keyword, 7 | $options: 'i' 8 | }}:{} 9 | const products = await ProductModel.find(query); 10 | res.json({ 11 | success: true, 12 | products 13 | }) 14 | } 15 | 16 | //Get Single Product API - /api/v1/product/:id 17 | exports.getSingleProduct = async (req, res, next) => { 18 | try { 19 | const product = await ProductModel.findById(req.params.id); 20 | res.json({ 21 | success: true, 22 | product 23 | }) 24 | } catch (error) { 25 | res.status(404).json({ 26 | success: false, 27 | message: 'Unable to get Product with that ID' 28 | }) 29 | } 30 | } -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const dotenv = require('dotenv'); 4 | const path = require('path'); 5 | const cors = require('cors'); 6 | const connectDatabase = require('./config/connectDatabase'); 7 | dotenv.config({path: path.join(__dirname, 'config', 'config.env')}) 8 | 9 | const products = require('./routes/product'); 10 | const orders = require('./routes/order'); 11 | 12 | connectDatabase(); 13 | 14 | app.use(express.json()); 15 | app.use(cors()); 16 | app.use('/api/v1/',products); 17 | app.use('/api/v1/',orders); 18 | 19 | if (process.env.NODE_ENV == 'production') { 20 | app.use(express.static(path.join(__dirname, '..', 'frontend', 'build'))); 21 | app.get('*', (req, res) => { 22 | res.sendFile(path.resolve(__dirname, '..', 'frontend', 'build', 'index.html')) 23 | }); 24 | } 25 | 26 | app.listen(process.env.PORT, () => { 27 | console.log(`Server listening to Port ${process.env.PORT} in ${process.env.NODE_ENV}`) 28 | }); -------------------------------------------------------------------------------- /frontend/src/components/Search.js: -------------------------------------------------------------------------------- 1 | import {useState} from 'react'; 2 | import {useNavigate} from 'react-router-dom'; 3 | 4 | export default function Search() { 5 | const [keyword, setKeyword] = useState(""); 6 | const navigate = useNavigate(); 7 | 8 | const searchHandler = () => { 9 | navigate('/search?keyword='+keyword) 10 | } 11 | 12 | return
13 | setKeyword(e.target.value)} 17 | className="form-control" 18 | onBlur={searchHandler} 19 | placeholder="Enter Product Name ..." 20 | /> 21 |
22 | 25 |
26 |
27 | } -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.17.0", 7 | "@testing-library/react": "^13.4.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "react": "^18.2.0", 10 | "react-dom": "^18.2.0", 11 | "react-router-dom": "^6.21.1", 12 | "react-scripts": "5.0.1", 13 | "react-toastify": "^9.1.3", 14 | "web-vitals": "^2.1.4" 15 | }, 16 | "scripts": { 17 | "start": "react-scripts start", 18 | "build": "react-scripts build", 19 | "test": "react-scripts test", 20 | "eject": "react-scripts eject" 21 | }, 22 | "eslintConfig": { 23 | "extends": [ 24 | "react-app", 25 | "react-app/jest" 26 | ] 27 | }, 28 | "browserslist": { 29 | "production": [ 30 | ">0.2%", 31 | "not dead", 32 | "not op_mini all" 33 | ], 34 | "development": [ 35 | "last 1 chrome version", 36 | "last 1 firefox version", 37 | "last 1 safari version" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /frontend/src/components/ProductCard.js: -------------------------------------------------------------------------------- 1 | import {Link} from 'react-router-dom'; 2 | 3 | export default function ProductCard({product}) { 4 | return
5 |
6 | 10 |
11 |
12 | {product.name} 13 |
14 |
15 |
16 |
17 |
18 |
19 |

${product.price}

20 | View Details 21 |
22 |
23 |
24 | } -------------------------------------------------------------------------------- /frontend/src/App.js: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import Home from './pages/Home'; 3 | import Header from './components/Header'; 4 | import Footer from './components/Footer'; 5 | import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; 6 | import ProductDetail from './pages/ProductDetail'; 7 | import { useState } from 'react'; 8 | import {ToastContainer} from 'react-toastify'; 9 | import 'react-toastify/dist/ReactToastify.css'; 10 | import Cart from './pages/Cart'; 11 | 12 | function App() { 13 | const [cartItems, setCartItems] = useState([]); 14 | 15 | return ( 16 |
17 | 18 |
19 | 20 |
21 | 22 | }/> 23 | }/> 24 | }/> 25 | }/> 26 | 27 |
28 |
29 |
31 | ); 32 | } 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /frontend/build/static/js/main.2532b542.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /** 2 | * @license React 3 | * react-dom.production.min.js 4 | * 5 | * Copyright (c) Facebook, Inc. and its affiliates. 6 | * 7 | * This source code is licensed under the MIT license found in the 8 | * LICENSE file in the root directory of this source tree. 9 | */ 10 | 11 | /** 12 | * @license React 13 | * react-jsx-runtime.production.min.js 14 | * 15 | * Copyright (c) Facebook, Inc. and its affiliates. 16 | * 17 | * This source code is licensed under the MIT license found in the 18 | * LICENSE file in the root directory of this source tree. 19 | */ 20 | 21 | /** 22 | * @license React 23 | * react.production.min.js 24 | * 25 | * Copyright (c) Facebook, Inc. and its affiliates. 26 | * 27 | * This source code is licensed under the MIT license found in the 28 | * LICENSE file in the root directory of this source tree. 29 | */ 30 | 31 | /** 32 | * @license React 33 | * scheduler.production.min.js 34 | * 35 | * Copyright (c) Facebook, Inc. and its affiliates. 36 | * 37 | * This source code is licensed under the MIT license found in the 38 | * LICENSE file in the root directory of this source tree. 39 | */ 40 | 41 | /** 42 | * @remix-run/router v1.14.1 43 | * 44 | * Copyright (c) Remix Software Inc. 45 | * 46 | * This source code is licensed under the MIT license found in the 47 | * LICENSE.md file in the root directory of this source tree. 48 | * 49 | * @license MIT 50 | */ 51 | 52 | /** 53 | * React Router DOM v6.21.1 54 | * 55 | * Copyright (c) Remix Software Inc. 56 | * 57 | * This source code is licensed under the MIT license found in the 58 | * LICENSE.md file in the root directory of this source tree. 59 | * 60 | * @license MIT 61 | */ 62 | 63 | /** 64 | * React Router v6.21.1 65 | * 66 | * Copyright (c) Remix Software Inc. 67 | * 68 | * This source code is licensed under the MIT license found in the 69 | * LICENSE.md file in the root directory of this source tree. 70 | * 71 | * @license MIT 72 | */ 73 | -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | 32 | 37 | React App 38 | 39 | 40 | 41 |
42 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /templates/details.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Product Details 7 | 12 | 17 | 22 | 23 | 24 | 25 |
26 |
27 |
28 | sdf 29 |
30 | 31 |
32 |

Dell Inspiron 3511 Laptop, Intel i3-1115G4, 8GB, 512GB

33 |

Product # 387874kkfjkf

34 | 35 |
36 | 37 |
38 |
39 |
40 | 41 | 42 |
43 | 44 |

$456.00

45 |
46 | - 47 | 48 | 49 | 50 | + 51 |
52 | 53 | 54 |
55 | 56 |

Status: In Stock

57 | 58 |
59 | 60 |

Description:

61 |

Processor: Intel i5-1235U (3.30 GHz up to 4.40 GHz), 10 Cores & 12MB Cache 62 | RAM & Storage: 8GB, 8Gx1, DDR4, 2666MHz Ach & 512GB SSD 63 | Display & Graphics: 15.6" FHD WVA AG 120Hz 250 nits Narrow Border & Integrated Graphics

64 |
65 |

Sold by: Amazon

66 | 67 |
68 | 69 |
70 | 71 |
72 | 73 |
74 | 75 | -------------------------------------------------------------------------------- /templates/cart.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Cart 7 | 12 | 17 | 22 | 23 | 24 | 25 |
26 |

Your Cart: 2 items

27 | 28 |
29 |
30 |
31 |
32 |
33 |
34 | Laptop 35 |
36 | 37 | 40 | 41 | 42 |
43 |

$245.67

44 |
45 | 46 |
47 |
48 | - 49 | 50 | 51 | + 52 |
53 |
54 | 55 |
56 | 57 |
58 | 59 |
60 |
61 |
62 |
63 | 64 |
65 |
66 |

Order Summary

67 |
68 |

Subtotal: 1 (Units)

69 |

Est. total: $245.67

70 | 71 |
72 | 73 |
74 |
75 |
76 |
77 | 78 | -------------------------------------------------------------------------------- /backend/data/products.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "OPPO F21s Pro 5G", 3 | "price": 245.67, 4 | "description": "OPPO F21s Pro 5G is a powerful device with a RAM extension feature, that offers brilliant operational speed to users.", 5 | "ratings": 4.5, 6 | "images": [ 7 | { 8 | "image": "/images/products/1.jpg" 9 | }, 10 | { 11 | "image": "/images/products/2.jpg" 12 | } 13 | ], 14 | "category": "Mobile Phones", 15 | "seller": "Amazon", 16 | "stock": 5 17 | }, 18 | { 19 | "name": "WRISTIO HD, Bluetooth Calling Smart Watch", 20 | "price": 150.32, 21 | "description": "Minix watches are exclusively designed to fulfill the advanced tech needs of today’s generation.", 22 | "ratings": 3.5, 23 | "images": [ 24 | { 25 | "image": "/images/products/2.jpg" 26 | } 27 | ], 28 | "category": "Accessories", 29 | "seller": "Flipkart", 30 | "stock": 9 31 | }, 32 | { 33 | "name": "Dell Inspiron 3511 Laptop", 34 | "price": 440.57, 35 | "description": "Dell Inspiron 3511 11th Generation Intel Core i5-1135G7 Processor (8MB Cache, up to 4.2 GHz);Operating System: Windows 10 Home Single Language, English", 36 | "ratings": 2, 37 | "images": [ 38 | { 39 | "image": "/images/products/3.jpg" 40 | } 41 | ], 42 | "category": "Laptops", 43 | "seller": "Ebay", 44 | "stock": 9 45 | }, 46 | { 47 | "name": "Lenovo IdeaPad Slim 3 Laptop", 48 | "price": 250.45, 49 | "description": "Lenovo IdeaPad Slim 311th Gen Intel Core i5-1135G7 | Speed: 2.4 GHz (Base) - 4.2 GHz (Max) | 4 Cores | 8 Threads | 8 MB Cache", 50 | "ratings": 4, 51 | "images": [ 52 | { 53 | "image": "/images/products/6.jpg" 54 | } 55 | ], 56 | "category": "Laptops", 57 | "seller": "Ebay", 58 | "stock": 9 59 | }, 60 | { 61 | "name": "ASUS VivoBook 15 Laptop", 62 | "price": 767.32, 63 | "description": "ASUS VivoBook 15 15.6-inch (39.62 cm) HD, Dual Core Intel Celeron N4020, Thin and Light Laptop (4GB RAM/256GB SSD/Integrated Graphics/Windows 11 Home/Transparent Silver/1.8 Kg), X515MA-BR011W", 64 | "ratings": 5, 65 | "images": [ 66 | { 67 | "image": "/images/products/7.jpg" 68 | } 69 | ], 70 | "category": "Laptops", 71 | "seller": "Ebay", 72 | "stock": 9 73 | }, 74 | { 75 | "name": "PTron Newly Launched Tangent Sports, 60Hrs Playtime", 76 | "price": 15.46, 77 | "description": "Gigantic 60 + Hours of music playtime on a single charge; BT5.2 Wireless headphones with ENC (Environmental Noise Cancellation) Technology to enhance your voice quality over the voice calls", 78 | "ratings": 5, 79 | "images": [ 80 | { 81 | "image": "/images/products/4.jpg" 82 | } 83 | ], 84 | "category": "Headphones", 85 | "seller": "Amazon", 86 | "stock": 4 87 | }, 88 | { 89 | "name": "Campus Men's Maxico Running Shoes", 90 | "price": 10.12, 91 | "description": "The high raised back cover with extra padding.", 92 | "ratings": 3, 93 | "images": [ 94 | { 95 | "image": "/images/products/5.jpg" 96 | } 97 | ], 98 | "category": "Sports", 99 | "seller": "Ebay", 100 | "stock": 6 101 | }] -------------------------------------------------------------------------------- /frontend/src/pages/ProductDetail.js: -------------------------------------------------------------------------------- 1 | import {useState, useEffect} from 'react'; 2 | import { useParams } from 'react-router-dom'; 3 | import {toast} from 'react-toastify'; 4 | 5 | export default function ProductDetail({cartItems, setCartItems}) { 6 | const [product, setProduct] = useState(null); 7 | const [qty, setQty] = useState(1); 8 | const {id} = useParams(); 9 | 10 | useEffect(() => { 11 | fetch(process.env.REACT_APP_API_URL+'/product/'+id) 12 | .then(res => res.json()) 13 | .then( res => setProduct(res.product)) 14 | },[]) 15 | 16 | function addToCart() { 17 | const itemExist = cartItems.find((item) => item.product._id == product._id) 18 | if (!itemExist) { 19 | const newItem = {product, qty}; 20 | setCartItems((state) => [...state, newItem]); 21 | toast.success("Cart Item added succesfully!") 22 | } 23 | } 24 | 25 | function increaseQty() { 26 | if (product.stock == qty) { 27 | return; 28 | } 29 | setQty((state) => state + 1); 30 | } 31 | 32 | function decreaseQty() { 33 | if (qty > 1) { 34 | setQty((state) => state - 1); 35 | } 36 | } 37 | 38 | 39 | return product &&
40 |
41 |
42 | sdf 43 |
44 | 45 |
46 |

{product.name}

47 |

Product #{product._id}

48 | 49 |
50 | 51 |
52 |
53 |
54 | 55 | 56 |
57 | 58 |

${product.price}

59 |
60 | - 61 | 62 | 63 | 64 | + 65 |
66 | 67 | 68 |
69 | 70 |

Status: 0 ?'text-success':'text-danger'}>{product.stock > 0 ?'In Stock' : 'Out of Stock'}

71 | 72 |
73 | 74 |

Description:

75 |

{product.description}

76 |
77 |

Sold by: {product.seller}

78 | 79 |
80 | 81 |
82 | 83 |
84 |
85 | } -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /frontend/src/pages/Cart.js: -------------------------------------------------------------------------------- 1 | import {Fragment, useState} from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import {toast} from 'react-toastify'; 4 | 5 | export default function Cart({cartItems, setCartItems}) { 6 | const [complete, setComplete] = useState(false); 7 | 8 | function increaseQty(item) { 9 | if (item.product.stock == item.qty) { 10 | return; 11 | } 12 | const updatedItems = cartItems.map((i) => { 13 | if(i.product._id == item.product._id) { 14 | i.qty++ 15 | } 16 | return i; 17 | }) 18 | setCartItems(updatedItems) 19 | } 20 | 21 | function decreaseQty(item) { 22 | if (item.qty > 1) { 23 | const updatedItems = cartItems.map((i) => { 24 | if(i.product._id == item.product._id) { 25 | i.qty-- 26 | } 27 | return i; 28 | }) 29 | setCartItems(updatedItems) 30 | } 31 | } 32 | 33 | function removeItem(item) { 34 | const updatedItems = cartItems.filter((i) => { 35 | if(i.product._id !== item.product._id) { 36 | return true; 37 | } 38 | }) 39 | setCartItems(updatedItems) 40 | } 41 | 42 | function placeOrderHandler() { 43 | fetch(process.env.REACT_APP_API_URL+'/order', { 44 | method: 'POST', 45 | headers: {'Content-Type': 'application/json'}, 46 | body: JSON.stringify(cartItems) 47 | }) 48 | .then(() => { 49 | setCartItems([]); 50 | setComplete(true); 51 | toast.success("Order Success!") 52 | }) 53 | } 54 | 55 | 56 | 57 | return cartItems.length > 0 ? 58 |
59 |

Your Cart: {cartItems.length} items

60 |
61 |
62 | {cartItems.map((item) => 63 | ( 64 |
65 |
66 |
67 |
68 | {item.product.name} 69 |
70 | 71 |
72 | {item.product.name} 73 |
74 | 75 | 76 |
77 |

${item.product.price}

78 |
79 | 80 |
81 |
82 | decreaseQty(item)}>- 83 | 84 | 85 | increaseQty(item)}>+ 86 |
87 |
88 | 89 |
90 | removeItem(item)} class="fa fa-trash btn btn-danger"> 91 |
92 | 93 |
94 |
95 |
) 96 | )} 97 | 98 |
99 | 100 |
101 |
102 |

Order Summary

103 |
104 |

Subtotal: {cartItems.reduce((acc,item)=> (acc + item.qty), 0)} (Units)

105 |

Est. total: ${Number(cartItems.reduce((acc,item)=> (acc + item.product.price * item.qty), 0)).toFixed(2)}

106 | 107 |
108 | 109 |
110 |
111 |
112 |
113 |
: (!complete ?

Your Cart is Empty!

114 | : 115 |

Order Complete!

116 |

Your order has been placed succesfully.

117 |
) 118 | } -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JVLcart 5 | 10 | 15 | 20 | 21 | 22 | 23 | 51 | 52 |

Latest Products

53 | 54 |
55 |
56 |
57 |
58 | 62 | 74 |
75 |
76 | 77 |
78 |
79 | 83 |
84 |
85 | WRISTIO HD, Bluetooth Calling Smart Watch, 15 days battery life, Water Resistant 88 |
89 |
90 | 91 | 92 | 93 | 94 | 95 | (5 Reviews) 96 |
97 |

$150.32

98 | View Details 99 |
100 |
101 |
102 | 103 |
104 |
105 | 109 |
110 |
111 | Dell Inspiron 3511 Laptop, Intel i3-1115G4, 8GB, 512GB 114 |
115 |
116 | 117 | 118 | 119 | 120 | 121 | (5 Reviews) 122 |
123 |

$440.57

124 | View Details 125 |
126 |
127 |
128 | 129 |
130 |
131 | 135 |
136 |
137 | PTron Newly Launched Tangent Sports, 60Hrs Playtime 138 |
139 |
140 | 141 | 142 | 143 | 144 | 145 | (5 Reviews) 146 |
147 |

$15.46

148 | 149 | View Details 150 |
151 |
152 |
153 | 154 |
155 |
156 | 160 |
161 |
162 | Campus Men's Maxico Running Shoes 163 |
164 |
165 | 166 | 167 | 168 | 169 | 170 | (5 Reviews) 171 |
172 |

$10.12

173 | View Details 174 |
175 |
176 |
177 |
178 |
179 | 180 | 185 | 186 | 195 | 196 | 197 | -------------------------------------------------------------------------------- /templates/css/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | font-family: 'Amazon Ember'; 4 | width: 100%; 5 | height: 100%; 6 | margin: 0px; 7 | padding: 0px; 8 | overflow-x: hidden; 9 | } 10 | 11 | /* Scroll Bar */ 12 | 13 | ::-webkit-scrollbar-track { 14 | background-color: #f5f5f5; 15 | } 16 | 17 | ::-webkit-scrollbar { 18 | width: 8px; 19 | background-color: #f5f5f5; 20 | } 21 | 22 | ::-webkit-scrollbar-thumb { 23 | background-color: rgba(66, 66, 66, 0.2); 24 | border: 0px; 25 | background-clip: padding-box; 26 | border-radius: 5px; 27 | } 28 | 29 | nav { 30 | background-color: #232f3e; 31 | padding: 1rem 1rem; 32 | } 33 | 34 | #search_btn { 35 | background-color: #febd69; 36 | } 37 | 38 | .input-group { 39 | width: 90%; 40 | margin-right: 35%; 41 | } 42 | 43 | #search_field { 44 | height: 2.4rem; 45 | padding: 1rem; 46 | } 47 | 48 | #login_btn, 49 | #view_btn { 50 | background-color: #febd69; 51 | padding: 0.4rem 1.8rem; 52 | font-family: calibri; 53 | } 54 | 55 | #cart { 56 | font-size: 1rem; 57 | color: white; 58 | } 59 | 60 | #cart_count { 61 | background-color: #febd69; 62 | padding: 0.2rem 0.5rem; 63 | border-radius: 0.2rem; 64 | color: black; 65 | font-weight: bold; 66 | font-size: 0.9rem; 67 | } 68 | 69 | /* Home page */ 70 | #products_heading { 71 | margin-top: 1.8rem; 72 | } 73 | 74 | .card { 75 | height: 100%; 76 | } 77 | 78 | .card-title a { 79 | color: #2e2e2e; 80 | } 81 | 82 | .card-title a:hover { 83 | color: #fa9c23; 84 | text-decoration: none; 85 | } 86 | 87 | .card-body { 88 | padding-left: 0; 89 | } 90 | 91 | .card-text { 92 | font-size: 1.4rem; 93 | } 94 | 95 | #view_btn { 96 | background-color: #fa9c23; 97 | color: white; 98 | } 99 | 100 | .card-img-top { 101 | width: 200px; 102 | height: 150px; 103 | } 104 | 105 | .ratings { 106 | font-size: 1.2rem; 107 | color: #fdcc0d; 108 | } 109 | 110 | #no_of_reviews { 111 | font-size: 0.85rem; 112 | color: grey; 113 | margin-left: 0.5rem; 114 | } 115 | 116 | /* Footer */ 117 | footer { 118 | margin-top: 8rem; 119 | color: grey; 120 | bottom: 0; 121 | width: 100%; 122 | } 123 | 124 | /* Ratings */ 125 | 126 | .rating-outer { 127 | display: inline-block; 128 | position: relative; 129 | font-family: FontAwesome; 130 | color: #fdcc0d; 131 | } 132 | 133 | .rating-outer::before { 134 | content: '\f006 \f006 \f006 \f006 \f006'; 135 | } 136 | 137 | .rating-inner { 138 | position: absolute; 139 | top: 0; 140 | left: 0; 141 | white-space: nowrap; 142 | overflow: hidden; 143 | width: 0; 144 | } 145 | 146 | .rating-inner::before { 147 | content: '\f005 \f005 \f005 \f005 \f005'; 148 | color: #f8ce0b; 149 | } 150 | 151 | /* Product Details Page */ 152 | #product_id { 153 | color: grey; 154 | font-size: 0.8rem; 155 | } 156 | 157 | #product_price { 158 | font-size: 2rem; 159 | font-weight: bold; 160 | } 161 | 162 | #cart_btn, 163 | #review_btn { 164 | border-radius: 2rem; 165 | background-color: #fa9c23; 166 | border: none; 167 | padding: 0.5rem 2rem; 168 | } 169 | 170 | #product_seller { 171 | color: grey; 172 | font-size: 0.9rem; 173 | } 174 | 175 | #stock_status { 176 | font-size: 1.1rem; 177 | font-weight: bold; 178 | margin-left: 0.3rem; 179 | } 180 | 181 | .redColor { 182 | color: red; 183 | } 184 | 185 | .greenColor { 186 | color: green; 187 | } 188 | 189 | #product_image { 190 | margin-top: 9rem; 191 | } 192 | 193 | /* Loader */ 194 | .loader { 195 | display: block; 196 | margin-left: auto; 197 | margin-right: auto; 198 | margin-top: 20%; 199 | width: 80px; 200 | height: 80px; 201 | padding-left: 0; 202 | } 203 | .loader:after { 204 | content: ' '; 205 | display: block; 206 | width: 64px; 207 | height: 64px; 208 | margin: 8px; 209 | border-radius: 50%; 210 | border: 6px solid #fa9c23; 211 | border-color: #fa9c23 transparent; 212 | animation: lds-dual-ring 1.2s linear infinite; 213 | } 214 | @keyframes lds-dual-ring { 215 | 0% { 216 | transform: rotate(0deg); 217 | } 218 | 100% { 219 | transform: rotate(360deg); 220 | } 221 | } 222 | 223 | /* Cart */ 224 | 225 | .cart-item { 226 | margin: 1.8rem 0rem; 227 | padding: 0rem 0.7rem; 228 | } 229 | 230 | .cart-item a { 231 | color: grey; 232 | } 233 | 234 | #delete_cart_item { 235 | color: red; 236 | background: white; 237 | padding: 0.3rem 0.5rem; 238 | font-size: 1.1rem; 239 | border: none; 240 | } 241 | 242 | #card_item_price { 243 | color: #febd69; 244 | font-weight: bold; 245 | font-size: 1.4rem; 246 | } 247 | 248 | #checkout_btn, 249 | .review-btn { 250 | background-color: #fa9c23; 251 | border-color: #fa9c23; 252 | margin-top: 2rem; 253 | border-radius: 5rem; 254 | } 255 | 256 | #view_order_details { 257 | background-color: #fa9c23; 258 | border-color: #fa9c23; 259 | } 260 | 261 | #order_summary { 262 | border: 1px solid #e3e3e3; 263 | border-radius: 1rem; 264 | padding: 2rem 1.5rem; 265 | } 266 | 267 | .order-summary-values { 268 | float: right; 269 | font-weight: bold; 270 | } 271 | 272 | .stockCounter input { 273 | border: none; 274 | width: 3rem; 275 | text-align: center; 276 | } 277 | 278 | .plus, 279 | .minus { 280 | padding: 0.1rem 0.5rem; 281 | } 282 | 283 | .stockCounter input::-webkit-outer-spin-button, 284 | .stockCounter input::-webkit-inner-spin-button { 285 | -webkit-appearance: none; 286 | margin: 0; 287 | } 288 | 289 | .form-control:disabled, 290 | .form-control[readonly] { 291 | background-color: white; 292 | } 293 | 294 | /* Login & Register */ 295 | 296 | .wrapper { 297 | display: flex; 298 | justify-content: center; 299 | align-items: center; 300 | margin-top: 5rem; 301 | 302 | font-weight: 700; 303 | } 304 | 305 | .wrapper form { 306 | padding: 2.5rem 3rem; 307 | } 308 | 309 | .wrapper form .btn { 310 | background-color: #fa9c23; 311 | border-color: #fa9c23; 312 | color: white; 313 | margin-top: 2.5rem; 314 | } 315 | 316 | .wrapper form a { 317 | font-size: 0.9rem; 318 | color: grey; 319 | } 320 | 321 | /* Avatar */ 322 | .avatar { 323 | display: inline-block; 324 | margin-bottom: 0; 325 | height: 3rem; 326 | width: 3rem; 327 | -webkit-border-radius: 50%; 328 | -moz-border-radius: 50%; 329 | border-radius: 50%; 330 | } 331 | 332 | .avatar img { 333 | width: 100%; 334 | height: 100%; 335 | object-fit: cover; 336 | } 337 | 338 | .rounded-circle { 339 | border-radius: 50% !important; 340 | } 341 | 342 | .btn.focus, 343 | .btn:focus { 344 | outline: 0; 345 | box-shadow: none; 346 | } 347 | 348 | /* Header User Profile */ 349 | 350 | .avatar-nav { 351 | margin-right: 0.6rem; 352 | height: 2.2rem; 353 | width: 2.2rem; 354 | } 355 | 356 | /* Checkout Steps */ 357 | 358 | .checkout-progress div { 359 | box-sizing: border-box; 360 | } 361 | 362 | .checkout-progress { 363 | display: block; 364 | clear: both; 365 | margin: 20px auto; 366 | width: auto; 367 | font-family: sans-serif; 368 | overflow: auto; 369 | } 370 | 371 | .step { 372 | margin: 0; 373 | border: 0; 374 | letter-spacing: 1px; 375 | line-height: 30px; 376 | padding: 5px 10px 5px 15px; 377 | color: grey; 378 | text-decoration: none; 379 | cursor: default; 380 | font-weight: bold; 381 | float: left; 382 | height: auto; 383 | } 384 | 385 | .incomplete { 386 | background: #eeeeee; 387 | } 388 | 389 | .active-step { 390 | background: #fa9c23; 391 | color: #fff; 392 | } 393 | 394 | .triangle-active { 395 | float: left; 396 | width: 0; 397 | border-top: 20px solid transparent; 398 | border-left: 15px solid #fa9c23; 399 | border-bottom: 20px solid transparent; 400 | margin-left: -1px; 401 | } 402 | 403 | .triangle2-active { 404 | width: 0; 405 | float: left; 406 | border-top: 20px solid #fa9c23; 407 | border-left: 15px solid #fff; 408 | border-bottom: 20px solid #fa9c23; 409 | margin-right: -1px; 410 | } 411 | 412 | .triangle-incomplete { 413 | float: left; 414 | width: 0; 415 | border-top: 20px solid transparent; 416 | border-left: 15px solid #eeeeee; 417 | border-bottom: 20px solid transparent; 418 | margin-left: -1px; 419 | } 420 | 421 | .triangle2-incomplete { 422 | width: 0; 423 | float: left; 424 | border-top: 20px solid #eeeeee; 425 | border-left: 15px solid #fff; 426 | border-bottom: 20px solid #eeeeee; 427 | margin-right: -1px; 428 | } 429 | 430 | /* User Profile */ 431 | 432 | .avatar-profile { 433 | height: 16rem; 434 | width: 16rem; 435 | } 436 | 437 | .user-info h4 { 438 | font-weight: 800; 439 | color: grey; 440 | margin-top: 2rem; 441 | } 442 | 443 | .user-info p { 444 | font-size: 1.1rem; 445 | } 446 | 447 | #edit_profile { 448 | background-color: #fa9c23; 449 | border-color: #fa9c23; 450 | } 451 | 452 | /* Confirm Order */ 453 | 454 | .order-confirm p, 455 | .order-details p { 456 | margin-left: 1.5rem; 457 | } 458 | 459 | .update-btn { 460 | background-color: #fa9c23; 461 | border-color: #fa9c23; 462 | color: white; 463 | } 464 | 465 | .update-btn:hover { 466 | color: white; 467 | } 468 | 469 | /* Pagination */ 470 | .page-item.active .page-link { 471 | background-color: #fa9c23; 472 | border-color: #fa9c23; 473 | } 474 | 475 | .page-link { 476 | color: #fa9c23; 477 | } 478 | 479 | .page-link:hover { 480 | color: #fa9c23; 481 | } 482 | 483 | /* Admin Sidebar */ 484 | 485 | .sidebar-wrapper { 486 | display: flex; 487 | width: 100%; 488 | align-items: stretch; 489 | min-height: 100vh; 490 | font-weight: normal; 491 | 492 | margin-top: 0; 493 | height: 100%; 494 | left: 0; 495 | top: 0; 496 | z-index: 10; 497 | } 498 | #sidebar { 499 | min-width: 100%; 500 | max-width: 100%; 501 | background: #232f3e; 502 | color: #fff; 503 | transition: all 0.3s; 504 | } 505 | #sidebar.active { 506 | margin-left: -250px; 507 | } 508 | 509 | #sidebar .sidebar-header { 510 | padding: 20px; 511 | background: #232f3e; 512 | } 513 | #sidebar ul.components { 514 | padding: 5px 0px; 515 | border-bottom: 1px solid #232f3e; 516 | } 517 | 518 | #sidebar ul li a { 519 | padding: 10px; 520 | font-size: 1.1em; 521 | display: block; 522 | color: white; 523 | text-decoration: none; 524 | } 525 | #sidebar ul li a:hover { 526 | color: #232f3e; 527 | background: #fff; 528 | } 529 | 530 | #sidebar ul li a i { 531 | margin-right: 0.3rem; 532 | } 533 | 534 | #sidebar ul li.active > a, 535 | a[aria-expanded='true'] { 536 | color: #fff; 537 | background: #232f3e; 538 | } 539 | a[data-toggle='collapse'] { 540 | position: relative; 541 | } 542 | .dropdown-toggle::after { 543 | display: block; 544 | position: absolute; 545 | top: 50%; 546 | right: 20px; 547 | transform: translateY(-50%); 548 | } 549 | 550 | ul ul a { 551 | font-size: 1rem !important; 552 | padding-left: 30px !important; 553 | background: #232f3e; 554 | } 555 | 556 | ul.CTAs { 557 | padding: 20px; 558 | } 559 | 560 | ul.CTAs a { 561 | text-align: center; 562 | font-size: 0.9em !important; 563 | display: block; 564 | border-radius: 5px; 565 | margin-bottom: 5px; 566 | } 567 | 568 | /* Products List Admin */ 569 | #products_table .btn { 570 | padding: 0.2rem 0.5rem; 571 | margin-left: 0.4rem; 572 | } 573 | 574 | /* Dashboard */ 575 | 576 | .card-font-size { 577 | font-size: 1.5rem; 578 | } 579 | 580 | /* Reviews */ 581 | 582 | .rating { 583 | margin-top: 10rem; 584 | } 585 | 586 | .stars { 587 | height: 100px; 588 | display: flex; 589 | align-items: center; 590 | padding-left: 0; 591 | } 592 | 593 | .star { 594 | display: inline; 595 | list-style: none; 596 | font-size: 3rem; 597 | padding-left: 0.9rem; 598 | color: #e3e3e3; 599 | } 600 | 601 | .star:first-child { 602 | padding-left: 0; 603 | } 604 | 605 | .orange { 606 | color: #fa9c23; 607 | } 608 | 609 | .yellow { 610 | color: #fdcc0d; 611 | } 612 | 613 | .review_user { 614 | font-size: 0.8rem; 615 | color: grey; 616 | } 617 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | 40 | /* Mini Ecommerce Custom css */ 41 | html, 42 | body { 43 | font-family: 'Amazon Ember'; 44 | width: 100%; 45 | height: 100%; 46 | margin: 0px; 47 | padding: 0px; 48 | overflow-x: hidden; 49 | } 50 | 51 | /* Scroll Bar */ 52 | 53 | ::-webkit-scrollbar-track { 54 | background-color: #f5f5f5; 55 | } 56 | 57 | ::-webkit-scrollbar { 58 | width: 8px; 59 | background-color: #f5f5f5; 60 | } 61 | 62 | ::-webkit-scrollbar-thumb { 63 | background-color: rgba(66, 66, 66, 0.2); 64 | border: 0px; 65 | background-clip: padding-box; 66 | border-radius: 5px; 67 | } 68 | 69 | nav { 70 | background-color: #232f3e; 71 | padding: 1rem 1rem; 72 | } 73 | 74 | #search_btn { 75 | background-color: #febd69; 76 | } 77 | 78 | .input-group { 79 | width: 90%; 80 | margin-right: 35%; 81 | } 82 | 83 | #search_field { 84 | height: 2.4rem; 85 | padding: 1rem; 86 | } 87 | 88 | #login_btn, 89 | #view_btn { 90 | background-color: #febd69; 91 | padding: 0.4rem 1.8rem; 92 | font-family: calibri; 93 | } 94 | 95 | #cart { 96 | font-size: 1rem; 97 | color: white; 98 | } 99 | 100 | #cart_count { 101 | background-color: #febd69; 102 | padding: 0.2rem 0.5rem; 103 | border-radius: 0.2rem; 104 | color: black; 105 | font-weight: bold; 106 | font-size: 0.9rem; 107 | } 108 | 109 | /* Home page */ 110 | #products_heading { 111 | margin-top: 1.8rem; 112 | } 113 | 114 | .card { 115 | height: 100%; 116 | } 117 | 118 | .card-title a { 119 | color: #2e2e2e; 120 | } 121 | 122 | .card-title a:hover { 123 | color: #fa9c23; 124 | text-decoration: none; 125 | } 126 | 127 | .card-body { 128 | padding-left: 0; 129 | } 130 | 131 | .card-text { 132 | font-size: 1.4rem; 133 | } 134 | 135 | #view_btn { 136 | background-color: #fa9c23; 137 | color: white; 138 | } 139 | 140 | .card-img-top { 141 | width: 200px; 142 | height: 150px; 143 | } 144 | 145 | .ratings { 146 | font-size: 1.2rem; 147 | color: #fdcc0d; 148 | } 149 | 150 | #no_of_reviews { 151 | font-size: 0.85rem; 152 | color: grey; 153 | margin-left: 0.5rem; 154 | } 155 | 156 | /* Footer */ 157 | footer { 158 | margin-top: 8rem; 159 | color: grey; 160 | bottom: 0; 161 | width: 100%; 162 | } 163 | 164 | /* Ratings */ 165 | 166 | .rating-outer { 167 | display: inline-block; 168 | position: relative; 169 | font-family: FontAwesome; 170 | color: #fdcc0d; 171 | } 172 | 173 | .rating-outer::before { 174 | content: '\f006 \f006 \f006 \f006 \f006'; 175 | } 176 | 177 | .rating-inner { 178 | position: absolute; 179 | top: 0; 180 | left: 0; 181 | white-space: nowrap; 182 | overflow: hidden; 183 | width: 0; 184 | } 185 | 186 | .rating-inner::before { 187 | content: '\f005 \f005 \f005 \f005 \f005'; 188 | color: #f8ce0b; 189 | } 190 | 191 | /* Product Details Page */ 192 | #product_id { 193 | color: grey; 194 | font-size: 0.8rem; 195 | } 196 | 197 | #product_price { 198 | font-size: 2rem; 199 | font-weight: bold; 200 | } 201 | 202 | #cart_btn, 203 | #review_btn { 204 | border-radius: 2rem; 205 | background-color: #fa9c23; 206 | border: none; 207 | padding: 0.5rem 2rem; 208 | } 209 | 210 | #product_seller { 211 | color: grey; 212 | font-size: 0.9rem; 213 | } 214 | 215 | #stock_status { 216 | font-size: 1.1rem; 217 | font-weight: bold; 218 | margin-left: 0.3rem; 219 | } 220 | 221 | .redColor { 222 | color: red; 223 | } 224 | 225 | .greenColor { 226 | color: green; 227 | } 228 | 229 | #product_image { 230 | margin-top: 9rem; 231 | } 232 | 233 | /* Loader */ 234 | .loader { 235 | display: block; 236 | margin-left: auto; 237 | margin-right: auto; 238 | margin-top: 20%; 239 | width: 80px; 240 | height: 80px; 241 | padding-left: 0; 242 | } 243 | .loader:after { 244 | content: ' '; 245 | display: block; 246 | width: 64px; 247 | height: 64px; 248 | margin: 8px; 249 | border-radius: 50%; 250 | border: 6px solid #fa9c23; 251 | border-color: #fa9c23 transparent; 252 | animation: lds-dual-ring 1.2s linear infinite; 253 | } 254 | @keyframes lds-dual-ring { 255 | 0% { 256 | transform: rotate(0deg); 257 | } 258 | 100% { 259 | transform: rotate(360deg); 260 | } 261 | } 262 | 263 | /* Cart */ 264 | 265 | .cart-item { 266 | margin: 1.8rem 0rem; 267 | padding: 0rem 0.7rem; 268 | } 269 | 270 | .cart-item a { 271 | color: grey; 272 | } 273 | 274 | #delete_cart_item { 275 | color: red; 276 | background: white; 277 | padding: 0.3rem 0.5rem; 278 | font-size: 1.1rem; 279 | border: none; 280 | } 281 | 282 | #card_item_price { 283 | color: #febd69; 284 | font-weight: bold; 285 | font-size: 1.4rem; 286 | } 287 | 288 | #checkout_btn, 289 | .review-btn { 290 | background-color: #fa9c23; 291 | border-color: #fa9c23; 292 | margin-top: 2rem; 293 | border-radius: 5rem; 294 | } 295 | 296 | #view_order_details { 297 | background-color: #fa9c23; 298 | border-color: #fa9c23; 299 | } 300 | 301 | #order_summary { 302 | border: 1px solid #e3e3e3; 303 | border-radius: 1rem; 304 | padding: 2rem 1.5rem; 305 | } 306 | 307 | .order-summary-values { 308 | float: right; 309 | font-weight: bold; 310 | } 311 | 312 | .stockCounter input { 313 | border: none; 314 | width: 3rem; 315 | text-align: center; 316 | } 317 | 318 | .plus, 319 | .minus { 320 | padding: 0.1rem 0.5rem; 321 | } 322 | 323 | .stockCounter input::-webkit-outer-spin-button, 324 | .stockCounter input::-webkit-inner-spin-button { 325 | -webkit-appearance: none; 326 | margin: 0; 327 | } 328 | 329 | .form-control:disabled, 330 | .form-control[readonly] { 331 | background-color: white; 332 | } 333 | 334 | /* Login & Register */ 335 | 336 | .wrapper { 337 | display: flex; 338 | justify-content: center; 339 | align-items: center; 340 | margin-top: 5rem; 341 | 342 | font-weight: 700; 343 | } 344 | 345 | .wrapper form { 346 | padding: 2.5rem 3rem; 347 | } 348 | 349 | .wrapper form .btn { 350 | background-color: #fa9c23; 351 | border-color: #fa9c23; 352 | color: white; 353 | margin-top: 2.5rem; 354 | } 355 | 356 | .wrapper form a { 357 | font-size: 0.9rem; 358 | color: grey; 359 | } 360 | 361 | /* Avatar */ 362 | .avatar { 363 | display: inline-block; 364 | margin-bottom: 0; 365 | height: 3rem; 366 | width: 3rem; 367 | -webkit-border-radius: 50%; 368 | -moz-border-radius: 50%; 369 | border-radius: 50%; 370 | } 371 | 372 | .avatar img { 373 | width: 100%; 374 | height: 100%; 375 | object-fit: cover; 376 | } 377 | 378 | .rounded-circle { 379 | border-radius: 50% !important; 380 | } 381 | 382 | .btn.focus, 383 | .btn:focus { 384 | outline: 0; 385 | box-shadow: none; 386 | } 387 | 388 | /* Header User Profile */ 389 | 390 | .avatar-nav { 391 | margin-right: 0.6rem; 392 | height: 2.2rem; 393 | width: 2.2rem; 394 | } 395 | 396 | /* Checkout Steps */ 397 | 398 | .checkout-progress div { 399 | box-sizing: border-box; 400 | } 401 | 402 | .checkout-progress { 403 | display: block; 404 | clear: both; 405 | margin: 20px auto; 406 | width: auto; 407 | font-family: sans-serif; 408 | overflow: auto; 409 | } 410 | 411 | .step { 412 | margin: 0; 413 | border: 0; 414 | letter-spacing: 1px; 415 | line-height: 30px; 416 | padding: 5px 10px 5px 15px; 417 | color: grey; 418 | text-decoration: none; 419 | cursor: default; 420 | font-weight: bold; 421 | float: left; 422 | height: auto; 423 | } 424 | 425 | .incomplete { 426 | background: #eeeeee; 427 | } 428 | 429 | .active-step { 430 | background: #fa9c23; 431 | color: #fff; 432 | } 433 | 434 | .triangle-active { 435 | float: left; 436 | width: 0; 437 | border-top: 20px solid transparent; 438 | border-left: 15px solid #fa9c23; 439 | border-bottom: 20px solid transparent; 440 | margin-left: -1px; 441 | } 442 | 443 | .triangle2-active { 444 | width: 0; 445 | float: left; 446 | border-top: 20px solid #fa9c23; 447 | border-left: 15px solid #fff; 448 | border-bottom: 20px solid #fa9c23; 449 | margin-right: -1px; 450 | } 451 | 452 | .triangle-incomplete { 453 | float: left; 454 | width: 0; 455 | border-top: 20px solid transparent; 456 | border-left: 15px solid #eeeeee; 457 | border-bottom: 20px solid transparent; 458 | margin-left: -1px; 459 | } 460 | 461 | .triangle2-incomplete { 462 | width: 0; 463 | float: left; 464 | border-top: 20px solid #eeeeee; 465 | border-left: 15px solid #fff; 466 | border-bottom: 20px solid #eeeeee; 467 | margin-right: -1px; 468 | } 469 | 470 | /* User Profile */ 471 | 472 | .avatar-profile { 473 | height: 16rem; 474 | width: 16rem; 475 | } 476 | 477 | .user-info h4 { 478 | font-weight: 800; 479 | color: grey; 480 | margin-top: 2rem; 481 | } 482 | 483 | .user-info p { 484 | font-size: 1.1rem; 485 | } 486 | 487 | #edit_profile { 488 | background-color: #fa9c23; 489 | border-color: #fa9c23; 490 | } 491 | 492 | /* Confirm Order */ 493 | 494 | .order-confirm p, 495 | .order-details p { 496 | margin-left: 1.5rem; 497 | } 498 | 499 | .update-btn { 500 | background-color: #fa9c23; 501 | border-color: #fa9c23; 502 | color: white; 503 | } 504 | 505 | .update-btn:hover { 506 | color: white; 507 | } 508 | 509 | /* Pagination */ 510 | .page-item.active .page-link { 511 | background-color: #fa9c23; 512 | border-color: #fa9c23; 513 | } 514 | 515 | .page-link { 516 | color: #fa9c23; 517 | } 518 | 519 | .page-link:hover { 520 | color: #fa9c23; 521 | } 522 | 523 | /* Admin Sidebar */ 524 | 525 | .sidebar-wrapper { 526 | display: flex; 527 | width: 100%; 528 | align-items: stretch; 529 | min-height: 100vh; 530 | font-weight: normal; 531 | 532 | margin-top: 0; 533 | height: 100%; 534 | left: 0; 535 | top: 0; 536 | z-index: 10; 537 | } 538 | #sidebar { 539 | min-width: 100%; 540 | max-width: 100%; 541 | background: #232f3e; 542 | color: #fff; 543 | transition: all 0.3s; 544 | } 545 | #sidebar.active { 546 | margin-left: -250px; 547 | } 548 | 549 | #sidebar .sidebar-header { 550 | padding: 20px; 551 | background: #232f3e; 552 | } 553 | #sidebar ul.components { 554 | padding: 5px 0px; 555 | border-bottom: 1px solid #232f3e; 556 | } 557 | 558 | #sidebar ul li a { 559 | padding: 10px; 560 | font-size: 1.1em; 561 | display: block; 562 | color: white; 563 | text-decoration: none; 564 | } 565 | #sidebar ul li a:hover { 566 | color: #232f3e; 567 | background: #fff; 568 | } 569 | 570 | #sidebar ul li a i { 571 | margin-right: 0.3rem; 572 | } 573 | 574 | #sidebar ul li.active > a, 575 | a[aria-expanded='true'] { 576 | color: #fff; 577 | background: #232f3e; 578 | } 579 | a[data-toggle='collapse'] { 580 | position: relative; 581 | } 582 | .dropdown-toggle::after { 583 | display: block; 584 | position: absolute; 585 | top: 50%; 586 | right: 20px; 587 | transform: translateY(-50%); 588 | } 589 | 590 | ul ul a { 591 | font-size: 1rem !important; 592 | padding-left: 30px !important; 593 | background: #232f3e; 594 | } 595 | 596 | ul.CTAs { 597 | padding: 20px; 598 | } 599 | 600 | ul.CTAs a { 601 | text-align: center; 602 | font-size: 0.9em !important; 603 | display: block; 604 | border-radius: 5px; 605 | margin-bottom: 5px; 606 | } 607 | 608 | /* Products List Admin */ 609 | #products_table .btn { 610 | padding: 0.2rem 0.5rem; 611 | margin-left: 0.4rem; 612 | } 613 | 614 | /* Dashboard */ 615 | 616 | .card-font-size { 617 | font-size: 1.5rem; 618 | } 619 | 620 | /* Reviews */ 621 | 622 | .rating { 623 | margin-top: 10rem; 624 | } 625 | 626 | .stars { 627 | height: 100px; 628 | display: flex; 629 | align-items: center; 630 | padding-left: 0; 631 | } 632 | 633 | .star { 634 | display: inline; 635 | list-style: none; 636 | font-size: 3rem; 637 | padding-left: 0.9rem; 638 | color: #e3e3e3; 639 | } 640 | 641 | .star:first-child { 642 | padding-left: 0; 643 | } 644 | 645 | .orange { 646 | color: #fa9c23; 647 | } 648 | 649 | .yellow { 650 | color: #fdcc0d; 651 | } 652 | 653 | .review_user { 654 | font-size: 0.8rem; 655 | color: grey; 656 | } 657 | -------------------------------------------------------------------------------- /frontend/build/static/css/main.e7e95eeb.css: -------------------------------------------------------------------------------- 1 | body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{animation:App-logo-spin 20s linear infinite}}.App-header{align-items:center;background-color:#282c34;color:#fff;display:flex;flex-direction:column;font-size:calc(10px + 2vmin);justify-content:center;min-height:100vh}.App-link{color:#61dafb}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}body,html{font-family:Amazon Ember;height:100%;margin:0;overflow-x:hidden;padding:0;width:100%}::-webkit-scrollbar,::-webkit-scrollbar-track{background-color:#f5f5f5}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#42424233;border:0;border-radius:5px}nav{background-color:#232f3e;padding:1rem}#search_btn{background-color:#febd69}.input-group{margin-right:35%;width:90%}#search_field{height:2.4rem;padding:1rem}#login_btn,#view_btn{background-color:#febd69;font-family:calibri;padding:.4rem 1.8rem}#cart{color:#fff;font-size:1rem}#cart_count{background-color:#febd69;border-radius:.2rem;color:#000;font-size:.9rem;font-weight:700;padding:.2rem .5rem}#products_heading{margin-top:1.8rem}.card{height:100%}.card-title a{color:#2e2e2e}.card-title a:hover{color:#fa9c23;text-decoration:none}.card-body{padding-left:0}.card-text{font-size:1.4rem}#view_btn{background-color:#fa9c23;color:#fff}.card-img-top{height:150px;width:200px}.ratings{color:#fdcc0d;font-size:1.2rem}#no_of_reviews{color:grey;font-size:.85rem;margin-left:.5rem}footer{bottom:0;color:grey;margin-top:8rem;width:100%}.rating-outer{color:#fdcc0d;display:inline-block;font-family:FontAwesome;position:relative}.rating-outer:before{content:"\f006 \f006 \f006 \f006 \f006"}.rating-inner{left:0;overflow:hidden;position:absolute;top:0;white-space:nowrap;width:0}.rating-inner:before{color:#f8ce0b;content:"\f005 \f005 \f005 \f005 \f005"}#product_id{color:grey;font-size:.8rem}#product_price{font-size:2rem;font-weight:700}#cart_btn,#review_btn{background-color:#fa9c23;border:none;border-radius:2rem;padding:.5rem 2rem}#product_seller{color:grey;font-size:.9rem}#stock_status{font-size:1.1rem;font-weight:700;margin-left:.3rem}.redColor{color:red}.greenColor{color:green}#product_image{margin-top:9rem}.loader{display:block;height:80px;margin-left:auto;margin-right:auto;margin-top:20%;padding-left:0;width:80px}.loader:after{animation:lds-dual-ring 1.2s linear infinite;border-color:#fa9c23 #0000;border-radius:50%;border-style:solid;border-width:6px;content:" ";display:block;height:64px;margin:8px;width:64px}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.cart-item{margin:1.8rem 0;padding:0 .7rem}.cart-item a{color:grey}#delete_cart_item{background:#fff;border:none;color:red;font-size:1.1rem;padding:.3rem .5rem}#card_item_price{color:#febd69;font-size:1.4rem;font-weight:700}#checkout_btn,.review-btn{background-color:#fa9c23;border-color:#fa9c23;border-radius:5rem;margin-top:2rem}#view_order_details{background-color:#fa9c23;border-color:#fa9c23}#order_summary{border:1px solid #e3e3e3;border-radius:1rem;padding:2rem 1.5rem}.order-summary-values{float:right;font-weight:700}.stockCounter input{border:none;text-align:center;width:3rem}.minus,.plus{padding:.1rem .5rem}.stockCounter input::-webkit-inner-spin-button,.stockCounter input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.form-control:disabled,.form-control[readonly]{background-color:#fff}.wrapper{align-items:center;display:flex;font-weight:700;justify-content:center;margin-top:5rem}.wrapper form{padding:2.5rem 3rem}.wrapper form .btn{background-color:#fa9c23;border-color:#fa9c23;color:#fff;margin-top:2.5rem}.wrapper form a{color:grey;font-size:.9rem}.avatar{border-radius:50%;display:inline-block;height:3rem;margin-bottom:0;width:3rem}.avatar img{height:100%;object-fit:cover;width:100%}.rounded-circle{border-radius:50%!important}.btn.focus,.btn:focus{box-shadow:none;outline:0}.avatar-nav{height:2.2rem;margin-right:.6rem;width:2.2rem}.checkout-progress div{box-sizing:border-box}.checkout-progress{clear:both;display:block;font-family:sans-serif;margin:20px auto;overflow:auto;width:auto}.step{border:0;color:grey;cursor:default;float:left;font-weight:700;height:auto;letter-spacing:1px;line-height:30px;margin:0;padding:5px 10px 5px 15px;text-decoration:none}.incomplete{background:#eee}.active-step{background:#fa9c23;color:#fff}.triangle-active{border-bottom:20px solid #0000;border-left:15px solid #fa9c23;border-top:20px solid #0000;float:left;margin-left:-1px;width:0}.triangle2-active{border-bottom:20px solid #fa9c23;border-left:15px solid #fff;border-top:20px solid #fa9c23;float:left;margin-right:-1px;width:0}.triangle-incomplete{border-bottom:20px solid #0000;border-left:15px solid #eee;border-top:20px solid #0000;float:left;margin-left:-1px;width:0}.triangle2-incomplete{border-bottom:20px solid #eee;border-left:15px solid #fff;border-top:20px solid #eee;float:left;margin-right:-1px;width:0}.avatar-profile{height:16rem;width:16rem}.user-info h4{color:grey;font-weight:800;margin-top:2rem}.user-info p{font-size:1.1rem}#edit_profile{background-color:#fa9c23;border-color:#fa9c23}.order-confirm p,.order-details p{margin-left:1.5rem}.update-btn{background-color:#fa9c23;border-color:#fa9c23;color:#fff}.update-btn:hover{color:#fff}.page-item.active .page-link{background-color:#fa9c23;border-color:#fa9c23}.page-link,.page-link:hover{color:#fa9c23}.sidebar-wrapper{align-items:stretch;display:flex;font-weight:400;height:100%;left:0;margin-top:0;min-height:100vh;top:0;width:100%;z-index:10}#sidebar{background:#232f3e;color:#fff;max-width:100%;min-width:100%;transition:all .3s}#sidebar.active{margin-left:-250px}#sidebar .sidebar-header{background:#232f3e;padding:20px}#sidebar ul.components{border-bottom:1px solid #232f3e;padding:5px 0}#sidebar ul li a{color:#fff;display:block;font-size:1.1em;padding:10px;text-decoration:none}#sidebar ul li a:hover{background:#fff;color:#232f3e}#sidebar ul li a i{margin-right:.3rem}#sidebar ul li.active>a,a[aria-expanded=true]{background:#232f3e;color:#fff}a[data-toggle=collapse]{position:relative}.dropdown-toggle:after{display:block;position:absolute;right:20px;top:50%;transform:translateY(-50%)}ul ul a{background:#232f3e;font-size:1rem!important;padding-left:30px!important}ul.CTAs{padding:20px}ul.CTAs a{border-radius:5px;display:block;font-size:.9em!important;margin-bottom:5px;text-align:center}#products_table .btn{margin-left:.4rem;padding:.2rem .5rem}.card-font-size{font-size:1.5rem}.rating{margin-top:10rem}.stars{align-items:center;display:flex;height:100px;padding-left:0}.star{color:#e3e3e3;display:inline;font-size:3rem;list-style:none;padding-left:.9rem}.star:first-child{padding-left:0}.orange{color:#fa9c23}.yellow{color:#fdcc0d}.review_user{color:grey;font-size:.8rem}:root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:#ffffffb3;--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-light:#757575;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error)}.Toastify__toast-container{box-sizing:border-box;color:#fff;padding:4px;position:fixed;-webkit-transform:translateZ(9999);-webkit-transform:translateZ(var(--toastify-z-index));width:320px;width:var(--toastify-toast-width);z-index:9999;z-index:var(--toastify-z-index)}.Toastify__toast-container--top-left{left:1em;top:1em}.Toastify__toast-container--top-center{left:50%;top:1em;transform:translateX(-50%)}.Toastify__toast-container--top-right{right:1em;top:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;transform:translateX(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width:480px){.Toastify__toast-container{left:0;margin:0;padding:0;width:100vw}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;transform:translateX(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;transform:translateX(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{border-radius:4px;box-shadow:0 1px 10px 0 #0000001a,0 2px 15px 0 #0000000d;box-sizing:border-box;cursor:default;direction:ltr;display:flex;font-family:sans-serif;font-family:var(--toastify-font-family);justify-content:space-between;margin-bottom:1rem;max-height:800px;max-height:var(--toastify-toast-max-height);min-height:64px;min-height:var(--toastify-toast-min-height);overflow:hidden;padding:8px;position:relative;z-index:0}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-body{align-items:center;display:flex;flex:1 1 auto;margin:auto 0;padding:6px}.Toastify__toast-body>div:last-child{flex:1 1;word-break:break-word}.Toastify__toast-icon{display:flex;flex-shrink:0;margin-inline-end:10px;width:20px}.Toastify--animate{animation-duration:.7s;animation-fill-mode:both}.Toastify--animate-icon{animation-duration:.3s;animation-fill-mode:both}@media only screen and (max-width:480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:#121212;background:var(--toastify-color-dark);color:#fff;color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:#fff;background:var(--toastify-color-light);color:#757575;color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:#3498db;background:var(--toastify-color-info);color:#fff;color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:#07bc0c;background:var(--toastify-color-success);color:#fff;color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:#f1c40f;background:var(--toastify-color-warning);color:#fff;color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:#e74c3c;background:var(--toastify-color-error);color:#fff;color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:#bb86fc;background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:#3498db;background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:#07bc0c;background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:#f1c40f;background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:#e74c3c;background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:#ffffffb3;background:var(--toastify-color-transparent)}.Toastify__close-button{align-self:flex-start;background:#0000;border:none;color:#fff;cursor:pointer;opacity:.7;outline:none;padding:0;transition:.3s ease}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{bottom:0;height:5px;left:0;opacity:.7;position:absolute;transform-origin:left;width:100%;z-index:9999;z-index:var(--toastify-z-index)}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{left:auto;right:0;transform-origin:right}.Toastify__spinner{animation:Toastify__spin .65s linear infinite;border:2px solid #e0e0e0;border-color:var(--toastify-spinner-color-empty-area);border-radius:100%;border-right-color:#616161;border-right-color:var(--toastify-spinner-color);box-sizing:border-box;height:20px;width:20px}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateX(90deg)}40%{animation-timing-function:ease-in;transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;transform:perspective(400px) rotateX(10deg)}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotateX(-20deg)}to{opacity:0;transform:perspective(400px) rotateX(90deg)}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideOutRight{0%{transform:translateZ(0)}to{transform:translate3d(110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutLeft{0%{transform:translateZ(0)}to{transform:translate3d(-110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutDown{0%{transform:translateZ(0)}to{transform:translate3d(0,500px,0);visibility:hidden}}@keyframes Toastify__slideOutUp{0%{transform:translateZ(0)}to{transform:translate3d(0,-500px,0);visibility:hidden}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown}@keyframes Toastify__spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} 2 | /*# sourceMappingURL=main.e7e95eeb.css.map*/ -------------------------------------------------------------------------------- /frontend/build/static/css/main.e7e95eeb.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"static/css/main.e7e95eeb.css","mappings":"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","sources":["index.css","App.css","../node_modules/react-toastify/scss/_variables.scss","../node_modules/react-toastify/dist/ReactToastify.css","../node_modules/react-toastify/scss/_toastContainer.scss","../node_modules/react-toastify/scss/_toast.scss","../node_modules/react-toastify/scss/_theme.scss","../node_modules/react-toastify/scss/_closeButton.scss","../node_modules/react-toastify/scss/_progressBar.scss","../node_modules/react-toastify/scss/_icons.scss","../node_modules/react-toastify/scss/animations/_bounce.scss","../node_modules/react-toastify/scss/animations/_zoom.scss","../node_modules/react-toastify/scss/animations/_flip.scss","../node_modules/react-toastify/scss/animations/_slide.scss","../node_modules/react-toastify/scss/animations/_spin.scss"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n",".App {\n text-align: center;\n}\n\n.App-logo {\n height: 40vmin;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .App-logo {\n animation: App-logo-spin infinite 20s linear;\n }\n}\n\n.App-header {\n background-color: #282c34;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Mini Ecommerce Custom css */\nhtml,\nbody {\n font-family: 'Amazon Ember';\n width: 100%;\n height: 100%;\n margin: 0px;\n padding: 0px;\n overflow-x: hidden;\n}\n\n/* Scroll Bar */\n\n::-webkit-scrollbar-track {\n background-color: #f5f5f5;\n}\n\n::-webkit-scrollbar {\n width: 8px;\n background-color: #f5f5f5;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: rgba(66, 66, 66, 0.2);\n border: 0px;\n background-clip: padding-box;\n border-radius: 5px;\n}\n\nnav {\n background-color: #232f3e;\n padding: 1rem 1rem;\n}\n\n#search_btn {\n background-color: #febd69;\n}\n\n.input-group {\n width: 90%;\n margin-right: 35%;\n}\n\n#search_field {\n height: 2.4rem;\n padding: 1rem;\n}\n\n#login_btn,\n#view_btn {\n background-color: #febd69;\n padding: 0.4rem 1.8rem;\n font-family: calibri;\n}\n\n#cart {\n font-size: 1rem;\n color: white;\n}\n\n#cart_count {\n background-color: #febd69;\n padding: 0.2rem 0.5rem;\n border-radius: 0.2rem;\n color: black;\n font-weight: bold;\n font-size: 0.9rem;\n}\n\n/* Home page */\n#products_heading {\n margin-top: 1.8rem;\n}\n\n.card {\n height: 100%;\n}\n\n.card-title a {\n color: #2e2e2e;\n}\n\n.card-title a:hover {\n color: #fa9c23;\n text-decoration: none;\n}\n\n.card-body {\n padding-left: 0;\n}\n\n.card-text {\n font-size: 1.4rem;\n}\n\n#view_btn {\n background-color: #fa9c23;\n color: white;\n}\n\n.card-img-top {\n width: 200px;\n height: 150px;\n}\n\n.ratings {\n font-size: 1.2rem;\n color: #fdcc0d;\n}\n\n#no_of_reviews {\n font-size: 0.85rem;\n color: grey;\n margin-left: 0.5rem;\n}\n\n/* Footer */\nfooter {\n margin-top: 8rem;\n color: grey;\n bottom: 0;\n width: 100%;\n}\n\n/* Ratings */\n\n.rating-outer {\n display: inline-block;\n position: relative;\n font-family: FontAwesome;\n color: #fdcc0d;\n}\n\n.rating-outer::before {\n content: '\\f006 \\f006 \\f006 \\f006 \\f006';\n}\n\n.rating-inner {\n position: absolute;\n top: 0;\n left: 0;\n white-space: nowrap;\n overflow: hidden;\n width: 0;\n}\n\n.rating-inner::before {\n content: '\\f005 \\f005 \\f005 \\f005 \\f005';\n color: #f8ce0b;\n}\n\n/* Product Details Page */\n#product_id {\n color: grey;\n font-size: 0.8rem;\n}\n\n#product_price {\n font-size: 2rem;\n font-weight: bold;\n}\n\n#cart_btn,\n#review_btn {\n border-radius: 2rem;\n background-color: #fa9c23;\n border: none;\n padding: 0.5rem 2rem;\n}\n\n#product_seller {\n color: grey;\n font-size: 0.9rem;\n}\n\n#stock_status {\n font-size: 1.1rem;\n font-weight: bold;\n margin-left: 0.3rem;\n}\n\n.redColor {\n color: red;\n}\n\n.greenColor {\n color: green;\n}\n\n#product_image {\n margin-top: 9rem;\n}\n\n/* Loader */\n.loader {\n display: block;\n margin-left: auto;\n margin-right: auto;\n margin-top: 20%;\n width: 80px;\n height: 80px;\n padding-left: 0;\n}\n.loader:after {\n content: ' ';\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #fa9c23;\n border-color: #fa9c23 transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n}\n@keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n/* Cart */\n\n.cart-item {\n margin: 1.8rem 0rem;\n padding: 0rem 0.7rem;\n}\n\n.cart-item a {\n color: grey;\n}\n\n#delete_cart_item {\n color: red;\n background: white;\n padding: 0.3rem 0.5rem;\n font-size: 1.1rem;\n border: none;\n}\n\n#card_item_price {\n color: #febd69;\n font-weight: bold;\n font-size: 1.4rem;\n}\n\n#checkout_btn,\n.review-btn {\n background-color: #fa9c23;\n border-color: #fa9c23;\n margin-top: 2rem;\n border-radius: 5rem;\n}\n\n#view_order_details {\n background-color: #fa9c23;\n border-color: #fa9c23;\n}\n\n#order_summary {\n border: 1px solid #e3e3e3;\n border-radius: 1rem;\n padding: 2rem 1.5rem;\n}\n\n.order-summary-values {\n float: right;\n font-weight: bold;\n}\n\n.stockCounter input {\n border: none;\n width: 3rem;\n text-align: center;\n}\n\n.plus,\n.minus {\n padding: 0.1rem 0.5rem;\n}\n\n.stockCounter input::-webkit-outer-spin-button,\n.stockCounter input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.form-control:disabled,\n.form-control[readonly] {\n background-color: white;\n}\n\n/* Login & Register */\n\n.wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n margin-top: 5rem;\n\n font-weight: 700;\n}\n\n.wrapper form {\n padding: 2.5rem 3rem;\n}\n\n.wrapper form .btn {\n background-color: #fa9c23;\n border-color: #fa9c23;\n color: white;\n margin-top: 2.5rem;\n}\n\n.wrapper form a {\n font-size: 0.9rem;\n color: grey;\n}\n\n/* Avatar */\n.avatar {\n display: inline-block;\n margin-bottom: 0;\n height: 3rem;\n width: 3rem;\n -webkit-border-radius: 50%;\n -moz-border-radius: 50%;\n border-radius: 50%;\n}\n\n.avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.btn.focus,\n.btn:focus {\n outline: 0;\n box-shadow: none;\n}\n\n/* Header User Profile */\n\n.avatar-nav {\n margin-right: 0.6rem;\n height: 2.2rem;\n width: 2.2rem;\n}\n\n/* Checkout Steps */\n\n.checkout-progress div {\n box-sizing: border-box;\n}\n\n.checkout-progress {\n display: block;\n clear: both;\n margin: 20px auto;\n width: auto;\n font-family: sans-serif;\n overflow: auto;\n}\n\n.step {\n margin: 0;\n border: 0;\n letter-spacing: 1px;\n line-height: 30px;\n padding: 5px 10px 5px 15px;\n color: grey;\n text-decoration: none;\n cursor: default;\n font-weight: bold;\n float: left;\n height: auto;\n}\n\n.incomplete {\n background: #eeeeee;\n}\n\n.active-step {\n background: #fa9c23;\n color: #fff;\n}\n\n.triangle-active {\n float: left;\n width: 0;\n border-top: 20px solid transparent;\n border-left: 15px solid #fa9c23;\n border-bottom: 20px solid transparent;\n margin-left: -1px;\n}\n\n.triangle2-active {\n width: 0;\n float: left;\n border-top: 20px solid #fa9c23;\n border-left: 15px solid #fff;\n border-bottom: 20px solid #fa9c23;\n margin-right: -1px;\n}\n\n.triangle-incomplete {\n float: left;\n width: 0;\n border-top: 20px solid transparent;\n border-left: 15px solid #eeeeee;\n border-bottom: 20px solid transparent;\n margin-left: -1px;\n}\n\n.triangle2-incomplete {\n width: 0;\n float: left;\n border-top: 20px solid #eeeeee;\n border-left: 15px solid #fff;\n border-bottom: 20px solid #eeeeee;\n margin-right: -1px;\n}\n\n/* User Profile */\n\n.avatar-profile {\n height: 16rem;\n width: 16rem;\n}\n\n.user-info h4 {\n font-weight: 800;\n color: grey;\n margin-top: 2rem;\n}\n\n.user-info p {\n font-size: 1.1rem;\n}\n\n#edit_profile {\n background-color: #fa9c23;\n border-color: #fa9c23;\n}\n\n/* Confirm Order */\n\n.order-confirm p,\n.order-details p {\n margin-left: 1.5rem;\n}\n\n.update-btn {\n background-color: #fa9c23;\n border-color: #fa9c23;\n color: white;\n}\n\n.update-btn:hover {\n color: white;\n}\n\n/* Pagination */\n.page-item.active .page-link {\n background-color: #fa9c23;\n border-color: #fa9c23;\n}\n\n.page-link {\n color: #fa9c23;\n}\n\n.page-link:hover {\n color: #fa9c23;\n}\n\n/* Admin Sidebar */\n\n.sidebar-wrapper {\n display: flex;\n width: 100%;\n align-items: stretch;\n min-height: 100vh;\n font-weight: normal;\n\n margin-top: 0;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 10;\n}\n#sidebar {\n min-width: 100%;\n max-width: 100%;\n background: #232f3e;\n color: #fff;\n transition: all 0.3s;\n}\n#sidebar.active {\n margin-left: -250px;\n}\n\n#sidebar .sidebar-header {\n padding: 20px;\n background: #232f3e;\n}\n#sidebar ul.components {\n padding: 5px 0px;\n border-bottom: 1px solid #232f3e;\n}\n\n#sidebar ul li a {\n padding: 10px;\n font-size: 1.1em;\n display: block;\n color: white;\n text-decoration: none;\n}\n#sidebar ul li a:hover {\n color: #232f3e;\n background: #fff;\n}\n\n#sidebar ul li a i {\n margin-right: 0.3rem;\n}\n\n#sidebar ul li.active > a,\na[aria-expanded='true'] {\n color: #fff;\n background: #232f3e;\n}\na[data-toggle='collapse'] {\n position: relative;\n}\n.dropdown-toggle::after {\n display: block;\n position: absolute;\n top: 50%;\n right: 20px;\n transform: translateY(-50%);\n}\n\nul ul a {\n font-size: 1rem !important;\n padding-left: 30px !important;\n background: #232f3e;\n}\n\nul.CTAs {\n padding: 20px;\n}\n\nul.CTAs a {\n text-align: center;\n font-size: 0.9em !important;\n display: block;\n border-radius: 5px;\n margin-bottom: 5px;\n}\n\n/* Products List Admin */\n#products_table .btn {\n padding: 0.2rem 0.5rem;\n margin-left: 0.4rem;\n}\n\n/* Dashboard */\n\n.card-font-size {\n font-size: 1.5rem;\n}\n\n/* Reviews */\n\n.rating {\n margin-top: 10rem;\n}\n\n.stars {\n height: 100px;\n display: flex;\n align-items: center;\n padding-left: 0;\n}\n\n.star {\n display: inline;\n list-style: none;\n font-size: 3rem;\n padding-left: 0.9rem;\n color: #e3e3e3;\n}\n\n.star:first-child {\n padding-left: 0;\n}\n\n.orange {\n color: #fa9c23;\n}\n\n.yellow {\n color: #fdcc0d;\n}\n\n.review_user {\n font-size: 0.8rem;\n color: grey;\n}\n","$rt-namespace: 'Toastify';\n$rt-mobile: 'only screen and (max-width : 480px)' !default;\n\n:root {\n --toastify-color-light: #fff;\n --toastify-color-dark: #121212;\n --toastify-color-info: #3498db;\n --toastify-color-success: #07bc0c;\n --toastify-color-warning: #f1c40f;\n --toastify-color-error: #e74c3c;\n --toastify-color-transparent: rgba(255, 255, 255, 0.7);\n\n --toastify-icon-color-info: var(--toastify-color-info);\n --toastify-icon-color-success: var(--toastify-color-success);\n --toastify-icon-color-warning: var(--toastify-color-warning);\n --toastify-icon-color-error: var(--toastify-color-error);\n\n --toastify-toast-width: 320px;\n --toastify-toast-background: #fff;\n --toastify-toast-min-height: 64px;\n --toastify-toast-max-height: 800px;\n --toastify-font-family: sans-serif;\n --toastify-z-index: 9999;\n\n --toastify-text-color-light: #757575;\n --toastify-text-color-dark: #fff;\n\n //Used only for colored theme\n --toastify-text-color-info: #fff;\n --toastify-text-color-success: #fff;\n --toastify-text-color-warning: #fff;\n --toastify-text-color-error: #fff;\n\n --toastify-spinner-color: #616161;\n --toastify-spinner-color-empty-area: #e0e0e0;\n\n // Used when no type is provided\n --toastify-color-progress-light: linear-gradient(\n to right,\n #4cd964,\n #5ac8fa,\n #007aff,\n #34aadc,\n #5856d6,\n #ff2d55\n );\n // Used when no type is provided\n --toastify-color-progress-dark: #bb86fc;\n --toastify-color-progress-info: var(--toastify-color-info);\n --toastify-color-progress-success: var(--toastify-color-success);\n --toastify-color-progress-warning: var(--toastify-color-warning);\n --toastify-color-progress-error: var(--toastify-color-error);\n}\n",":root {\n --toastify-color-light: #fff;\n --toastify-color-dark: #121212;\n --toastify-color-info: #3498db;\n --toastify-color-success: #07bc0c;\n --toastify-color-warning: #f1c40f;\n --toastify-color-error: #e74c3c;\n --toastify-color-transparent: rgba(255, 255, 255, 0.7);\n --toastify-icon-color-info: var(--toastify-color-info);\n --toastify-icon-color-success: var(--toastify-color-success);\n --toastify-icon-color-warning: var(--toastify-color-warning);\n --toastify-icon-color-error: var(--toastify-color-error);\n --toastify-toast-width: 320px;\n --toastify-toast-background: #fff;\n --toastify-toast-min-height: 64px;\n --toastify-toast-max-height: 800px;\n --toastify-font-family: sans-serif;\n --toastify-z-index: 9999;\n --toastify-text-color-light: #757575;\n --toastify-text-color-dark: #fff;\n --toastify-text-color-info: #fff;\n --toastify-text-color-success: #fff;\n --toastify-text-color-warning: #fff;\n --toastify-text-color-error: #fff;\n --toastify-spinner-color: #616161;\n --toastify-spinner-color-empty-area: #e0e0e0;\n --toastify-color-progress-light: linear-gradient(\n to right,\n #4cd964,\n #5ac8fa,\n #007aff,\n #34aadc,\n #5856d6,\n #ff2d55\n );\n --toastify-color-progress-dark: #bb86fc;\n --toastify-color-progress-info: var(--toastify-color-info);\n --toastify-color-progress-success: var(--toastify-color-success);\n --toastify-color-progress-warning: var(--toastify-color-warning);\n --toastify-color-progress-error: var(--toastify-color-error);\n}\n\n.Toastify__toast-container {\n z-index: var(--toastify-z-index);\n -webkit-transform: translate3d(0, 0, var(--toastify-z-index));\n position: fixed;\n padding: 4px;\n width: var(--toastify-toast-width);\n box-sizing: border-box;\n color: #fff;\n}\n.Toastify__toast-container--top-left {\n top: 1em;\n left: 1em;\n}\n.Toastify__toast-container--top-center {\n top: 1em;\n left: 50%;\n transform: translateX(-50%);\n}\n.Toastify__toast-container--top-right {\n top: 1em;\n right: 1em;\n}\n.Toastify__toast-container--bottom-left {\n bottom: 1em;\n left: 1em;\n}\n.Toastify__toast-container--bottom-center {\n bottom: 1em;\n left: 50%;\n transform: translateX(-50%);\n}\n.Toastify__toast-container--bottom-right {\n bottom: 1em;\n right: 1em;\n}\n\n@media only screen and (max-width : 480px) {\n .Toastify__toast-container {\n width: 100vw;\n padding: 0;\n left: 0;\n margin: 0;\n }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .Toastify__toast-container--top-right {\n top: 0;\n transform: translateX(0);\n }\n .Toastify__toast-container--bottom-left, .Toastify__toast-container--bottom-center, .Toastify__toast-container--bottom-right {\n bottom: 0;\n transform: translateX(0);\n }\n .Toastify__toast-container--rtl {\n right: 0;\n left: initial;\n }\n}\n.Toastify__toast {\n position: relative;\n min-height: var(--toastify-toast-min-height);\n box-sizing: border-box;\n margin-bottom: 1rem;\n padding: 8px;\n border-radius: 4px;\n box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: justify;\n justify-content: space-between;\n max-height: var(--toastify-toast-max-height);\n overflow: hidden;\n font-family: var(--toastify-font-family);\n cursor: default;\n direction: ltr;\n /* webkit only issue #791 */\n z-index: 0;\n}\n.Toastify__toast--rtl {\n direction: rtl;\n}\n.Toastify__toast--close-on-click {\n cursor: pointer;\n}\n.Toastify__toast-body {\n margin: auto 0;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 6px;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n.Toastify__toast-body > div:last-child {\n word-break: break-word;\n -ms-flex: 1;\n flex: 1;\n}\n.Toastify__toast-icon {\n -webkit-margin-end: 10px;\n margin-inline-end: 10px;\n width: 20px;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n display: -ms-flexbox;\n display: flex;\n}\n\n.Toastify--animate {\n animation-fill-mode: both;\n animation-duration: 0.7s;\n}\n\n.Toastify--animate-icon {\n animation-fill-mode: both;\n animation-duration: 0.3s;\n}\n\n@media only screen and (max-width : 480px) {\n .Toastify__toast {\n margin-bottom: 0;\n border-radius: 0;\n }\n}\n.Toastify__toast-theme--dark {\n background: var(--toastify-color-dark);\n color: var(--toastify-text-color-dark);\n}\n.Toastify__toast-theme--light {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n}\n.Toastify__toast-theme--colored.Toastify__toast--default {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n}\n.Toastify__toast-theme--colored.Toastify__toast--info {\n color: var(--toastify-text-color-info);\n background: var(--toastify-color-info);\n}\n.Toastify__toast-theme--colored.Toastify__toast--success {\n color: var(--toastify-text-color-success);\n background: var(--toastify-color-success);\n}\n.Toastify__toast-theme--colored.Toastify__toast--warning {\n color: var(--toastify-text-color-warning);\n background: var(--toastify-color-warning);\n}\n.Toastify__toast-theme--colored.Toastify__toast--error {\n color: var(--toastify-text-color-error);\n background: var(--toastify-color-error);\n}\n\n.Toastify__progress-bar-theme--light {\n background: var(--toastify-color-progress-light);\n}\n.Toastify__progress-bar-theme--dark {\n background: var(--toastify-color-progress-dark);\n}\n.Toastify__progress-bar--info {\n background: var(--toastify-color-progress-info);\n}\n.Toastify__progress-bar--success {\n background: var(--toastify-color-progress-success);\n}\n.Toastify__progress-bar--warning {\n background: var(--toastify-color-progress-warning);\n}\n.Toastify__progress-bar--error {\n background: var(--toastify-color-progress-error);\n}\n.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--success, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--error {\n background: var(--toastify-color-transparent);\n}\n\n.Toastify__close-button {\n color: #fff;\n background: transparent;\n outline: none;\n border: none;\n padding: 0;\n cursor: pointer;\n opacity: 0.7;\n transition: 0.3s ease;\n -ms-flex-item-align: start;\n align-self: flex-start;\n}\n.Toastify__close-button--light {\n color: #000;\n opacity: 0.3;\n}\n.Toastify__close-button > svg {\n fill: currentColor;\n height: 16px;\n width: 14px;\n}\n.Toastify__close-button:hover, .Toastify__close-button:focus {\n opacity: 1;\n}\n\n@keyframes Toastify__trackProgress {\n 0% {\n transform: scaleX(1);\n }\n 100% {\n transform: scaleX(0);\n }\n}\n.Toastify__progress-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 5px;\n z-index: var(--toastify-z-index);\n opacity: 0.7;\n transform-origin: left;\n}\n.Toastify__progress-bar--animated {\n animation: Toastify__trackProgress linear 1 forwards;\n}\n.Toastify__progress-bar--controlled {\n transition: transform 0.2s;\n}\n.Toastify__progress-bar--rtl {\n right: 0;\n left: initial;\n transform-origin: right;\n}\n\n.Toastify__spinner {\n width: 20px;\n height: 20px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: var(--toastify-spinner-color-empty-area);\n border-right-color: var(--toastify-spinner-color);\n animation: Toastify__spin 0.65s linear infinite;\n}\n\n@keyframes Toastify__bounceInRight {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n from {\n opacity: 0;\n transform: translate3d(3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(-25px, 0, 0);\n }\n 75% {\n transform: translate3d(10px, 0, 0);\n }\n 90% {\n transform: translate3d(-5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutRight {\n 20% {\n opacity: 1;\n transform: translate3d(-20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(2000px, 0, 0);\n }\n}\n@keyframes Toastify__bounceInLeft {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n 0% {\n opacity: 0;\n transform: translate3d(-3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(25px, 0, 0);\n }\n 75% {\n transform: translate3d(-10px, 0, 0);\n }\n 90% {\n transform: translate3d(5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutLeft {\n 20% {\n opacity: 1;\n transform: translate3d(20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(-2000px, 0, 0);\n }\n}\n@keyframes Toastify__bounceInUp {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n from {\n opacity: 0;\n transform: translate3d(0, 3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n 75% {\n transform: translate3d(0, 10px, 0);\n }\n 90% {\n transform: translate3d(0, -5px, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__bounceOutUp {\n 20% {\n transform: translate3d(0, -10px, 0);\n }\n 40%, 45% {\n opacity: 1;\n transform: translate3d(0, 20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, -2000px, 0);\n }\n}\n@keyframes Toastify__bounceInDown {\n from, 60%, 75%, 90%, to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n 0% {\n opacity: 0;\n transform: translate3d(0, -3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, 25px, 0);\n }\n 75% {\n transform: translate3d(0, -10px, 0);\n }\n 90% {\n transform: translate3d(0, 5px, 0);\n }\n to {\n transform: none;\n }\n}\n@keyframes Toastify__bounceOutDown {\n 20% {\n transform: translate3d(0, 10px, 0);\n }\n 40%, 45% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, 2000px, 0);\n }\n}\n.Toastify__bounce-enter--top-left, .Toastify__bounce-enter--bottom-left {\n animation-name: Toastify__bounceInLeft;\n}\n.Toastify__bounce-enter--top-right, .Toastify__bounce-enter--bottom-right {\n animation-name: Toastify__bounceInRight;\n}\n.Toastify__bounce-enter--top-center {\n animation-name: Toastify__bounceInDown;\n}\n.Toastify__bounce-enter--bottom-center {\n animation-name: Toastify__bounceInUp;\n}\n\n.Toastify__bounce-exit--top-left, .Toastify__bounce-exit--bottom-left {\n animation-name: Toastify__bounceOutLeft;\n}\n.Toastify__bounce-exit--top-right, .Toastify__bounce-exit--bottom-right {\n animation-name: Toastify__bounceOutRight;\n}\n.Toastify__bounce-exit--top-center {\n animation-name: Toastify__bounceOutUp;\n}\n.Toastify__bounce-exit--bottom-center {\n animation-name: Toastify__bounceOutDown;\n}\n\n@keyframes Toastify__zoomIn {\n from {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n 50% {\n opacity: 1;\n }\n}\n@keyframes Toastify__zoomOut {\n from {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n to {\n opacity: 0;\n }\n}\n.Toastify__zoom-enter {\n animation-name: Toastify__zoomIn;\n}\n\n.Toastify__zoom-exit {\n animation-name: Toastify__zoomOut;\n}\n\n@keyframes Toastify__flipIn {\n from {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n animation-timing-function: ease-in;\n opacity: 0;\n }\n 40% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n animation-timing-function: ease-in;\n }\n 60% {\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n 80% {\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n to {\n transform: perspective(400px);\n }\n}\n@keyframes Toastify__flipOut {\n from {\n transform: perspective(400px);\n }\n 30% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n to {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n.Toastify__flip-enter {\n animation-name: Toastify__flipIn;\n}\n\n.Toastify__flip-exit {\n animation-name: Toastify__flipOut;\n}\n\n@keyframes Toastify__slideInRight {\n from {\n transform: translate3d(110%, 0, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInLeft {\n from {\n transform: translate3d(-110%, 0, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInUp {\n from {\n transform: translate3d(0, 110%, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideInDown {\n from {\n transform: translate3d(0, -110%, 0);\n visibility: visible;\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes Toastify__slideOutRight {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(110%, 0, 0);\n }\n}\n@keyframes Toastify__slideOutLeft {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(-110%, 0, 0);\n }\n}\n@keyframes Toastify__slideOutDown {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(0, 500px, 0);\n }\n}\n@keyframes Toastify__slideOutUp {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n visibility: hidden;\n transform: translate3d(0, -500px, 0);\n }\n}\n.Toastify__slide-enter--top-left, .Toastify__slide-enter--bottom-left {\n animation-name: Toastify__slideInLeft;\n}\n.Toastify__slide-enter--top-right, .Toastify__slide-enter--bottom-right {\n animation-name: Toastify__slideInRight;\n}\n.Toastify__slide-enter--top-center {\n animation-name: Toastify__slideInDown;\n}\n.Toastify__slide-enter--bottom-center {\n animation-name: Toastify__slideInUp;\n}\n\n.Toastify__slide-exit--top-left, .Toastify__slide-exit--bottom-left {\n animation-name: Toastify__slideOutLeft;\n}\n.Toastify__slide-exit--top-right, .Toastify__slide-exit--bottom-right {\n animation-name: Toastify__slideOutRight;\n}\n.Toastify__slide-exit--top-center {\n animation-name: Toastify__slideOutUp;\n}\n.Toastify__slide-exit--bottom-center {\n animation-name: Toastify__slideOutDown;\n}\n\n@keyframes Toastify__spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*# sourceMappingURL=ReactToastify.css.map */",".#{$rt-namespace}__toast-container {\n z-index: var(--toastify-z-index);\n -webkit-transform: translate3d(0, 0, var(--toastify-z-index));\n position: fixed;\n padding: 4px;\n width: var(--toastify-toast-width);\n box-sizing: border-box;\n color: #fff;\n &--top-left {\n top: 1em;\n left: 1em;\n }\n &--top-center {\n top: 1em;\n left: 50%;\n transform: translateX(-50%);\n }\n &--top-right {\n top: 1em;\n right: 1em;\n }\n &--bottom-left {\n bottom: 1em;\n left: 1em;\n }\n &--bottom-center {\n bottom: 1em;\n left: 50%;\n transform: translateX(-50%);\n }\n &--bottom-right {\n bottom: 1em;\n right: 1em;\n }\n}\n\n@media #{$rt-mobile} {\n .#{$rt-namespace}__toast-container {\n width: 100vw;\n padding: 0;\n left: 0;\n margin: 0;\n &--top-left,\n &--top-center,\n &--top-right {\n top: 0;\n transform: translateX(0);\n }\n &--bottom-left,\n &--bottom-center,\n &--bottom-right {\n bottom: 0;\n transform: translateX(0);\n }\n &--rtl {\n right: 0;\n left: initial;\n }\n }\n}\n",".#{$rt-namespace}__toast {\n position: relative;\n min-height: var(--toastify-toast-min-height);\n box-sizing: border-box;\n margin-bottom: 1rem;\n padding: 8px;\n border-radius: 4px;\n box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);\n display: flex;\n justify-content: space-between;\n max-height: var(--toastify-toast-max-height);\n overflow: hidden;\n font-family: var(--toastify-font-family);\n cursor: default;\n direction: ltr;\n /* webkit only issue #791 */\n z-index: 0;\n &--rtl {\n direction: rtl;\n }\n &--close-on-click {\n cursor: pointer;\n }\n &-body {\n margin: auto 0;\n flex: 1 1 auto;\n padding: 6px;\n display: flex;\n align-items: center;\n & > div:last-child {\n word-break: break-word;\n flex: 1;\n }\n }\n &-icon {\n margin-inline-end: 10px;\n width: 20px;\n flex-shrink: 0;\n display: flex;\n }\n}\n\n.#{$rt-namespace}--animate {\n animation-fill-mode: both;\n animation-duration: 0.7s;\n}\n\n.#{$rt-namespace}--animate-icon {\n animation-fill-mode: both;\n animation-duration: 0.3s;\n}\n\n@media #{$rt-mobile} {\n .#{$rt-namespace}__toast {\n margin-bottom: 0;\n border-radius: 0;\n }\n}\n",".#{$rt-namespace}__toast {\n &-theme--dark {\n background: var(--toastify-color-dark);\n color: var(--toastify-text-color-dark);\n }\n &-theme--light {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n }\n &-theme--colored#{&}--default {\n background: var(--toastify-color-light);\n color: var(--toastify-text-color-light);\n }\n &-theme--colored#{&}--info {\n color: var(--toastify-text-color-info);\n background: var(--toastify-color-info);\n }\n &-theme--colored#{&}--success {\n color: var(--toastify-text-color-success);\n background: var(--toastify-color-success);\n }\n &-theme--colored#{&}--warning {\n color: var(--toastify-text-color-warning);\n background: var(--toastify-color-warning);\n }\n &-theme--colored#{&}--error {\n color: var(--toastify-text-color-error);\n background: var(--toastify-color-error);\n }\n}\n\n.#{$rt-namespace}__progress-bar {\n &-theme--light {\n background: var(--toastify-color-progress-light);\n }\n &-theme--dark {\n background: var(--toastify-color-progress-dark);\n }\n &--info {\n background: var(--toastify-color-progress-info);\n }\n &--success {\n background: var(--toastify-color-progress-success);\n }\n &--warning {\n background: var(--toastify-color-progress-warning);\n }\n &--error {\n background: var(--toastify-color-progress-error);\n }\n &-theme--colored#{&}--info,\n &-theme--colored#{&}--success,\n &-theme--colored#{&}--warning,\n &-theme--colored#{&}--error {\n background: var(--toastify-color-transparent);\n }\n}\n",".#{$rt-namespace}__close-button {\n color: #fff;\n background: transparent;\n outline: none;\n border: none;\n padding: 0;\n cursor: pointer;\n opacity: 0.7;\n transition: 0.3s ease;\n align-self: flex-start;\n\n &--light {\n color: #000;\n opacity: 0.3;\n }\n\n & > svg {\n fill: currentColor;\n height: 16px;\n width: 14px;\n }\n\n &:hover,\n &:focus {\n opacity: 1;\n }\n}\n","@keyframes #{$rt-namespace}__trackProgress {\n 0% {\n transform: scaleX(1);\n }\n 100% {\n transform: scaleX(0);\n }\n}\n\n.#{$rt-namespace}__progress-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 5px;\n z-index: var(--toastify-z-index);\n opacity: 0.7;\n transform-origin: left;\n\n &--animated {\n animation: #{$rt-namespace}__trackProgress linear 1 forwards;\n }\n\n &--controlled {\n transition: transform 0.2s;\n }\n\n &--rtl {\n right: 0;\n left: initial;\n transform-origin: right;\n }\n}\n",".#{$rt-namespace}__spinner {\n width: 20px;\n height: 20px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: var(--toastify-spinner-color-empty-area);\n border-right-color: var(--toastify-spinner-color);\n animation: #{$rt-namespace}__spin 0.65s linear infinite;\n}\n","@mixin timing-function {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n}\n\n@keyframes #{$rt-namespace}__bounceInRight {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n from {\n opacity: 0;\n transform: translate3d(3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(-25px, 0, 0);\n }\n 75% {\n transform: translate3d(10px, 0, 0);\n }\n 90% {\n transform: translate3d(-5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutRight {\n 20% {\n opacity: 1;\n transform: translate3d(-20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInLeft {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n 0% {\n opacity: 0;\n transform: translate3d(-3000px, 0, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(25px, 0, 0);\n }\n 75% {\n transform: translate3d(-10px, 0, 0);\n }\n 90% {\n transform: translate3d(5px, 0, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutLeft {\n 20% {\n opacity: 1;\n transform: translate3d(20px, 0, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInUp {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n from {\n opacity: 0;\n transform: translate3d(0, 3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n 75% {\n transform: translate3d(0, 10px, 0);\n }\n 90% {\n transform: translate3d(0, -5px, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutUp {\n 20% {\n transform: translate3d(0, -10px, 0);\n }\n 40%,\n 45% {\n opacity: 1;\n transform: translate3d(0, 20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__bounceInDown {\n from,\n 60%,\n 75%,\n 90%,\n to {\n @include timing-function;\n }\n 0% {\n opacity: 0;\n transform: translate3d(0, -3000px, 0);\n }\n 60% {\n opacity: 1;\n transform: translate3d(0, 25px, 0);\n }\n 75% {\n transform: translate3d(0, -10px, 0);\n }\n 90% {\n transform: translate3d(0, 5px, 0);\n }\n to {\n transform: none;\n }\n}\n\n@keyframes #{$rt-namespace}__bounceOutDown {\n 20% {\n transform: translate3d(0, 10px, 0);\n }\n 40%,\n 45% {\n opacity: 1;\n transform: translate3d(0, -20px, 0);\n }\n to {\n opacity: 0;\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.#{$rt-namespace}__bounce-enter {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__bounceInLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__bounceInRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__bounceInDown;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__bounceInUp;\n }\n}\n\n.#{$rt-namespace}__bounce-exit {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__bounceOutLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__bounceOutRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__bounceOutUp;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__bounceOutDown;\n }\n}\n","@keyframes #{$rt-namespace}__zoomIn {\n from {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes #{$rt-namespace}__zoomOut {\n from {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n transform: scale3d(0.3, 0.3, 0.3);\n }\n to {\n opacity: 0;\n }\n}\n\n.#{$rt-namespace}__zoom-enter {\n animation-name: #{$rt-namespace}__zoomIn;\n}\n\n.#{$rt-namespace}__zoom-exit {\n animation-name: #{$rt-namespace}__zoomOut;\n}\n","@keyframes #{$rt-namespace}__flipIn {\n from {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n animation-timing-function: ease-in;\n opacity: 0;\n }\n 40% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n animation-timing-function: ease-in;\n }\n 60% {\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n 80% {\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n to {\n transform: perspective(400px);\n }\n}\n\n@keyframes #{$rt-namespace}__flipOut {\n from {\n transform: perspective(400px);\n }\n 30% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n to {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n.#{$rt-namespace}__flip-enter {\n animation-name: #{$rt-namespace}__flipIn;\n}\n\n.#{$rt-namespace}__flip-exit {\n animation-name: #{$rt-namespace}__flipOut;\n}\n","@mixin transform {\n transform: translate3d(0, 0, 0);\n}\n\n@keyframes #{$rt-namespace}__slideInRight {\n from {\n transform: translate3d(110%, 0, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInLeft {\n from {\n transform: translate3d(-110%, 0, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInUp {\n from {\n transform: translate3d(0, 110%, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideInDown {\n from {\n transform: translate3d(0, -110%, 0);\n visibility: visible;\n }\n to {\n @include transform;\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutRight {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(110%, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutLeft {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(-110%, 0, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutDown {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(0, 500px, 0);\n }\n}\n\n@keyframes #{$rt-namespace}__slideOutUp {\n from {\n @include transform;\n }\n to {\n visibility: hidden;\n transform: translate3d(0, -500px, 0);\n }\n}\n\n.#{$rt-namespace}__slide-enter {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__slideInLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__slideInRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__slideInDown;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__slideInUp;\n }\n}\n\n.#{$rt-namespace}__slide-exit {\n &--top-left,\n &--bottom-left {\n animation-name: #{$rt-namespace}__slideOutLeft;\n }\n &--top-right,\n &--bottom-right {\n animation-name: #{$rt-namespace}__slideOutRight;\n }\n &--top-center {\n animation-name: #{$rt-namespace}__slideOutUp;\n }\n &--bottom-center {\n animation-name: #{$rt-namespace}__slideOutDown;\n }\n}\n","@keyframes #{$rt-namespace}__spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n"],"names":[],"sourceRoot":""} -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "backend", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "dotenv": "^16.3.1", 14 | "express": "^4.18.2", 15 | "mongoose": "^8.0.3", 16 | "nodemon": "^3.0.2" 17 | } 18 | }, 19 | "node_modules/@mongodb-js/saslprep": { 20 | "version": "1.1.1", 21 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", 22 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", 23 | "dependencies": { 24 | "sparse-bitfield": "^3.0.3" 25 | } 26 | }, 27 | "node_modules/@types/node": { 28 | "version": "20.10.6", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", 30 | "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", 31 | "dependencies": { 32 | "undici-types": "~5.26.4" 33 | } 34 | }, 35 | "node_modules/@types/webidl-conversions": { 36 | "version": "7.0.3", 37 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 38 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 39 | }, 40 | "node_modules/@types/whatwg-url": { 41 | "version": "8.2.2", 42 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", 43 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", 44 | "dependencies": { 45 | "@types/node": "*", 46 | "@types/webidl-conversions": "*" 47 | } 48 | }, 49 | "node_modules/abbrev": { 50 | "version": "1.1.1", 51 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 52 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 53 | }, 54 | "node_modules/accepts": { 55 | "version": "1.3.8", 56 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 57 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 58 | "dependencies": { 59 | "mime-types": "~2.1.34", 60 | "negotiator": "0.6.3" 61 | }, 62 | "engines": { 63 | "node": ">= 0.6" 64 | } 65 | }, 66 | "node_modules/anymatch": { 67 | "version": "3.1.3", 68 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 69 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 70 | "dependencies": { 71 | "normalize-path": "^3.0.0", 72 | "picomatch": "^2.0.4" 73 | }, 74 | "engines": { 75 | "node": ">= 8" 76 | } 77 | }, 78 | "node_modules/array-flatten": { 79 | "version": "1.1.1", 80 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 81 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 82 | }, 83 | "node_modules/balanced-match": { 84 | "version": "1.0.2", 85 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 86 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 87 | }, 88 | "node_modules/binary-extensions": { 89 | "version": "2.2.0", 90 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 91 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 92 | "engines": { 93 | "node": ">=8" 94 | } 95 | }, 96 | "node_modules/body-parser": { 97 | "version": "1.20.1", 98 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 99 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 100 | "dependencies": { 101 | "bytes": "3.1.2", 102 | "content-type": "~1.0.4", 103 | "debug": "2.6.9", 104 | "depd": "2.0.0", 105 | "destroy": "1.2.0", 106 | "http-errors": "2.0.0", 107 | "iconv-lite": "0.4.24", 108 | "on-finished": "2.4.1", 109 | "qs": "6.11.0", 110 | "raw-body": "2.5.1", 111 | "type-is": "~1.6.18", 112 | "unpipe": "1.0.0" 113 | }, 114 | "engines": { 115 | "node": ">= 0.8", 116 | "npm": "1.2.8000 || >= 1.4.16" 117 | } 118 | }, 119 | "node_modules/body-parser/node_modules/debug": { 120 | "version": "2.6.9", 121 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 122 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 123 | "dependencies": { 124 | "ms": "2.0.0" 125 | } 126 | }, 127 | "node_modules/body-parser/node_modules/ms": { 128 | "version": "2.0.0", 129 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 130 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 131 | }, 132 | "node_modules/brace-expansion": { 133 | "version": "1.1.11", 134 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 135 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 136 | "dependencies": { 137 | "balanced-match": "^1.0.0", 138 | "concat-map": "0.0.1" 139 | } 140 | }, 141 | "node_modules/braces": { 142 | "version": "3.0.2", 143 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 144 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 145 | "dependencies": { 146 | "fill-range": "^7.0.1" 147 | }, 148 | "engines": { 149 | "node": ">=8" 150 | } 151 | }, 152 | "node_modules/bson": { 153 | "version": "6.2.0", 154 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", 155 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", 156 | "engines": { 157 | "node": ">=16.20.1" 158 | } 159 | }, 160 | "node_modules/bytes": { 161 | "version": "3.1.2", 162 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 163 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 164 | "engines": { 165 | "node": ">= 0.8" 166 | } 167 | }, 168 | "node_modules/call-bind": { 169 | "version": "1.0.5", 170 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 171 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 172 | "dependencies": { 173 | "function-bind": "^1.1.2", 174 | "get-intrinsic": "^1.2.1", 175 | "set-function-length": "^1.1.1" 176 | }, 177 | "funding": { 178 | "url": "https://github.com/sponsors/ljharb" 179 | } 180 | }, 181 | "node_modules/chokidar": { 182 | "version": "3.5.3", 183 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 184 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 185 | "funding": [ 186 | { 187 | "type": "individual", 188 | "url": "https://paulmillr.com/funding/" 189 | } 190 | ], 191 | "dependencies": { 192 | "anymatch": "~3.1.2", 193 | "braces": "~3.0.2", 194 | "glob-parent": "~5.1.2", 195 | "is-binary-path": "~2.1.0", 196 | "is-glob": "~4.0.1", 197 | "normalize-path": "~3.0.0", 198 | "readdirp": "~3.6.0" 199 | }, 200 | "engines": { 201 | "node": ">= 8.10.0" 202 | }, 203 | "optionalDependencies": { 204 | "fsevents": "~2.3.2" 205 | } 206 | }, 207 | "node_modules/concat-map": { 208 | "version": "0.0.1", 209 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 210 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 211 | }, 212 | "node_modules/content-disposition": { 213 | "version": "0.5.4", 214 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 215 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 216 | "dependencies": { 217 | "safe-buffer": "5.2.1" 218 | }, 219 | "engines": { 220 | "node": ">= 0.6" 221 | } 222 | }, 223 | "node_modules/content-type": { 224 | "version": "1.0.5", 225 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 226 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 227 | "engines": { 228 | "node": ">= 0.6" 229 | } 230 | }, 231 | "node_modules/cookie": { 232 | "version": "0.5.0", 233 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 234 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 235 | "engines": { 236 | "node": ">= 0.6" 237 | } 238 | }, 239 | "node_modules/cookie-signature": { 240 | "version": "1.0.6", 241 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 242 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 243 | }, 244 | "node_modules/cors": { 245 | "version": "2.8.5", 246 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 247 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 248 | "dependencies": { 249 | "object-assign": "^4", 250 | "vary": "^1" 251 | }, 252 | "engines": { 253 | "node": ">= 0.10" 254 | } 255 | }, 256 | "node_modules/debug": { 257 | "version": "4.3.4", 258 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 259 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 260 | "dependencies": { 261 | "ms": "2.1.2" 262 | }, 263 | "engines": { 264 | "node": ">=6.0" 265 | }, 266 | "peerDependenciesMeta": { 267 | "supports-color": { 268 | "optional": true 269 | } 270 | } 271 | }, 272 | "node_modules/define-data-property": { 273 | "version": "1.1.1", 274 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 275 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 276 | "dependencies": { 277 | "get-intrinsic": "^1.2.1", 278 | "gopd": "^1.0.1", 279 | "has-property-descriptors": "^1.0.0" 280 | }, 281 | "engines": { 282 | "node": ">= 0.4" 283 | } 284 | }, 285 | "node_modules/depd": { 286 | "version": "2.0.0", 287 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 288 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 289 | "engines": { 290 | "node": ">= 0.8" 291 | } 292 | }, 293 | "node_modules/destroy": { 294 | "version": "1.2.0", 295 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 296 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 297 | "engines": { 298 | "node": ">= 0.8", 299 | "npm": "1.2.8000 || >= 1.4.16" 300 | } 301 | }, 302 | "node_modules/dotenv": { 303 | "version": "16.3.1", 304 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 305 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 306 | "engines": { 307 | "node": ">=12" 308 | }, 309 | "funding": { 310 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 311 | } 312 | }, 313 | "node_modules/ee-first": { 314 | "version": "1.1.1", 315 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 316 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 317 | }, 318 | "node_modules/encodeurl": { 319 | "version": "1.0.2", 320 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 321 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 322 | "engines": { 323 | "node": ">= 0.8" 324 | } 325 | }, 326 | "node_modules/escape-html": { 327 | "version": "1.0.3", 328 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 329 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 330 | }, 331 | "node_modules/etag": { 332 | "version": "1.8.1", 333 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 334 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 335 | "engines": { 336 | "node": ">= 0.6" 337 | } 338 | }, 339 | "node_modules/express": { 340 | "version": "4.18.2", 341 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 342 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 343 | "dependencies": { 344 | "accepts": "~1.3.8", 345 | "array-flatten": "1.1.1", 346 | "body-parser": "1.20.1", 347 | "content-disposition": "0.5.4", 348 | "content-type": "~1.0.4", 349 | "cookie": "0.5.0", 350 | "cookie-signature": "1.0.6", 351 | "debug": "2.6.9", 352 | "depd": "2.0.0", 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "etag": "~1.8.1", 356 | "finalhandler": "1.2.0", 357 | "fresh": "0.5.2", 358 | "http-errors": "2.0.0", 359 | "merge-descriptors": "1.0.1", 360 | "methods": "~1.1.2", 361 | "on-finished": "2.4.1", 362 | "parseurl": "~1.3.3", 363 | "path-to-regexp": "0.1.7", 364 | "proxy-addr": "~2.0.7", 365 | "qs": "6.11.0", 366 | "range-parser": "~1.2.1", 367 | "safe-buffer": "5.2.1", 368 | "send": "0.18.0", 369 | "serve-static": "1.15.0", 370 | "setprototypeof": "1.2.0", 371 | "statuses": "2.0.1", 372 | "type-is": "~1.6.18", 373 | "utils-merge": "1.0.1", 374 | "vary": "~1.1.2" 375 | }, 376 | "engines": { 377 | "node": ">= 0.10.0" 378 | } 379 | }, 380 | "node_modules/express/node_modules/debug": { 381 | "version": "2.6.9", 382 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 383 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 384 | "dependencies": { 385 | "ms": "2.0.0" 386 | } 387 | }, 388 | "node_modules/express/node_modules/ms": { 389 | "version": "2.0.0", 390 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 391 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 392 | }, 393 | "node_modules/fill-range": { 394 | "version": "7.0.1", 395 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 396 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 397 | "dependencies": { 398 | "to-regex-range": "^5.0.1" 399 | }, 400 | "engines": { 401 | "node": ">=8" 402 | } 403 | }, 404 | "node_modules/finalhandler": { 405 | "version": "1.2.0", 406 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 407 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 408 | "dependencies": { 409 | "debug": "2.6.9", 410 | "encodeurl": "~1.0.2", 411 | "escape-html": "~1.0.3", 412 | "on-finished": "2.4.1", 413 | "parseurl": "~1.3.3", 414 | "statuses": "2.0.1", 415 | "unpipe": "~1.0.0" 416 | }, 417 | "engines": { 418 | "node": ">= 0.8" 419 | } 420 | }, 421 | "node_modules/finalhandler/node_modules/debug": { 422 | "version": "2.6.9", 423 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 424 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 425 | "dependencies": { 426 | "ms": "2.0.0" 427 | } 428 | }, 429 | "node_modules/finalhandler/node_modules/ms": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 432 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 433 | }, 434 | "node_modules/forwarded": { 435 | "version": "0.2.0", 436 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 437 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 438 | "engines": { 439 | "node": ">= 0.6" 440 | } 441 | }, 442 | "node_modules/fresh": { 443 | "version": "0.5.2", 444 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 445 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 446 | "engines": { 447 | "node": ">= 0.6" 448 | } 449 | }, 450 | "node_modules/function-bind": { 451 | "version": "1.1.2", 452 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 453 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 454 | "funding": { 455 | "url": "https://github.com/sponsors/ljharb" 456 | } 457 | }, 458 | "node_modules/get-intrinsic": { 459 | "version": "1.2.2", 460 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 461 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 462 | "dependencies": { 463 | "function-bind": "^1.1.2", 464 | "has-proto": "^1.0.1", 465 | "has-symbols": "^1.0.3", 466 | "hasown": "^2.0.0" 467 | }, 468 | "funding": { 469 | "url": "https://github.com/sponsors/ljharb" 470 | } 471 | }, 472 | "node_modules/glob-parent": { 473 | "version": "5.1.2", 474 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 475 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 476 | "dependencies": { 477 | "is-glob": "^4.0.1" 478 | }, 479 | "engines": { 480 | "node": ">= 6" 481 | } 482 | }, 483 | "node_modules/gopd": { 484 | "version": "1.0.1", 485 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 486 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 487 | "dependencies": { 488 | "get-intrinsic": "^1.1.3" 489 | }, 490 | "funding": { 491 | "url": "https://github.com/sponsors/ljharb" 492 | } 493 | }, 494 | "node_modules/has-flag": { 495 | "version": "3.0.0", 496 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 497 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 498 | "engines": { 499 | "node": ">=4" 500 | } 501 | }, 502 | "node_modules/has-property-descriptors": { 503 | "version": "1.0.1", 504 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 505 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 506 | "dependencies": { 507 | "get-intrinsic": "^1.2.2" 508 | }, 509 | "funding": { 510 | "url": "https://github.com/sponsors/ljharb" 511 | } 512 | }, 513 | "node_modules/has-proto": { 514 | "version": "1.0.1", 515 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 516 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 517 | "engines": { 518 | "node": ">= 0.4" 519 | }, 520 | "funding": { 521 | "url": "https://github.com/sponsors/ljharb" 522 | } 523 | }, 524 | "node_modules/has-symbols": { 525 | "version": "1.0.3", 526 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 527 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 528 | "engines": { 529 | "node": ">= 0.4" 530 | }, 531 | "funding": { 532 | "url": "https://github.com/sponsors/ljharb" 533 | } 534 | }, 535 | "node_modules/hasown": { 536 | "version": "2.0.0", 537 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 538 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 539 | "dependencies": { 540 | "function-bind": "^1.1.2" 541 | }, 542 | "engines": { 543 | "node": ">= 0.4" 544 | } 545 | }, 546 | "node_modules/http-errors": { 547 | "version": "2.0.0", 548 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 549 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 550 | "dependencies": { 551 | "depd": "2.0.0", 552 | "inherits": "2.0.4", 553 | "setprototypeof": "1.2.0", 554 | "statuses": "2.0.1", 555 | "toidentifier": "1.0.1" 556 | }, 557 | "engines": { 558 | "node": ">= 0.8" 559 | } 560 | }, 561 | "node_modules/iconv-lite": { 562 | "version": "0.4.24", 563 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 564 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 565 | "dependencies": { 566 | "safer-buffer": ">= 2.1.2 < 3" 567 | }, 568 | "engines": { 569 | "node": ">=0.10.0" 570 | } 571 | }, 572 | "node_modules/ignore-by-default": { 573 | "version": "1.0.1", 574 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 575 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 576 | }, 577 | "node_modules/inherits": { 578 | "version": "2.0.4", 579 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 580 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 581 | }, 582 | "node_modules/ipaddr.js": { 583 | "version": "1.9.1", 584 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 585 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 586 | "engines": { 587 | "node": ">= 0.10" 588 | } 589 | }, 590 | "node_modules/is-binary-path": { 591 | "version": "2.1.0", 592 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 593 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 594 | "dependencies": { 595 | "binary-extensions": "^2.0.0" 596 | }, 597 | "engines": { 598 | "node": ">=8" 599 | } 600 | }, 601 | "node_modules/is-extglob": { 602 | "version": "2.1.1", 603 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 604 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 605 | "engines": { 606 | "node": ">=0.10.0" 607 | } 608 | }, 609 | "node_modules/is-glob": { 610 | "version": "4.0.3", 611 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 612 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 613 | "dependencies": { 614 | "is-extglob": "^2.1.1" 615 | }, 616 | "engines": { 617 | "node": ">=0.10.0" 618 | } 619 | }, 620 | "node_modules/is-number": { 621 | "version": "7.0.0", 622 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 623 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 624 | "engines": { 625 | "node": ">=0.12.0" 626 | } 627 | }, 628 | "node_modules/kareem": { 629 | "version": "2.5.1", 630 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 631 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", 632 | "engines": { 633 | "node": ">=12.0.0" 634 | } 635 | }, 636 | "node_modules/lru-cache": { 637 | "version": "6.0.0", 638 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 639 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 640 | "dependencies": { 641 | "yallist": "^4.0.0" 642 | }, 643 | "engines": { 644 | "node": ">=10" 645 | } 646 | }, 647 | "node_modules/media-typer": { 648 | "version": "0.3.0", 649 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 650 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 651 | "engines": { 652 | "node": ">= 0.6" 653 | } 654 | }, 655 | "node_modules/memory-pager": { 656 | "version": "1.5.0", 657 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 658 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 659 | }, 660 | "node_modules/merge-descriptors": { 661 | "version": "1.0.1", 662 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 663 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 664 | }, 665 | "node_modules/methods": { 666 | "version": "1.1.2", 667 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 668 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 669 | "engines": { 670 | "node": ">= 0.6" 671 | } 672 | }, 673 | "node_modules/mime": { 674 | "version": "1.6.0", 675 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 676 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 677 | "bin": { 678 | "mime": "cli.js" 679 | }, 680 | "engines": { 681 | "node": ">=4" 682 | } 683 | }, 684 | "node_modules/mime-db": { 685 | "version": "1.52.0", 686 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 687 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 688 | "engines": { 689 | "node": ">= 0.6" 690 | } 691 | }, 692 | "node_modules/mime-types": { 693 | "version": "2.1.35", 694 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 695 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 696 | "dependencies": { 697 | "mime-db": "1.52.0" 698 | }, 699 | "engines": { 700 | "node": ">= 0.6" 701 | } 702 | }, 703 | "node_modules/minimatch": { 704 | "version": "3.1.2", 705 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 706 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 707 | "dependencies": { 708 | "brace-expansion": "^1.1.7" 709 | }, 710 | "engines": { 711 | "node": "*" 712 | } 713 | }, 714 | "node_modules/mongodb": { 715 | "version": "6.2.0", 716 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", 717 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", 718 | "dependencies": { 719 | "@mongodb-js/saslprep": "^1.1.0", 720 | "bson": "^6.2.0", 721 | "mongodb-connection-string-url": "^2.6.0" 722 | }, 723 | "engines": { 724 | "node": ">=16.20.1" 725 | }, 726 | "peerDependencies": { 727 | "@aws-sdk/credential-providers": "^3.188.0", 728 | "@mongodb-js/zstd": "^1.1.0", 729 | "gcp-metadata": "^5.2.0", 730 | "kerberos": "^2.0.1", 731 | "mongodb-client-encryption": ">=6.0.0 <7", 732 | "snappy": "^7.2.2", 733 | "socks": "^2.7.1" 734 | }, 735 | "peerDependenciesMeta": { 736 | "@aws-sdk/credential-providers": { 737 | "optional": true 738 | }, 739 | "@mongodb-js/zstd": { 740 | "optional": true 741 | }, 742 | "gcp-metadata": { 743 | "optional": true 744 | }, 745 | "kerberos": { 746 | "optional": true 747 | }, 748 | "mongodb-client-encryption": { 749 | "optional": true 750 | }, 751 | "snappy": { 752 | "optional": true 753 | }, 754 | "socks": { 755 | "optional": true 756 | } 757 | } 758 | }, 759 | "node_modules/mongodb-connection-string-url": { 760 | "version": "2.6.0", 761 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", 762 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", 763 | "dependencies": { 764 | "@types/whatwg-url": "^8.2.1", 765 | "whatwg-url": "^11.0.0" 766 | } 767 | }, 768 | "node_modules/mongoose": { 769 | "version": "8.0.3", 770 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.3.tgz", 771 | "integrity": "sha512-LJRT0yP4TW14HT4r2RkxqyvoTylMSzWpl5QOeVHTnRggCLQSpkoBdgbUtORFq/mSL2o9cLCPJz+6uzFj25qbHw==", 772 | "dependencies": { 773 | "bson": "^6.2.0", 774 | "kareem": "2.5.1", 775 | "mongodb": "6.2.0", 776 | "mpath": "0.9.0", 777 | "mquery": "5.0.0", 778 | "ms": "2.1.3", 779 | "sift": "16.0.1" 780 | }, 781 | "engines": { 782 | "node": ">=16.20.1" 783 | }, 784 | "funding": { 785 | "type": "opencollective", 786 | "url": "https://opencollective.com/mongoose" 787 | } 788 | }, 789 | "node_modules/mongoose/node_modules/ms": { 790 | "version": "2.1.3", 791 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 792 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 793 | }, 794 | "node_modules/mpath": { 795 | "version": "0.9.0", 796 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 797 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 798 | "engines": { 799 | "node": ">=4.0.0" 800 | } 801 | }, 802 | "node_modules/mquery": { 803 | "version": "5.0.0", 804 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 805 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 806 | "dependencies": { 807 | "debug": "4.x" 808 | }, 809 | "engines": { 810 | "node": ">=14.0.0" 811 | } 812 | }, 813 | "node_modules/ms": { 814 | "version": "2.1.2", 815 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 816 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 817 | }, 818 | "node_modules/negotiator": { 819 | "version": "0.6.3", 820 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 821 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 822 | "engines": { 823 | "node": ">= 0.6" 824 | } 825 | }, 826 | "node_modules/nodemon": { 827 | "version": "3.0.2", 828 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", 829 | "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", 830 | "dependencies": { 831 | "chokidar": "^3.5.2", 832 | "debug": "^4", 833 | "ignore-by-default": "^1.0.1", 834 | "minimatch": "^3.1.2", 835 | "pstree.remy": "^1.1.8", 836 | "semver": "^7.5.3", 837 | "simple-update-notifier": "^2.0.0", 838 | "supports-color": "^5.5.0", 839 | "touch": "^3.1.0", 840 | "undefsafe": "^2.0.5" 841 | }, 842 | "bin": { 843 | "nodemon": "bin/nodemon.js" 844 | }, 845 | "engines": { 846 | "node": ">=10" 847 | }, 848 | "funding": { 849 | "type": "opencollective", 850 | "url": "https://opencollective.com/nodemon" 851 | } 852 | }, 853 | "node_modules/nopt": { 854 | "version": "1.0.10", 855 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 856 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 857 | "dependencies": { 858 | "abbrev": "1" 859 | }, 860 | "bin": { 861 | "nopt": "bin/nopt.js" 862 | }, 863 | "engines": { 864 | "node": "*" 865 | } 866 | }, 867 | "node_modules/normalize-path": { 868 | "version": "3.0.0", 869 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 870 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 871 | "engines": { 872 | "node": ">=0.10.0" 873 | } 874 | }, 875 | "node_modules/object-assign": { 876 | "version": "4.1.1", 877 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 878 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 879 | "engines": { 880 | "node": ">=0.10.0" 881 | } 882 | }, 883 | "node_modules/object-inspect": { 884 | "version": "1.13.1", 885 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 886 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 887 | "funding": { 888 | "url": "https://github.com/sponsors/ljharb" 889 | } 890 | }, 891 | "node_modules/on-finished": { 892 | "version": "2.4.1", 893 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 894 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 895 | "dependencies": { 896 | "ee-first": "1.1.1" 897 | }, 898 | "engines": { 899 | "node": ">= 0.8" 900 | } 901 | }, 902 | "node_modules/parseurl": { 903 | "version": "1.3.3", 904 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 905 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 906 | "engines": { 907 | "node": ">= 0.8" 908 | } 909 | }, 910 | "node_modules/path-to-regexp": { 911 | "version": "0.1.7", 912 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 913 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 914 | }, 915 | "node_modules/picomatch": { 916 | "version": "2.3.1", 917 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 918 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 919 | "engines": { 920 | "node": ">=8.6" 921 | }, 922 | "funding": { 923 | "url": "https://github.com/sponsors/jonschlinkert" 924 | } 925 | }, 926 | "node_modules/proxy-addr": { 927 | "version": "2.0.7", 928 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 929 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 930 | "dependencies": { 931 | "forwarded": "0.2.0", 932 | "ipaddr.js": "1.9.1" 933 | }, 934 | "engines": { 935 | "node": ">= 0.10" 936 | } 937 | }, 938 | "node_modules/pstree.remy": { 939 | "version": "1.1.8", 940 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 941 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 942 | }, 943 | "node_modules/punycode": { 944 | "version": "2.3.1", 945 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 946 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 947 | "engines": { 948 | "node": ">=6" 949 | } 950 | }, 951 | "node_modules/qs": { 952 | "version": "6.11.0", 953 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 954 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 955 | "dependencies": { 956 | "side-channel": "^1.0.4" 957 | }, 958 | "engines": { 959 | "node": ">=0.6" 960 | }, 961 | "funding": { 962 | "url": "https://github.com/sponsors/ljharb" 963 | } 964 | }, 965 | "node_modules/range-parser": { 966 | "version": "1.2.1", 967 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 968 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 969 | "engines": { 970 | "node": ">= 0.6" 971 | } 972 | }, 973 | "node_modules/raw-body": { 974 | "version": "2.5.1", 975 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 976 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 977 | "dependencies": { 978 | "bytes": "3.1.2", 979 | "http-errors": "2.0.0", 980 | "iconv-lite": "0.4.24", 981 | "unpipe": "1.0.0" 982 | }, 983 | "engines": { 984 | "node": ">= 0.8" 985 | } 986 | }, 987 | "node_modules/readdirp": { 988 | "version": "3.6.0", 989 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 990 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 991 | "dependencies": { 992 | "picomatch": "^2.2.1" 993 | }, 994 | "engines": { 995 | "node": ">=8.10.0" 996 | } 997 | }, 998 | "node_modules/safe-buffer": { 999 | "version": "5.2.1", 1000 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1001 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1002 | "funding": [ 1003 | { 1004 | "type": "github", 1005 | "url": "https://github.com/sponsors/feross" 1006 | }, 1007 | { 1008 | "type": "patreon", 1009 | "url": "https://www.patreon.com/feross" 1010 | }, 1011 | { 1012 | "type": "consulting", 1013 | "url": "https://feross.org/support" 1014 | } 1015 | ] 1016 | }, 1017 | "node_modules/safer-buffer": { 1018 | "version": "2.1.2", 1019 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1020 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1021 | }, 1022 | "node_modules/semver": { 1023 | "version": "7.5.4", 1024 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1025 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1026 | "dependencies": { 1027 | "lru-cache": "^6.0.0" 1028 | }, 1029 | "bin": { 1030 | "semver": "bin/semver.js" 1031 | }, 1032 | "engines": { 1033 | "node": ">=10" 1034 | } 1035 | }, 1036 | "node_modules/send": { 1037 | "version": "0.18.0", 1038 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1039 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1040 | "dependencies": { 1041 | "debug": "2.6.9", 1042 | "depd": "2.0.0", 1043 | "destroy": "1.2.0", 1044 | "encodeurl": "~1.0.2", 1045 | "escape-html": "~1.0.3", 1046 | "etag": "~1.8.1", 1047 | "fresh": "0.5.2", 1048 | "http-errors": "2.0.0", 1049 | "mime": "1.6.0", 1050 | "ms": "2.1.3", 1051 | "on-finished": "2.4.1", 1052 | "range-parser": "~1.2.1", 1053 | "statuses": "2.0.1" 1054 | }, 1055 | "engines": { 1056 | "node": ">= 0.8.0" 1057 | } 1058 | }, 1059 | "node_modules/send/node_modules/debug": { 1060 | "version": "2.6.9", 1061 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1062 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1063 | "dependencies": { 1064 | "ms": "2.0.0" 1065 | } 1066 | }, 1067 | "node_modules/send/node_modules/debug/node_modules/ms": { 1068 | "version": "2.0.0", 1069 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1070 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1071 | }, 1072 | "node_modules/send/node_modules/ms": { 1073 | "version": "2.1.3", 1074 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1075 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1076 | }, 1077 | "node_modules/serve-static": { 1078 | "version": "1.15.0", 1079 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1080 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1081 | "dependencies": { 1082 | "encodeurl": "~1.0.2", 1083 | "escape-html": "~1.0.3", 1084 | "parseurl": "~1.3.3", 1085 | "send": "0.18.0" 1086 | }, 1087 | "engines": { 1088 | "node": ">= 0.8.0" 1089 | } 1090 | }, 1091 | "node_modules/set-function-length": { 1092 | "version": "1.1.1", 1093 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 1094 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 1095 | "dependencies": { 1096 | "define-data-property": "^1.1.1", 1097 | "get-intrinsic": "^1.2.1", 1098 | "gopd": "^1.0.1", 1099 | "has-property-descriptors": "^1.0.0" 1100 | }, 1101 | "engines": { 1102 | "node": ">= 0.4" 1103 | } 1104 | }, 1105 | "node_modules/setprototypeof": { 1106 | "version": "1.2.0", 1107 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1108 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1109 | }, 1110 | "node_modules/side-channel": { 1111 | "version": "1.0.4", 1112 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1113 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1114 | "dependencies": { 1115 | "call-bind": "^1.0.0", 1116 | "get-intrinsic": "^1.0.2", 1117 | "object-inspect": "^1.9.0" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/ljharb" 1121 | } 1122 | }, 1123 | "node_modules/sift": { 1124 | "version": "16.0.1", 1125 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 1126 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 1127 | }, 1128 | "node_modules/simple-update-notifier": { 1129 | "version": "2.0.0", 1130 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 1131 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 1132 | "dependencies": { 1133 | "semver": "^7.5.3" 1134 | }, 1135 | "engines": { 1136 | "node": ">=10" 1137 | } 1138 | }, 1139 | "node_modules/sparse-bitfield": { 1140 | "version": "3.0.3", 1141 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1142 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1143 | "dependencies": { 1144 | "memory-pager": "^1.0.2" 1145 | } 1146 | }, 1147 | "node_modules/statuses": { 1148 | "version": "2.0.1", 1149 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1150 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1151 | "engines": { 1152 | "node": ">= 0.8" 1153 | } 1154 | }, 1155 | "node_modules/supports-color": { 1156 | "version": "5.5.0", 1157 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1158 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1159 | "dependencies": { 1160 | "has-flag": "^3.0.0" 1161 | }, 1162 | "engines": { 1163 | "node": ">=4" 1164 | } 1165 | }, 1166 | "node_modules/to-regex-range": { 1167 | "version": "5.0.1", 1168 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1169 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1170 | "dependencies": { 1171 | "is-number": "^7.0.0" 1172 | }, 1173 | "engines": { 1174 | "node": ">=8.0" 1175 | } 1176 | }, 1177 | "node_modules/toidentifier": { 1178 | "version": "1.0.1", 1179 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1180 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1181 | "engines": { 1182 | "node": ">=0.6" 1183 | } 1184 | }, 1185 | "node_modules/touch": { 1186 | "version": "3.1.0", 1187 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1188 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1189 | "dependencies": { 1190 | "nopt": "~1.0.10" 1191 | }, 1192 | "bin": { 1193 | "nodetouch": "bin/nodetouch.js" 1194 | } 1195 | }, 1196 | "node_modules/tr46": { 1197 | "version": "3.0.0", 1198 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 1199 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 1200 | "dependencies": { 1201 | "punycode": "^2.1.1" 1202 | }, 1203 | "engines": { 1204 | "node": ">=12" 1205 | } 1206 | }, 1207 | "node_modules/type-is": { 1208 | "version": "1.6.18", 1209 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1210 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1211 | "dependencies": { 1212 | "media-typer": "0.3.0", 1213 | "mime-types": "~2.1.24" 1214 | }, 1215 | "engines": { 1216 | "node": ">= 0.6" 1217 | } 1218 | }, 1219 | "node_modules/undefsafe": { 1220 | "version": "2.0.5", 1221 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1222 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 1223 | }, 1224 | "node_modules/undici-types": { 1225 | "version": "5.26.5", 1226 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1227 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 1228 | }, 1229 | "node_modules/unpipe": { 1230 | "version": "1.0.0", 1231 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1232 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1233 | "engines": { 1234 | "node": ">= 0.8" 1235 | } 1236 | }, 1237 | "node_modules/utils-merge": { 1238 | "version": "1.0.1", 1239 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1240 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1241 | "engines": { 1242 | "node": ">= 0.4.0" 1243 | } 1244 | }, 1245 | "node_modules/vary": { 1246 | "version": "1.1.2", 1247 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1248 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1249 | "engines": { 1250 | "node": ">= 0.8" 1251 | } 1252 | }, 1253 | "node_modules/webidl-conversions": { 1254 | "version": "7.0.0", 1255 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1256 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1257 | "engines": { 1258 | "node": ">=12" 1259 | } 1260 | }, 1261 | "node_modules/whatwg-url": { 1262 | "version": "11.0.0", 1263 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1264 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1265 | "dependencies": { 1266 | "tr46": "^3.0.0", 1267 | "webidl-conversions": "^7.0.0" 1268 | }, 1269 | "engines": { 1270 | "node": ">=12" 1271 | } 1272 | }, 1273 | "node_modules/yallist": { 1274 | "version": "4.0.0", 1275 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1276 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1277 | } 1278 | } 1279 | } 1280 | --------------------------------------------------------------------------------