From 9a37c1f7d7e2f904982d09a2f6bb9184e3c81c26 Mon Sep 17 00:00:00 2001 From: romualdo-ah Date: Fri, 21 Jan 2022 12:18:48 -0300 Subject: [PATCH] Updating Readme.md file --- .env | 1 + components/Layout/index.tsx | 17 + components/Navbar/index.tsx | 49 + components/Product/AmountControl/index.tsx | 69 + components/Product/BuyContainer/index.tsx | 48 + components/Product/OnCart/index.tsx | 47 + components/Product/ProductCardCart/index.tsx | 60 + .../Product/ProductCardCatalog/index.tsx | 30 + components/Product/ProductImage/index.tsx | 17 + components/Product/Share/index.tsx | 41 + components/Product/index.tsx | 34 + hooks/useCart.tsx | 127 ++ hooks/useProducts.ts | 13 + interfaces/index.ts | 45 + next-env.d.ts | 5 + next.config.js | 20 +- package-lock.json | 1296 +++++++++++++++-- package.json | 17 +- pages/_app.js | 7 - pages/_app.tsx | 18 + pages/_document.tsx | 26 + pages/api/hello.js | 5 - pages/cart.tsx | 89 ++ pages/home.tsx | 37 + pages/index.js | 69 - pages/payment.tsx | 27 + pages/product/[id].tsx | 55 + postcss.config.js | 6 + public/default-image.jpg | Bin 0 -> 50763 bytes public/logo-2x.png | Bin 0 -> 6393 bytes services/index.ts | 6 + styles/Home.module.css | 116 -- styles/Lazy.modules.css | 32 + styles/globals.css | 19 +- tailwind.config.js | 16 + tsconfig.json | 30 + utils/index.ts | 60 + 37 files changed, 2195 insertions(+), 359 deletions(-) create mode 100644 .env create mode 100644 components/Layout/index.tsx create mode 100644 components/Navbar/index.tsx create mode 100644 components/Product/AmountControl/index.tsx create mode 100644 components/Product/BuyContainer/index.tsx create mode 100644 components/Product/OnCart/index.tsx create mode 100644 components/Product/ProductCardCart/index.tsx create mode 100644 components/Product/ProductCardCatalog/index.tsx create mode 100644 components/Product/ProductImage/index.tsx create mode 100644 components/Product/Share/index.tsx create mode 100644 components/Product/index.tsx create mode 100644 hooks/useCart.tsx create mode 100644 hooks/useProducts.ts create mode 100644 interfaces/index.ts create mode 100644 next-env.d.ts delete mode 100644 pages/_app.js create mode 100644 pages/_app.tsx create mode 100644 pages/_document.tsx delete mode 100644 pages/api/hello.js create mode 100644 pages/cart.tsx create mode 100644 pages/home.tsx delete mode 100644 pages/index.js create mode 100644 pages/payment.tsx create mode 100644 pages/product/[id].tsx create mode 100644 postcss.config.js create mode 100644 public/default-image.jpg create mode 100644 public/logo-2x.png create mode 100644 services/index.ts delete mode 100644 styles/Home.module.css create mode 100644 styles/Lazy.modules.css create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 utils/index.ts diff --git a/.env b/.env new file mode 100644 index 0000000..0318cf7 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +API_URL=https://5d6da1df777f670014036125.mockapi.io/api/v1/product \ No newline at end of file diff --git a/components/Layout/index.tsx b/components/Layout/index.tsx new file mode 100644 index 0000000..ddd056e --- /dev/null +++ b/components/Layout/index.tsx @@ -0,0 +1,17 @@ +import React ,{ReactNode}from 'react' +import Navbar from '../Navbar' + +interface LayoutProps { + children: ReactNode +} + +export default function Layout({children}:LayoutProps) { + return ( + <> + +
+ {children} +
+ + ) +} diff --git a/components/Navbar/index.tsx b/components/Navbar/index.tsx new file mode 100644 index 0000000..2725a9a --- /dev/null +++ b/components/Navbar/index.tsx @@ -0,0 +1,49 @@ +import React, { useEffect } from 'react'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import {BsCart3} from 'react-icons/bs'; +import {useCart} from '../../hooks/useCart'; +export default function Navbar() { + + const {cart} = useCart(); + + const [productCounter, setProductCounter] = React.useState(0); + + useEffect( + () => { + const numberOfProducts = cart.length; + setProductCounter(numberOfProducts); + },[cart] + ); + + + const router = useRouter(); + //set the active class on the navbar + const activeClass = (path: string) => { + if (router.pathname === path) { + return 'decoration-blue-300 hover:decoration-gray-300 underline underline-offset-2'; + } + return ''; + }; + + return ( + + ); +} diff --git a/components/Product/AmountControl/index.tsx b/components/Product/AmountControl/index.tsx new file mode 100644 index 0000000..9a5867b --- /dev/null +++ b/components/Product/AmountControl/index.tsx @@ -0,0 +1,69 @@ +import React, { useEffect, useState } from 'react'; +import { productInterface } from '../../../interfaces'; +import { useCart } from '../../../hooks/useCart'; +import { HiPlus, HiMinus } from 'react-icons/hi'; +interface AmountControlProps { + product: productInterface; + min?: number; +} + +export function AmountControl({ product,min }: AmountControlProps) { + const { updateProductAmount, cart } = useCart(); + + const [ formatedProduct, setFormatedProduct ] = useState({ + ...product, + total: (product.amount * product.price).toFixed(2) + }); + + useEffect( + () => { + //find product in cart with the id of product + const productInCart = cart.find((item) => item.productId === product.id); + if (productInCart) { + setFormatedProduct({ + ...product, + total: (product.amount * product.price).toFixed(2), + amount: productInCart.amount + }); + } else { + setFormatedProduct({ ...product, total: (product.amount * product.price).toFixed(2) }); + } + }, + [ product, cart ] + ); + + const handleIncreaseAmount = (product: productInterface) => { + const updatedProduct = { productId: product.id, amount: product.amount + 1 }; + + updateProductAmount(updatedProduct); + }; + + const handleDecreaseAmount = (product: productInterface) => { + if(product.amount > min){ + const updatedProduct = { productId: product.id, amount: product.amount - 1 }; + updateProductAmount(updatedProduct); + } + }; + return ( +
+ + {formatedProduct.amount === undefined ? ( + + ) : ( + + + )} + +

+ x{formatedProduct.amount ? formatedProduct.amount : 0} +

+ +
+ ); +} diff --git a/components/Product/BuyContainer/index.tsx b/components/Product/BuyContainer/index.tsx new file mode 100644 index 0000000..4ae7028 --- /dev/null +++ b/components/Product/BuyContainer/index.tsx @@ -0,0 +1,48 @@ +import React, { useEffect } from 'react' +import Link from 'next/link' +import { useRouter } from 'next/router' +interface BuyContainerProps { + total: number, + text:string +} + +import { formatedPrice } from '../../../utils' + +export function BuyContainer({total,text}:BuyContainerProps) { + const router= useRouter() + + return ( +
+
+ total: + R$ {formatedPrice(total)??'0.00'} +
+
+ { + + total>0?( + + router.pathname.includes('/product/') ? + ( + + + {text} + + + ): + ( + + + {text} + + + + ) + ) + : + {text} + } +
+
+ ) +} diff --git a/components/Product/OnCart/index.tsx b/components/Product/OnCart/index.tsx new file mode 100644 index 0000000..f7a7f55 --- /dev/null +++ b/components/Product/OnCart/index.tsx @@ -0,0 +1,47 @@ +import {useState,useEffect} from 'react'; +import { productProp } from '../../../interfaces'; +import {useCart} from '../../../hooks/useCart'; +import {RiShoppingCart2Fill,RiShoppingCart2Line} from 'react-icons/ri'; + +export const OnCart=({product}:productProp)=>{ + + const { cart, removeProduct, addProduct } = useCart(); + const [ liked, setLiked ] = useState(false); + + + useEffect( + () => { + const isSaved = cart.find((cart_product) => cart_product.productId == product.id); + + if (isSaved) { + setLiked(true); + } + }, + [ cart, product.id ] + ); + + const handleToogleLike = () => { + + if (liked) { + removeProduct(product.id); + setLiked(false); + } else { + addProduct(product.id); + setLiked(true); + } + }; + + return ( +
+ {liked ? ( + + ) : ( + + )} +
+ ) + +} \ No newline at end of file diff --git a/components/Product/ProductCardCart/index.tsx b/components/Product/ProductCardCart/index.tsx new file mode 100644 index 0000000..c686c46 --- /dev/null +++ b/components/Product/ProductCardCart/index.tsx @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from 'react'; +import Link from 'next/link'; +import { handleDelete } from '../../../utils'; +import { IoMdClose } from 'react-icons/io'; +import { AmountControl } from '../AmountControl'; +import { useCart } from '../../../hooks/useCart'; +import { productProp } from '../../../interfaces'; +import { formatImageURL } from '../../../utils'; +import { ProductImage } from '../ProductImage'; + +export function ProductCardCart({ product }: productProp) { + const { removeProduct } = useCart(); + const [ formatedProduct, setFormatedProduct ] = useState({ + ...product, + image: formatImageURL(product.image), + total: (product.amount * product.price).toFixed(2) + }); + + useEffect( + () => { + setFormatedProduct({ + ...product, + image: formatImageURL(product.image), + total: (product.amount * product.price).toFixed(2) + }); + }, + [ product ] + ); + + return ( +
+ +
+ {/* passing cart as classname couse the style wanted is on ../../../styles/Cart.modules.css */} + +
+ +
+
+ + +

{product.name}

+
+ +
+

R$ {product.price}

+ +
+ +
+

+ Total: R$ {formatedProduct.total} +

+ +
+
+ ); +} diff --git a/components/Product/ProductCardCatalog/index.tsx b/components/Product/ProductCardCatalog/index.tsx new file mode 100644 index 0000000..2d6ca45 --- /dev/null +++ b/components/Product/ProductCardCatalog/index.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Link from 'next/link'; +import { productProp } from '../../../interfaces'; +import { Product } from '../index'; +import { OnCart } from '../OnCart'; +import {Share} from '../Share'; +import { ProductImage } from '../ProductImage'; + +export function ProductCard({ product }: productProp) { + + return ( +
+
+ {/* rounded-t-md is a custom css classname found at styles/Lazy.module.css */} + +
+ + +
+
+ + + + +
See more
+
+ +
+ ); +} diff --git a/components/Product/ProductImage/index.tsx b/components/Product/ProductImage/index.tsx new file mode 100644 index 0000000..4f45cb9 --- /dev/null +++ b/components/Product/ProductImage/index.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { productInterface } from '../../../interfaces'; +import { LazyLoadImage } from 'react-lazy-load-image-component'; +import 'react-lazy-load-image-component/src/effects/blur.css'; + +interface ProductImageProps { + styles?: string; + product: productInterface; +} + +export function ProductImage({ product, styles }: ProductImageProps) { + return ( +
+ +
+ ); +} diff --git a/components/Product/Share/index.tsx b/components/Product/Share/index.tsx new file mode 100644 index 0000000..3987bbc --- /dev/null +++ b/components/Product/Share/index.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import {FaTelegramPlane} from 'react-icons/fa'; +import Swal from 'sweetalert2'; +export function Share({product}) { + + const handleClick = (product) => { + //copy to clipboard + const text = `${product.name} - R$ ${product.price}`; + const el = document.createElement('textarea'); + el.value = text; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); + + if (navigator.share) { + navigator + .share({ + title: product.name, + text: `${product.name} - R$ ${product.price}`, + url: `${process.env.NEXT_PUBLIC_URL}/product/${product.id}`, + }) + .then(() => { + console.log("Successfully shared!"); + }) + .catch((error) => { + console.error(error); + }); + } + else + Swal.fire + ({ + title: 'Oops...🙄!', + text: 'It seems you are not using a browser that supports sharing', + }) + }; + + return <> + handleClick(product)}/> + ; +} diff --git a/components/Product/index.tsx b/components/Product/index.tsx new file mode 100644 index 0000000..9927719 --- /dev/null +++ b/components/Product/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { productProp } from '../../interfaces'; + +export function Product({ product }: productProp) { + const router = useRouter(); + + + return ( +
+
+
+
+

R$ {product.price}

+
+ + { + // if path is /product/:id disable the Link else enable it + router.pathname === `/product/${product.id}` ? + ( + + +

{product.name}

+
+ + ): +

{product.name}

+ } +
+
+
+ ); +} diff --git a/hooks/useCart.tsx b/hooks/useCart.tsx new file mode 100644 index 0000000..01939be --- /dev/null +++ b/hooks/useCart.tsx @@ -0,0 +1,127 @@ +import { createContext, useContext, useState,ReactNode,useEffect} from "react"; +import { toast } from "react-toastify"; +import { CartContextData, productInterface, ProductIdWithAmount} from "../interfaces"; +import { useProducts } from "./useProducts"; +import {LoadProducts} from '../services'; + +interface CartProviderProps { + children: ReactNode; +} + +const CartContext = createContext({} as CartContextData); + +export function CartProvider({ children }: CartProviderProps):JSX.Element { + + const [cart, setCart] = useState([]); + const { data: products } = useProducts(process.env.API_URL); + + useEffect(() => { + + const loadCart=() => { + const storedCart = localStorage.getItem("@ecommerce:cart"); + + if (storedCart) { + return JSON.parse(storedCart); + } + + return []; + } + + const storedCart = loadCart(); + setCart(storedCart); + }, []); + + + const addProduct = async (productId: number) => { + try { + //if productid is on products add to cart + if(products){ + const product = products.find((product) => product.id === productId); + if(product){ + const newCart = [...cart, { productId, amount: 1 }]; + setCart(newCart); + localStorage.setItem("@ecommerce:cart", JSON.stringify(newCart)); + toast.success("Product added to cart successfully"); + } + } + + } catch { + toast.error("Product not found:("); + } + }; + + const removeProduct = (productId: number) => { + try { + const newCart = cart.filter((cart_product) => cart_product.productId !== productId); + if (newCart.length === cart.length) throw Error; + setCart(newCart); + localStorage.setItem("@ecommerce:cart", JSON.stringify(newCart)); + + } catch { + toast.error("Something went wrong("); + } + }; + + const updateProductAmount = async ({ + productId, + amount, + }: ProductIdWithAmount) => { + try { + //check if amount is NaN, then addProduct with id productId + if(isNaN(amount)){ + addProduct(productId); + return; + } + + //check if amount is 0, then removeProduct with id productId + if(amount === 0){ + removeProduct(productId); + return; + } + + const products = await LoadProducts(); + + const stock = products.find((product) => product.id === productId).stock; + + if (amount > stock.amount) { + throw toast.error("Quantity not available"); + return; + } + + let newCart = [...cart].filter((product) => { + if (product.productId === productId) product.amount = amount; + return product; + }); + + setCart(newCart); + localStorage.setItem("@ecommerce:cart", JSON.stringify(newCart)); + } catch { + toast.error("Something went wrong :("); + } + }; + + const clearCart = () => { + localStorage.removeItem("@ecommerce:cart"); + setCart([]); + }; + + + return ( + + {children} + + ); +} + +export const useCart=():CartContextData=>{ + return useContext(CartContext); +} \ No newline at end of file diff --git a/hooks/useProducts.ts b/hooks/useProducts.ts new file mode 100644 index 0000000..f5fb952 --- /dev/null +++ b/hooks/useProducts.ts @@ -0,0 +1,13 @@ +import { productInterface } from './../interfaces/index'; +import useSWR from 'swr'; +const fetcher = async (url: string) => await fetch(url).then((r) => r.json()); +export const useProducts = (url:string) => { + + const revalidationOptions = { + revalidateOnFocus: true, + revalidateOnReconnect: true, + }; + + const { data, error } = useSWR(url, fetcher,revalidationOptions); + return { data, error }; +} diff --git a/interfaces/index.ts b/interfaces/index.ts new file mode 100644 index 0000000..3533fe1 --- /dev/null +++ b/interfaces/index.ts @@ -0,0 +1,45 @@ +export interface productInterface{ + id: number; + name: string; + price: number; + image: string; + stock?: number; + amount?: number; + }; + +export interface productProp { + product: productInterface; + } + +export interface ProductsProp { + products: productInterface[] + } + +export interface ProductIdWithAmount { + productId: number; + amount: number; + } + +export interface DeleteProductProps { + message: string, + handler:(param?)=>void + } + +export interface CartContextData { + cart: ProductIdWithAmount[]; + products: productInterface[]; + clearCart: () => void; + addProduct: (productId: number) => Promise; + removeProduct: (productId: number) => void; + updateProductAmount: ({ productId, amount }: ProductIdWithAmount) => void; + } + +export interface formatedProductInterface extends productInterface { + total: number; + } + +export interface FormatedProductProps{ + product:productInterface, + cart?:ProductIdWithAmount[] + } + \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js index 0d60710..63333a2 100644 --- a/next.config.js +++ b/next.config.js @@ -1,3 +1,19 @@ module.exports = { - reactStrictMode: true, -} + reactStrictMode: true, + //export API_URL + env: { + API_URL: process.env.API_URL + }, + images: { + domains: [ 'lorempixel.com.br' ] + }, + async redirects() { + return [ + { + source: '/', + destination: '/home', + permanent: true + } + ]; + } +}; diff --git a/package-lock.json b/package-lock.json index 2d28424..146b903 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,20 +6,32 @@ "": { "name": "ecommerce", "dependencies": { + "@tailwindcss/line-clamp": "^0.3.1", "next": "12.0.8", "react": "17.0.2", - "react-dom": "17.0.2" + "react-dom": "17.0.2", + "react-icons": "^4.3.1", + "react-lazy-load-image-component": "^1.5.1", + "react-toastify": "^8.1.0", + "sweetalert2": "^11.3.5", + "swr": "^1.1.2", + "tailwindcss-filters": "^3.0.0" }, "devDependencies": { + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "autoprefixer": "^10.4.2", "eslint": "8.6.0", - "eslint-config-next": "12.0.8" + "eslint-config-next": "12.0.8", + "postcss": "^8.4.5", + "tailwindcss": "^3.0.13", + "typescript": "^4.5.4" } }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "peer": true, "dependencies": { "@babel/highlight": "^7.16.7" }, @@ -407,7 +419,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -793,7 +804,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -806,7 +816,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -815,7 +824,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -830,6 +838,14 @@ "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", "dev": true }, + "node_modules/@tailwindcss/line-clamp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz", + "integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg==", + "peerDependencies": { + "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -841,6 +857,34 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz", @@ -978,6 +1022,35 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1016,7 +1089,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1024,6 +1096,23 @@ "node": ">=4" } }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1111,6 +1200,32 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, + "node_modules/autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dependencies": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/axe-core": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", @@ -1140,6 +1255,14 @@ "node": "*" } }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1154,7 +1277,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1166,7 +1288,6 @@ "version": "4.19.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001286", "electron-to-chromium": "^1.4.17", @@ -1202,11 +1323,18 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001299", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", @@ -1220,7 +1348,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1234,7 +1361,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "peer": true, "engines": { "node": ">=4" } @@ -1243,7 +1369,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1251,11 +1376,49 @@ "node": ">=4" } }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -1263,8 +1426,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "peer": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/colorette": { "version": "1.4.0", @@ -1301,6 +1463,21 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1315,6 +1492,23 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", + "dev": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -1355,6 +1549,32 @@ "node": ">= 0.4" } }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1367,6 +1587,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1382,8 +1607,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.44", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz", - "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==", - "peer": true + "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -1411,6 +1635,14 @@ "node": ">=8.6" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -1466,7 +1698,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true, "engines": { "node": ">=6" } @@ -1475,7 +1706,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -1986,7 +2216,6 @@ "version": "3.2.10", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2002,7 +2231,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2026,7 +2254,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2047,7 +2274,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2086,17 +2312,41 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "node_modules/fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -2167,7 +2417,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2217,7 +2466,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -2282,7 +2530,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2332,6 +2579,11 @@ "node": ">= 0.4" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -2344,6 +2596,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -2376,7 +2639,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -2403,7 +2665,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2412,7 +2673,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2436,7 +2696,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -2571,6 +2830,11 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2639,6 +2903,19 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", @@ -2676,12 +2953,27 @@ "node": ">=4" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2714,7 +3006,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -2723,7 +3014,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -2826,6 +3116,23 @@ } } }, + "node_modules/next/node_modules/postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, "node_modules/node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -2837,8 +3144,23 @@ "node_modules/node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "peer": true + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/object-assign": { "version": "4.1.1", @@ -2848,6 +3170,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -3008,7 +3338,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -3016,6 +3345,23 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -3046,14 +3392,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -3061,14 +3405,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "peer": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -3077,13 +3419,13 @@ } }, "node_modules/postcss": { - "version": "8.2.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", - "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map": "^0.6.1" + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3093,21 +3435,98 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, "engines": { - "node": ">= 0.8.0" + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { + "node_modules/postcss-load-config": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", + "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "dependencies": { + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { "node": ">=0.4.0" } }, @@ -3141,7 +3560,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -3157,6 +3575,17 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -3182,11 +3611,32 @@ "react": "17.0.2" } }, + "node_modules/react-icons": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lazy-load-image-component": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.1.tgz", + "integrity": "sha512-grTEZzURLHPkq7JoipcBBQU44ijdF4fH3Cb+eSD5eSAaMsjugbXqTaVWm5ruPUNLduoNR9KKQF6bOR9h2WphEg==", + "dependencies": { + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1" + }, + "peerDependencies": { + "react": "^15.x.x || ^16.x.x || ^17.x.x", + "react-dom": "^15.x.x || ^16.x.x || ^17.x.x" + } + }, "node_modules/react-refresh": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", @@ -3195,6 +3645,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-toastify": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.1.0.tgz", + "integrity": "sha512-M+Q3rTmEw/53Csr7NsV/YnldJe4c7uERcY7Tma9mvLU98QT2VhIkKwjBzzxZkJRk/oBKyUAtkyMjMgO00hx6gQ==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -3208,6 +3670,17 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -3246,7 +3719,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, "dependencies": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -3263,7 +3735,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -3272,7 +3743,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3297,7 +3767,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -3404,6 +3873,14 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -3569,7 +4046,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3577,6 +4053,124 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sweetalert2": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.3.5.tgz", + "integrity": "sha512-0NlqxsMvoTpVrLD9bQN/aN2JleuaXLLiBDvG/kYWHzjeOmDp8Yn7AEOcUnyCHDf9jT7w7BeziSX8mnijg0mDJw==", + "funding": { + "url": "https://sweetalert2.github.io/#donations" + } + }, + "node_modules/swr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.1.2.tgz", + "integrity": "sha512-UsM0eo5T+kRPyWFZtWRx2XR5qzohs/LS4lDC0GCyLpCYFmsfTk28UCVDbOE9+KtoXY4FnwHYiF+ZYEU3hnJ1lQ==", + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/tailwindcss": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.13.tgz", + "integrity": "sha512-raRPGFwQSGXn/3h0ttHND9jyPYfqk/ur2NXtlQuK25+ZnrCjlH1s1j4/oPswHGMoZzGNykUVycZ/LcROanUE0A==", + "dependencies": { + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.8", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.21.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss-filters": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss-filters/-/tailwindcss-filters-3.0.0.tgz", + "integrity": "sha512-xhortqs8fSp9id17EnneYhmruA5DfU6K0zvN6/mgDlEXKaHthjXlR74Ta+4lrX5Lp7tp6YigB09WO0TOWn7VEQ==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/tailwindcss/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/tailwindcss/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3595,7 +4189,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -3677,7 +4270,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3778,11 +4370,27 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } } }, "dependencies": { @@ -3790,7 +4398,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "peer": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -4103,7 +4710,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "peer": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -4340,7 +4946,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4349,14 +4954,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4368,6 +4971,12 @@ "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", "dev": true }, + "@tailwindcss/line-clamp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.3.1.tgz", + "integrity": "sha512-pNr0T8LAc3TUx/gxCfQZRe9NB2dPEo/cedPHzUGIPxqDMhgjwNm6jYxww4W5l0zAsAddxr+XfZcqttGiFDgrGg==", + "requires": {} + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -4379,6 +4988,34 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "dev": true + }, + "@types/react": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, "@typescript-eslint/parser": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz", @@ -4456,6 +5093,28 @@ "dev": true, "requires": {} }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4484,11 +5143,24 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, "requires": { "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4552,6 +5224,19 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, + "autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "requires": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, "axe-core": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", @@ -4575,6 +5260,11 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4589,7 +5279,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -4598,7 +5287,6 @@ "version": "4.19.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "peer": true, "requires": { "caniuse-lite": "^1.0.30001286", "electron-to-chromium": "^1.4.17", @@ -4620,8 +5308,12 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { "version": "1.0.30001299", @@ -4632,7 +5324,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4642,25 +5333,52 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "peer": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, "requires": { "has-flag": "^3.0.0" } } } }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, "requires": { "color-name": "1.1.3" } @@ -4668,8 +5386,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "peer": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colorette": { "version": "1.4.0", @@ -4703,6 +5420,18 @@ "integrity": "sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg==", "dev": true }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4714,6 +5443,17 @@ "which": "^2.0.1" } }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "csstype": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", + "dev": true + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -4743,6 +5483,26 @@ "object-keys": "^1.0.12" } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4752,6 +5512,11 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4764,8 +5529,7 @@ "electron-to-chromium": { "version": "1.4.44", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz", - "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==", - "peer": true + "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==" }, "emoji-regex": { "version": "9.2.2", @@ -4787,6 +5551,14 @@ "ansi-colors": "^4.1.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -4829,14 +5601,12 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "peer": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "8.6.0", @@ -5226,7 +5996,6 @@ "version": "3.2.10", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5239,7 +6008,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -5262,7 +6030,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -5280,7 +6047,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -5310,17 +6076,27 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -5373,7 +6149,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -5410,7 +6185,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -5451,7 +6225,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5489,6 +6262,11 @@ "side-channel": "^1.0.4" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -5498,6 +6276,14 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -5518,7 +6304,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -5535,14 +6320,12 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -5556,8 +6339,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.6", @@ -5647,6 +6429,11 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "peer": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5703,6 +6490,16 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", @@ -5733,12 +6530,27 @@ "path-exists": "^3.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5764,14 +6576,12 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -5834,6 +6644,18 @@ "stream-browserify": "3.0.0", "styled-jsx": "5.0.0-beta.6", "use-subscription": "1.5.1" + }, + "dependencies": { + "postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" + } + } } }, "node-fetch": { @@ -5844,14 +6666,28 @@ "node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "peer": true + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -5970,11 +6806,21 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5996,37 +6842,72 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "peer": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "postcss": { - "version": "8.2.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", - "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map": "^0.6.1" + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", + "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "requires": { + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" } }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6067,8 +6948,12 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "react": { "version": "17.0.2", @@ -6089,16 +6974,39 @@ "scheduler": "^0.20.2" } }, + "react-icons": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "requires": {} + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-lazy-load-image-component": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.1.tgz", + "integrity": "sha512-grTEZzURLHPkq7JoipcBBQU44ijdF4fH3Cb+eSD5eSAaMsjugbXqTaVWm5ruPUNLduoNR9KKQF6bOR9h2WphEg==", + "requires": { + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1" + } + }, "react-refresh": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" }, + "react-toastify": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.1.0.tgz", + "integrity": "sha512-M+Q3rTmEw/53Csr7NsV/YnldJe4c7uERcY7Tma9mvLU98QT2VhIkKwjBzzxZkJRk/oBKyUAtkyMjMgO00hx6gQ==", + "requires": { + "clsx": "^1.1.1" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -6109,6 +7017,14 @@ "util-deprecate": "^1.0.1" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -6135,7 +7051,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, "requires": { "is-core-module": "^2.8.0", "path-parse": "^1.0.7", @@ -6145,14 +7060,12 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -6167,7 +7080,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -6228,6 +7140,11 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + }, "stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -6351,8 +7268,93 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sweetalert2": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.3.5.tgz", + "integrity": "sha512-0NlqxsMvoTpVrLD9bQN/aN2JleuaXLLiBDvG/kYWHzjeOmDp8Yn7AEOcUnyCHDf9jT7w7BeziSX8mnijg0mDJw==" + }, + "swr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.1.2.tgz", + "integrity": "sha512-UsM0eo5T+kRPyWFZtWRx2XR5qzohs/LS4lDC0GCyLpCYFmsfTk28UCVDbOE9+KtoXY4FnwHYiF+ZYEU3hnJ1lQ==", + "requires": {} + }, + "tailwindcss": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.13.tgz", + "integrity": "sha512-raRPGFwQSGXn/3h0ttHND9jyPYfqk/ur2NXtlQuK25+ZnrCjlH1s1j4/oPswHGMoZzGNykUVycZ/LcROanUE0A==", + "requires": { + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.8", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.21.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "tailwindcss-filters": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss-filters/-/tailwindcss-filters-3.0.0.tgz", + "integrity": "sha512-xhortqs8fSp9id17EnneYhmruA5DfU6K0zvN6/mgDlEXKaHthjXlR74Ta+4lrX5Lp7tp6YigB09WO0TOWn7VEQ==", + "requires": { + "lodash": "^4.17.15" + } }, "text-table": { "version": "0.2.0", @@ -6369,7 +7371,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -6431,8 +7432,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true, - "peer": true + "dev": true }, "unbox-primitive": { "version": "1.0.1", @@ -6508,11 +7508,21 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" } } } diff --git a/package.json b/package.json index d8de8d0..98753ab 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,25 @@ "lint": "next lint" }, "dependencies": { + "@tailwindcss/line-clamp": "^0.3.1", "next": "12.0.8", "react": "17.0.2", - "react-dom": "17.0.2" + "react-dom": "17.0.2", + "react-icons": "^4.3.1", + "react-lazy-load-image-component": "^1.5.1", + "react-toastify": "^8.1.0", + "sweetalert2": "^11.3.5", + "swr": "^1.1.2", + "tailwindcss-filters": "^3.0.0" }, "devDependencies": { + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "autoprefixer": "^10.4.2", "eslint": "8.6.0", - "eslint-config-next": "12.0.8" + "eslint-config-next": "12.0.8", + "postcss": "^8.4.5", + "tailwindcss": "^3.0.13", + "typescript": "^4.5.4" } } diff --git a/pages/_app.js b/pages/_app.js deleted file mode 100644 index 1e1cec9..0000000 --- a/pages/_app.js +++ /dev/null @@ -1,7 +0,0 @@ -import '../styles/globals.css' - -function MyApp({ Component, pageProps }) { - return -} - -export default MyApp diff --git a/pages/_app.tsx b/pages/_app.tsx new file mode 100644 index 0000000..560526f --- /dev/null +++ b/pages/_app.tsx @@ -0,0 +1,18 @@ +import '../styles/globals.css'; +import '../styles/Lazy.modules.css'; + +import Layout from '../components/Layout'; +import {CartProvider} from '../hooks/useCart'; + +function MyApp({ Component, pageProps }) { + + return ( + + + + + + ); +} + +export default MyApp; diff --git a/pages/_document.tsx b/pages/_document.tsx new file mode 100644 index 0000000..174cca4 --- /dev/null +++ b/pages/_document.tsx @@ -0,0 +1,26 @@ +import Document, { Html, Head, Main, NextScript } from 'next/document' + +class MyDocument extends Document { + static async getInitialProps(ctx) { + const initialProps = await Document.getInitialProps(ctx) + return { ...initialProps } + } + + render() { + return ( + + + + + + + +
+ + + + ) + } + } + + export default MyDocument \ No newline at end of file diff --git a/pages/api/hello.js b/pages/api/hello.js deleted file mode 100644 index df63de8..0000000 --- a/pages/api/hello.js +++ /dev/null @@ -1,5 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction - -export default function handler(req, res) { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/pages/cart.tsx b/pages/cart.tsx new file mode 100644 index 0000000..1c37bb6 --- /dev/null +++ b/pages/cart.tsx @@ -0,0 +1,89 @@ +import React, { useEffect ,useState} from 'react'; +import Link from 'next/link'; + +import {handleDelete,formatImageURL } from '../utils'; + +import { ImBin2 } from 'react-icons/im'; +import { productInterface } from '../interfaces/'; +import { useCart } from '../hooks/useCart'; + +import { BuyContainer } from '../components/Product/BuyContainer'; +import { ProductCardCart } from '../components/Product/ProductCardCart'; + +export default function Cartpage() { + + const { cart, products,clearCart } = useCart(); + const [ saved_products, setSavedProducts ] = useState([]); + const [ total, setTotal ] = useState(0); + + useEffect( + () => { + const loadProducts = async () => { + let subtotal = 0; + //get all the products in the cart and add the amount + if(products){ + const cart_products = cart.flatMap((item) => { + const product = products.find((product) => product.id === item.productId); + subtotal += product.price * item.amount; + if (product) { + return { + ...product, + image: formatImageURL(product.image), + amount: item.amount + }; + } + return null; + }); + setSavedProducts(cart_products); + setTotal(() => +subtotal.toFixed(2)); + }; + }; + loadProducts(); + }, + [ cart, products ] + ); + + if(products&&products.length === 0){ + return
Loading...
+ } + + if(products&&cart.length === 0) { + return ( +
+

Cart is empty

+ + + Let's Back to Catalog? + + +
+ ); + } + + return ( +
+
+

Cart

+ {saved_products.length > 0 && ( + + )} +
+ +
{saved_products&&saved_products.map((product) => )}
+ + {cart.length > 0 ? ( +
+ +
+ + ) : null} +
+ ); +} diff --git a/pages/home.tsx b/pages/home.tsx new file mode 100644 index 0000000..ea74e62 --- /dev/null +++ b/pages/home.tsx @@ -0,0 +1,37 @@ +import Head from 'next/head'; +import {ProductCard} from '../components/Product/ProductCardCatalog'; +import { ProductsProp } from '../interfaces'; +import { loadFormatedProduct } from '../utils'; + +export default function Home({products}: ProductsProp) { + + return ( + <> + + Ecommerce project + + + +
+ +
+

Products

+ {products.map((product) => ( + + ))} +
+
+ + ); +} + +export const getStaticProps = async () => { + const response = await fetch(process.env.API_URL) + const products = await response.json() + const formatedProducts = products.map(product=>loadFormatedProduct({product})) + return { + props: { + products: formatedProducts + }, + }; +} \ No newline at end of file diff --git a/pages/index.js b/pages/index.js deleted file mode 100644 index dc4b640..0000000 --- a/pages/index.js +++ /dev/null @@ -1,69 +0,0 @@ -import Head from 'next/head' -import Image from 'next/image' -import styles from '../styles/Home.module.css' - -export default function Home() { - return ( - - ) -} diff --git a/pages/payment.tsx b/pages/payment.tsx new file mode 100644 index 0000000..3eac394 --- /dev/null +++ b/pages/payment.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Link from 'next/link'; +import {FaGithubAlt} from 'react-icons/fa'; + +export default function Payment() { + return
+

🥳 Contragulations!

+
+

+ You have successfully completed your order. + + + Let's Make another present? + + + && +

+

+ +
+
; +} diff --git a/pages/product/[id].tsx b/pages/product/[id].tsx new file mode 100644 index 0000000..21f31c1 --- /dev/null +++ b/pages/product/[id].tsx @@ -0,0 +1,55 @@ +import React, { useEffect, useState } from 'react'; +import { GetStaticProps } from 'next'; + +import { productProp, formatedProductInterface } from '../../interfaces/'; +import { useCart } from '../../hooks/useCart'; + +import { Product } from '../../components/Product'; +import { AmountControl } from '../../components/Product/AmountControl'; +import { BuyContainer } from '../../components/Product/BuyContainer'; +import { Share } from '../../components/Product/Share'; +import { loadFormatedProduct } from '../../utils'; +import { ProductImage } from '../../components/Product/ProductImage'; + +export default function Details({ product }: productProp) { + const { cart } = useCart(); + + const [ formatedProduct, setFormatedProduct ] = useState( + loadFormatedProduct({ product, cart }) + ); + + useEffect( + () => { + setFormatedProduct(loadFormatedProduct({ product, cart })); + }, + [ product, cart ] + ); + + return ( +
+
+ +
+ +
+
+ + +
+ +
+
+ ); +} + +export const getServerSideProps: GetStaticProps = async (context) => { + const id = context.params.id; + const response = await fetch(`${process.env.API_URL}/${id}`); + const product = await response.json(); + + return { + props: { + product + } + }; +}; diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/default-image.jpg b/public/default-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37e761ce14d4843651c758b3695f15454b6a6901 GIT binary patch literal 50763 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 literal 0 HcmV?d00001 diff --git a/public/logo-2x.png b/public/logo-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b09def6002088ba55a90d4d188553127cac9e0ed GIT binary patch literal 6393 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 { + // load the products from the api + const response = await fetch(process.env.API_URL) + const products = await response.json() + return products + } \ No newline at end of file diff --git a/styles/Home.module.css b/styles/Home.module.css deleted file mode 100644 index 32a57d5..0000000 --- a/styles/Home.module.css +++ /dev/null @@ -1,116 +0,0 @@ -.container { - padding: 0 2rem; -} - -.main { - min-height: 100vh; - padding: 4rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.footer { - display: flex; - flex: 1; - padding: 2rem 0; - border-top: 1px solid #eaeaea; - justify-content: center; - align-items: center; -} - -.footer a { - display: flex; - justify-content: center; - align-items: center; - flex-grow: 1; -} - -.title a { - color: #0070f3; - text-decoration: none; -} - -.title a:hover, -.title a:focus, -.title a:active { - text-decoration: underline; -} - -.title { - margin: 0; - line-height: 1.15; - font-size: 4rem; -} - -.title, -.description { - text-align: center; -} - -.description { - margin: 4rem 0; - line-height: 1.5; - font-size: 1.5rem; -} - -.code { - background: #fafafa; - border-radius: 5px; - padding: 0.75rem; - font-size: 1.1rem; - font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, - Bitstream Vera Sans Mono, Courier New, monospace; -} - -.grid { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - max-width: 800px; -} - -.card { - margin: 1rem; - padding: 1.5rem; - text-align: left; - color: inherit; - text-decoration: none; - border: 1px solid #eaeaea; - border-radius: 10px; - transition: color 0.15s ease, border-color 0.15s ease; - max-width: 300px; -} - -.card:hover, -.card:focus, -.card:active { - color: #0070f3; - border-color: #0070f3; -} - -.card h2 { - margin: 0 0 1rem 0; - font-size: 1.5rem; -} - -.card p { - margin: 0; - font-size: 1.25rem; - line-height: 1.5; -} - -.logo { - height: 1em; - margin-left: 0.5rem; -} - -@media (max-width: 600px) { - .grid { - width: 100%; - flex-direction: column; - } -} diff --git a/styles/Lazy.modules.css b/styles/Lazy.modules.css new file mode 100644 index 0000000..3d5aa05 --- /dev/null +++ b/styles/Lazy.modules.css @@ -0,0 +1,32 @@ +.lazy-load-image-background.blur.lazy-load-image-loaded img { + height: 100%; + object-fit: cover; + +} +.rounded-t-md> .lazy-load-image-background.blur.lazy-load-image-loaded img{ + border-top-left-radius: .375rem; + border-top-right-radius: .375rem; +} + +.rounded-r-md> .lazy-load-image-background.blur.lazy-load-image-loaded img{ + border-top-right-radius: .375rem; + border-bottom-right-radius: .375rem; +} + +.rounded-md> .lazy-load-image-background.blur.lazy-load-image-loaded img{ + border-radius: .375rem; +} + +.rounded-l-md> .lazy-load-image-background.blur.lazy-load-image-loaded img { + + border-top-left-radius: .375rem; + border-bottom-left-radius: .375rem; +} + +.lazy-load-image-background.blur.lazy-load-image-loaded{ + position: relative; + display:flex; + background-color: #fafafa; + height: 100%; + +} \ No newline at end of file diff --git a/styles/globals.css b/styles/globals.css index e5e2dcc..5255f97 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,16 +1,5 @@ -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -} +@tailwind base; +@tailwind components; +@tailwind utilities; -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} +@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300&display=swap'); \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..fca8485 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,16 @@ +module.exports = { + content: [ './pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}' ], + theme: { + extend: { + fontFamily: { + // 'varela-round': [ 'Varela Round', 'sans-serif' ], + montserrat: [ 'Montserrat', 'sans-serif' ] + } + // backdropFilter: { + // none: 'none', + // blur: 'blur(10px)' + // } + } + }, + plugins: [ require('@tailwindcss/line-clamp'), require('tailwindcss-filters') ] +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6db37c0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/utils/index.ts b/utils/index.ts new file mode 100644 index 0000000..fd1f1da --- /dev/null +++ b/utils/index.ts @@ -0,0 +1,60 @@ +import { DeleteProductProps, FormatedProductProps } from './../interfaces/index'; +import Swal from 'sweetalert2'; + +export const formatedPrice = (price:number) => { + return ((price).toFixed(2)) +} + +export const formatImageURL=(image_url:string)=>{ + //due to the fact that the original image url is not responding to the request, we need to use another url + //replace .com with .com.br + if(!image_url.includes(".com.br")){ + const image_with_br = image_url.replace('.com', '.com.br'); + return image_with_br; + } + return image_url; +} + +export const loadFormatedProduct = ({product,cart}:FormatedProductProps) => { + //return the product with the total price and the amount of products in the cart, and the image url with the .com.br + let cart_product=null + if(cart){ + cart_product = cart.find((cart_product) => cart_product.productId === product.id); + } + return {...product,total:(cart_product?.amount||0)*product.price,amount:cart_product?.amount||0,image:formatImageURL(product.image)} +} + + + +export const handleDelete=({handler,message}:DeleteProductProps)=> { +// Open a popup to confirm the deletion + const dialog = Swal.mixin({ + customClass: { + confirmButton: + 'text-gray-700 bg-gray-200 hover:bg-gray-300 px-4 py-2 rounded-md text-xs font-light ml-2', + cancelButton: + 'text-gray-200 bg-gray-700 hover:bg-gray-600 px-4 py-2 rounded-md text-sm font-semibold ml-2' + }, + buttonsStyling: false + }); + + dialog + .fire({ + title: 'Are you sure?', + text: "You won't be able to revert this!", + icon: 'warning', + + showCancelButton: true, + confirmButtonColor: '#aaa', + cancelButtonColor: '#444', + focusCancel: true, + confirmButtonText: 'Yes, delete it!', + cancelButtonText: 'Undo' + }) + .then((result) => { + if (result.value) { + handler(); + Swal.fire('Deleted:(', message); + } + }); +}