+ {t.orderSummary}
+
+
+
+
+
{t.subtotalText}
+
-
- {scholarshipId ? (
-
-
{t.scholaarshipApplied}
-
00
-
- ) : null}
-
-
+ />
+
+ {scholarshipId ? (
+
+
{t.scholaarshipApplied}
+
00
+ ) : null}
+
+
-
props.onOrderClick()}
- />
- >
- ) : (
-
- )}
+
+
+
>
)
}
diff --git a/apps/dsep/components/customToast/custom-toast.tsx b/apps/dsep/components/customToast/custom-toast.tsx
new file mode 100644
index 000000000..ec1aa57e5
--- /dev/null
+++ b/apps/dsep/components/customToast/custom-toast.tsx
@@ -0,0 +1,31 @@
+import { Box, Text } from '@chakra-ui/react'
+
+const CustomToast: React.FC<{ title: string; message: string }> = ({ title, message }) => (
+
+
+ {title}
+
+
+ {message}
+
+
+)
+
+export default CustomToast
diff --git a/apps/dsep/components/landingPage/LandingPage.tsx b/apps/dsep/components/landingPage/LandingPage.tsx
index 1aa49adac..e30e85c40 100644
--- a/apps/dsep/components/landingPage/LandingPage.tsx
+++ b/apps/dsep/components/landingPage/LandingPage.tsx
@@ -1,10 +1,10 @@
import React, { useState } from 'react'
import Router from 'next/router'
+import { SearchInput } from '@beckn-ui/becknified-components'
+import { Box, Flex, Text, Image } from '@chakra-ui/react'
import ImageCard from './ImageCard'
import { useLanguage } from '../../hooks/useLanguage'
-import { Box, Flex, Text, Input, Image } from '@chakra-ui/react'
-
import beckenFooter from '../../public/images/beckenFooterLogo.svg'
import couresImageWhite from '../../public/images/landing-page-icons/CoursesWhite.svg'
import coursesImageBlack from '../../public/images/landing-page-icons/CoursesBlack.svg'
@@ -29,6 +29,13 @@ const LandingPage: React.FC = () => {
setActiveCard(type)
}
+ const searchIconClickHandler = (e: any) => {
+ if (searchTerm) {
+ navigateToSearchResults()
+ }
+ e.preventDefault()
+ }
+
return (
{
))}
-
-
+ setSearchTerm(e.target.value)}
- onKeyDown={event => event.key === 'Enter' && navigateToSearchResults()}
- _focusVisible={{
- borderColor: 'transparent',
- boxShadow: 'transparent'
- }}
+ onChangeHandler={(e: React.BaseSyntheticEvent) => setSearchTerm(e.target.value)}
+ searchIcon={'/images/searchIcon.svg'}
+ searchIconClickHandler={searchIconClickHandler}
+ onEnterHandler={(e: { key: string }) => e.key === 'Enter' && navigateToSearchResults()}
+ placeHolder={`Search for ${activeCard}`}
/>
-
- {
- if (searchTerm) {
- navigateToSearchResults()
- }
- e.preventDefault()
- }}
- alt={'search icon'}
- />
-
-
+
= ({ children }) => {
const { locale } = useLanguage()
@@ -21,51 +22,56 @@ const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
return (
-
-
- Skill Seeker
-
-
-
-
-
+
+
+ Skill Seeker
+
+
- {children}
-
- {/* */}
-
-
-
+
+
+
+ {children}
+
+ {/* */}
+
+
+
+
)
}
diff --git a/apps/dsep/components/productCard/product-card-renderer.tsx b/apps/dsep/components/productCard/product-card-renderer.tsx
new file mode 100644
index 000000000..16ad6a041
--- /dev/null
+++ b/apps/dsep/components/productCard/product-card-renderer.tsx
@@ -0,0 +1,127 @@
+import { Flex, Box, Image, Text } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import React, { useEffect, useState } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+import StarIcon from '../../public/images/Star.svg'
+import { toBinary } from '../../utilities/common-utils'
+import ProductPrice from '../UI/ProductPrice'
+
+const ProductCardRenderer = (data: any) => {
+ // const [distance, setDistance] = useState(0)
+ const { dataSource } = data
+ const { t } = useLanguage()
+ const router = useRouter()
+ const encodedProduct = window.btoa(toBinary(JSON.stringify(dataSource)))
+
+ const extraInfoMapper: { [key: string]: string } = {
+ // TODO :- To add the mapping of duration
+ ['Duration']: '1 month',
+ ['Sold by']: dataSource.providerName
+ }
+
+ // TODO :- to do some refactoring here and get some components from buolding block
+ return (
+ {
+ localStorage.setItem('selectedItem', JSON.stringify(dataSource))
+ router.push(`/product?productDetails=${encodedProduct}`)
+ }}
+ minH={'168px'}
+ maxH={'100%'}
+ boxShadow="0px 20px 25px rgba(0, 0, 0, 0.10), 0px 8px 10px rgba(0, 0, 0, 0.10)"
+ mt={'64px'}
+ mx={{ md: 6 }}
+ rounded="xl"
+ bg="#fff"
+ position="relative"
+ mb={'20px'}
+ >
+
+
+
+
+
+
+
+
+ {dataSource.item.name}
+
+
+
+ {Object.keys(extraInfoMapper).map((key, idx) => {
+ return (
+
+ {key}:
+
+ {extraInfoMapper[key]}
+
+
+ )
+ })}
+
+
+
+
+
+
+ {dataSource.item.rating}
+
+
+
+ {/* */}
+
+
+ )
+}
+
+export default ProductCardRenderer
diff --git a/apps/dsep/components/productDetails/index.tsx b/apps/dsep/components/productDetails/index.tsx
index d730f39d0..72c46c59f 100644
--- a/apps/dsep/components/productDetails/index.tsx
+++ b/apps/dsep/components/productDetails/index.tsx
@@ -1,30 +1,134 @@
-import React from 'react'
-import { RetailItem } from '../../lib/types/products'
-import ImageSection from './ImageSection'
-import DetailsSection from './DetailsSection'
+import React, { useEffect, useState } from 'react'
+import { ProductSummary, ProductDescription, ProductPrice } from '@beckn-ui/becknified-components'
+import { Flex, Box, Text, useTheme } from '@chakra-ui/react'
+import router from 'next/router'
+import StarRatingComponent from 'react-star-rating-component'
+import { ParsedItemModel } from '../../types/search.types'
+import { Button, Typography } from '@beckn-ui/molecules'
+import { useLanguage } from '../../hooks/useLanguage'
+import { useDispatch } from 'react-redux'
+import { toast } from 'react-toastify'
+import { cartActions } from '../../store/cart-slice'
interface Props {
- product: RetailItem
+ product: ParsedItemModel
}
const ProductDetails: React.FC
= ({ product }) => {
+ const { t } = useLanguage()
+ const [counter, setCounter] = useState(1)
+ const { theme } = useTheme()
+
+ useEffect(() => {
+ return () => {
+ setCounter(1)
+ }
+ }, [product])
+
+ const dispatch = useDispatch()
+
+ function addToCartHandler() {
+ dispatch(
+ cartActions.addItemToCart({
+ product: product,
+ quantity: counter
+ })
+ )
+ toast.success(t.productAddedToCartMsg, {
+ theme: theme === 'dark' ? 'dark' : 'light'
+ })
+ }
+
return (
-
+
+
+
+
+
+ {product.item.short_desc}
+
+
+
+
+ {product.item.rating ? `${parseFloat(product.item.rating)} Stars` : null}
+
+
+ {/* */}
+
+
+
+
+
+
+
+
+ {
+ // router.push('/assemblyDetails')
+ addToCartHandler()
+ }}
+ >
+
+
+
+
+
+
)
}
diff --git a/apps/dsep/components/productList/ProductList.tsx b/apps/dsep/components/productList/ProductList.tsx
index f895f315e..0b864f095 100644
--- a/apps/dsep/components/productList/ProductList.tsx
+++ b/apps/dsep/components/productList/ProductList.tsx
@@ -1,71 +1,75 @@
import React, { useEffect, useState } from 'react'
import { useLanguage } from '../../hooks/useLanguage'
-import { RetailItem } from '../../lib/types/products'
-import Card from '../UI/card/Card'
import Sort from './Sort'
-import { useDispatch, useSelector } from 'react-redux'
-import { SortedProductsListActions } from '../../store/sortedProductList-slice'
-import { IProductListRootState } from '../../lib/types/productList'
+import { Box } from '@chakra-ui/react'
+import { ParsedItemModel } from '../../types/search.types'
+import { ProductCard } from '@beckn-ui/becknified-components'
+import ProductCardRenderer from '../productCard/product-card-renderer'
interface Props {
- productList: RetailItem[]
+ // TODO :- to change this after the proper data mapping in the product cards
+ productList: ParsedItemModel[]
}
+
+export const sortByExpensive = (product1: ParsedItemModel, product2: ParsedItemModel): number => {
+ return parseFloat(product2.item.price.value) - parseFloat(product1.item.price.value)
+}
+
+export const sortByCheapest = (product1: ParsedItemModel, product2: ParsedItemModel): number => {
+ return parseFloat(product1.item.price.value) - parseFloat(product2.item.price.value)
+}
+
const ProductList: React.FC = ({ productList }) => {
const { t } = useLanguage()
-
const [selectedRadioBtn, setSelectedRadioBtn] = useState('all')
- const dispatch = useDispatch()
+ const [sortedProductList, setSortedProductList] = useState([])
+
+ useEffect(() => {
+ setSortedProductList(productList)
+ }, [productList])
useEffect(() => {
- dispatch(
- SortedProductsListActions.sortProductsList({
- productsList: productList,
- sortBasedOn: selectedRadioBtn
- })
- )
- }, [dispatch, productList, selectedRadioBtn])
+ const clonedproductList = structuredClone(productList)
+ if (selectedRadioBtn === 'expensive') {
+ return setSortedProductList(clonedproductList.sort(sortByExpensive))
+ }
- const sortedProductList = useSelector((state: IProductListRootState) => state.sortedProductsList.productsList)
+ if (selectedRadioBtn === 'cheapest') {
+ return setSortedProductList(clonedproductList.sort(sortByCheapest))
+ }
+
+ if (selectedRadioBtn === 'all') {
+ return setSortedProductList(clonedproductList)
+ }
+ }, [selectedRadioBtn])
function onChangeHandler(e: React.ChangeEvent) {
setSelectedRadioBtn(e.currentTarget.id)
}
return (
-
- {/*
*/}
- {/*
*/}
-
-
- {sortedProductList && sortedProductList.length ? (
-
-
+
+
+
+ {sortedProductList.map((item, idx) => (
+
-
- {sortedProductList.map((product: RetailItem) => {
- return (
-
- )
- })}
-
-
- ) : (
-
{t.noProduct}
- )}
-
-
+ ))}
+
+
+ >
)
}
diff --git a/apps/dsep/components/productList/Sort.tsx b/apps/dsep/components/productList/Sort.tsx
index 28975e063..cad0aacb0 100644
--- a/apps/dsep/components/productList/Sort.tsx
+++ b/apps/dsep/components/productList/Sort.tsx
@@ -15,7 +15,6 @@ const Sort: React.FC = ({ selectedBtn: selectedRadioBtn, onChangeSelected
return (
{
const { t } = useLanguage()
const [formData, setFormData] = useState({ email: '', password: '' })
const [formErrors, setFormErrors] = useState({ email: '', password: '' })
const [isFormFilled, setIsFormFilled] = useState(false)
+ const toast = useToast()
+ // TODO :- we can uncomment this if we want something to change on the basis of breakpoint
+ // const breakpoint = useBreakpoint()
+ // const mobileBreakpoints = ['base', 'sm', 'md', 'lg']
const baseUrl = process.env.NEXT_PUBLIC_STRAPI_URL
const handleInputChange = (e: React.ChangeEvent) => {
@@ -67,77 +67,70 @@ const SignIn = () => {
Cookies.set('userEmail', email)
Router.push('/homePage')
} else {
- console.error('Sign In failed')
+ const errorData = await response.json()
+ toast({
+ render: () => (
+
+ ),
+ position: 'top',
+ duration: 2000,
+ isClosable: true
+ })
+ console.error('Registration failed')
}
} catch (error) {
console.error('An error occurred:', error)
}
}
return (
-
-
-
-
-
-
-
-
-
-
{t.formEmail}
- {formErrors.email &&
{formErrors.email}
}
-
-
-
-
{t.password}
- {formErrors.password &&
{formErrors.password}
}
-
-
-
-
- {
- Router.push('/signUp')
- }}
- isDisabled={false}
- />
-
+ {
+ Router.push('/signUp')
+ },
+ disabled: false,
+ variant: 'outline',
+ colorScheme: 'primary'
+ }
+ ],
+
+ inputs: [
+ {
+ type: 'text',
+ name: 'email',
+ value: formData.email,
+ handleChange: handleInputChange,
+ label: t.email,
+ error: formErrors.email
+ },
+ {
+ type: 'password',
+ name: 'password',
+ value: formData.password,
+ handleChange: handleInputChange,
+ label: t.password,
+ error: formErrors.password
+ }
+ ]
+ }}
+ />
)
}
diff --git a/apps/dsep/hooks/useRequest.tsx b/apps/dsep/hooks/useRequest.tsx
index 29ec9c534..0963c3e6b 100644
--- a/apps/dsep/hooks/useRequest.tsx
+++ b/apps/dsep/hooks/useRequest.tsx
@@ -3,7 +3,7 @@ import axios from 'axios'
import { ResponseModel } from '../lib/types/responseModel'
const useRequest = () => {
- const [data, setData] = useState<(ResponseModel & ResponseModel[]) | null>(null)
+ const [data, setData] = useState(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState('')
diff --git a/apps/dsep/lib/types/cart.ts b/apps/dsep/lib/types/cart.ts
index f0233b1ec..5659b3b09 100644
--- a/apps/dsep/lib/types/cart.ts
+++ b/apps/dsep/lib/types/cart.ts
@@ -1,22 +1,7 @@
+import { ParsedItemModel } from '../../types/search.types'
import { IProductDetails, RetailItem, TSlug } from './products'
-export interface ICartProduct {
- image: any
- name: string
- slug: TSlug
- price: number
- discount?: number
- brand: string
- category: string[]
- starRating: number
- isOffer?: boolean
- details?: IProductDetails[]
- registerDate?: string
- quantity: number
- totalPrice: number
-}
-
-export interface CartRetailItem extends RetailItem {
+export interface CartRetailItem extends ParsedItemModel {
quantity: number
totalPrice: number
}
diff --git a/apps/dsep/lib/types/confirm.types.ts b/apps/dsep/lib/types/confirm.types.ts
new file mode 100644
index 000000000..4db447e44
--- /dev/null
+++ b/apps/dsep/lib/types/confirm.types.ts
@@ -0,0 +1,130 @@
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ name: string
+ code: string
+ }
+ city: {
+ name: string
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Image {
+ url: string
+ size_type: string
+}
+
+interface Measure {
+ value: number
+ unit: string
+}
+
+interface AvailableQuantity {
+ count: number
+ measure: Measure
+}
+
+interface TagList {
+ value: string
+}
+
+interface Tag {
+ display: boolean
+ list: TagList[]
+}
+
+interface Price {
+ value: number
+ currency: string
+}
+
+interface Fulfillment {
+ rateable: boolean
+ tracking: boolean
+ id?: string
+ type?: string
+ rating?: number
+}
+
+interface BreakupItem {
+ title: string
+ price: Price
+ item?: { id: string } // Optional for breakup items without item id
+}
+
+interface QuoteBreakup {
+ [key: string]: BreakupItem // Index signature for dynamic breakup items
+}
+
+interface Quote {
+ price: Price
+ breakup: QuoteBreakup
+}
+
+interface BillingAddress {
+ name: string
+ address: string
+ state: { name: string }
+ city: { name: string }
+ email: string
+ phone: string
+}
+
+interface CancellationTerm {
+ state: string
+ cancellation_fee: {
+ amount: Price
+ }
+}
+
+interface Message {
+ orderId: string
+ provider: {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ rating: string
+ images: Image[]
+ }
+ items: {
+ id: string
+ name: string
+ code: string
+ short_desc: string
+ long_desc: string
+ price: Price
+ quantity: {
+ available: AvailableQuantity
+ }
+ tags: Tag[]
+ }
+ fulfillments: Fulfillment[]
+ quote: Quote
+ billing: BillingAddress
+ cancellation_terms: CancellationTerm[]
+}
+
+interface ConfirmResponseData {
+ context: Context
+ message: Message
+}
+
+export interface ConfirmResponseModel {
+ data: ConfirmResponseData[]
+}
diff --git a/apps/dsep/lib/types/init.types.ts b/apps/dsep/lib/types/init.types.ts
new file mode 100644
index 000000000..614952bb7
--- /dev/null
+++ b/apps/dsep/lib/types/init.types.ts
@@ -0,0 +1,145 @@
+interface Location {
+ country: {
+ name: string
+ code: string
+ }
+ city: {
+ name: string
+ code: string
+ }
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: Location
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Price {
+ value: string
+ currency: string
+}
+
+interface Image {
+ url: string
+ size_type?: string
+}
+
+interface Provider {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ rating?: string
+ images: Image
+}
+
+interface Measure {
+ value: string
+ unit: string
+}
+
+interface AvailableQuantity {
+ count: number
+ measure: Measure
+}
+
+interface Quantity {
+ available: AvailableQuantity
+}
+
+interface Tag {
+ display: boolean
+ list: { value: string }[]
+}
+
+interface Item {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ price: Price
+ quantity: Quantity
+ tags: Tag[]
+}
+
+interface Fulfillment {
+ rateable?: boolean
+ tracking?: boolean
+ id?: string
+ type?: string
+ rating?: string
+}
+
+interface QuoteBreakup {
+ title: string
+ price: Price
+ item: {
+ id: string
+ }
+}
+
+interface Quote {
+ price: Price
+ breakup: QuoteBreakup[]
+}
+
+interface State {
+ name: string
+}
+
+interface City {
+ name: string
+}
+
+interface Billing {
+ name: string
+ address: string
+ state: State
+ city: City
+ email: string
+ phone: string
+}
+
+interface CancellationFee {
+ amount: Price
+}
+
+interface CancellationTerms {
+ state: string
+ cancellation_fee: CancellationFee
+}
+
+interface Order {
+ type: string
+ provider: Provider
+ items: Item[]
+ fulfillments: Fulfillment[]
+ quote: Quote
+ billing: Billing
+ cancellation_terms: CancellationTerms[]
+}
+
+interface Message {
+ order: Order
+}
+
+export interface InitResponseItem {
+ context: Context
+ message: Message
+}
+
+export interface InitResponseModel {
+ data: InitResponseItem[]
+}
diff --git a/apps/dsep/lib/types/select.types.ts b/apps/dsep/lib/types/select.types.ts
new file mode 100644
index 000000000..5d476c8ca
--- /dev/null
+++ b/apps/dsep/lib/types/select.types.ts
@@ -0,0 +1,119 @@
+import { CurrencyType } from '@beckn-ui/becknified-components'
+
+interface Location {
+ city: {
+ name: string
+ code: string
+ }
+ country: {
+ name: string
+ code: string
+ }
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: Location
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Price {
+ value: string
+ currency: CurrencyType
+}
+
+interface Image {
+ url: string
+ size_type?: string
+}
+
+interface Provider {
+ id: string
+ name: string
+ short_desc?: string
+ long_desc?: string
+ images?: Image
+}
+
+interface Quantity {
+ available: {
+ count: number
+ measure?: {
+ value: string
+ unit: string
+ }
+ }
+}
+
+interface Category {
+ id: string
+ name: string
+}
+
+interface Tag {
+ display: boolean
+ list: (null | string)[]
+ name?: string
+ value?: string
+}
+
+interface XInput {
+ url: string
+ mime_type: string
+ html: string
+}
+
+export interface Item {
+ id: string
+ xinput?: XInput
+ name: string
+ short_desc?: string
+ long_desc?: string
+ price: Price
+ quantity?: Quantity
+ categories?: Category[]
+ tags: Tag[]
+ rating?: string
+ rateable?: boolean
+ time?: {
+ label: string
+ duration: string
+ range: {
+ start: string
+ end: string
+ }
+ }
+}
+
+interface Order {
+ type: string
+ quote?: {
+ price: Price
+ }
+ provider: Provider
+ items: Item[]
+}
+
+interface Message {
+ order: Order
+}
+
+export interface SelectData {
+ context: Context
+ message: Message
+}
+
+export interface SelectResponseModel {
+ data: SelectData[]
+}
diff --git a/apps/dsep/locales/en.ts b/apps/dsep/locales/en.ts
index 1ca319776..45e536efc 100644
--- a/apps/dsep/locales/en.ts
+++ b/apps/dsep/locales/en.ts
@@ -289,7 +289,7 @@ const en: { [key: string]: string } = {
orderBtn: 'Order',
localStores: 'Local stores in',
cartLoader: 'Getting Quotes',
- initializingOrderLoader: 'Please wait while we set things up for you',
+ initializingOrderLoader: 'while we set things up for you',
confirmingOrderLoader: "We're preparing your course",
orderConfirm: 'Order Confirmed!',
confirmOrderMessage: 'Thank you! Our delivery agent will deliver your order',
@@ -329,8 +329,6 @@ const en: { [key: string]: string } = {
errorAddress: 'Address is required',
errorZipcode: 'Zip Code is required',
errorZipcode2: 'Invalid Zip Code',
- confirmMessage1: 'Get ready to embark your learning ',
- confirmMessage2: 'journey!',
sendOtpButton: 'Send OTP',
verifyMobile: 'Verify your Mobile Number',
otpMessage1: 'Have sent an OTP to your mobile',
@@ -342,7 +340,7 @@ const en: { [key: string]: string } = {
catalogLoader: 'Please Wait!',
catalogSubLoader: 'Fetching store catalog from the network',
coursesCatalogLoader: 'we are looking for courses related to your search',
- quoteRequestLoader: 'Please wait! Your order is getting processed',
+ quoteRequestLoader: 'Your order is getting processed',
estimatedDelivery: 'Estimated delivery time',
orderId: 'Order ID',
pending: 'Pending',
@@ -432,6 +430,8 @@ const en: { [key: string]: string } = {
searchCourses: 'Search Courses',
fetchingCourses: 'Fetching Courses',
fetchingJobs: 'Fetching Jobs',
- errorPassword: 'Invalid password'
+ errorPassword: 'Invalid password',
+ confirm: 'Confirm',
+ confirmMessageSubtext: 'Get ready to embark your learning journey!'
}
export default en
diff --git a/apps/dsep/package.json b/apps/dsep/package.json
index 70ad4ebb6..2c97ee445 100644
--- a/apps/dsep/package.json
+++ b/apps/dsep/package.json
@@ -59,6 +59,7 @@
"react-star-rating-component": "^1.4.1",
"react-toastify": "^9.0.7",
"react-transition-group": "^4.4.5",
+ "redux-persist": "^6.0.0",
"slick-carousel": "^1.8.1",
"stripe": "^9.1.0",
"url-loader": "^4.1.1"
diff --git a/apps/dsep/pages/_app.tsx b/apps/dsep/pages/_app.tsx
index d4f095961..af7ac0145 100644
--- a/apps/dsep/pages/_app.tsx
+++ b/apps/dsep/pages/_app.tsx
@@ -11,6 +11,7 @@ import { ChakraProvider } from '@chakra-ui/react'
import '../styles/globals.css'
import { Garuda } from 'garudaa'
+import { BecknProvider } from '@beckn-ui/molecules'
Garuda.init({
projectId: '656dad5ed5a5a7d831fc43ac',
@@ -28,11 +29,18 @@ Garuda.identify({
function MyApp({ Component, pageProps }: AppProps) {
return (
-
+
-
+
)
}
diff --git a/apps/dsep/pages/cart.tsx b/apps/dsep/pages/cart.tsx
index f80ba1e33..7ff47dbf2 100644
--- a/apps/dsep/pages/cart.tsx
+++ b/apps/dsep/pages/cart.tsx
@@ -5,22 +5,17 @@ import { useDispatch, useSelector } from 'react-redux'
import CartList from '../components/cart/CartList'
import OrderSummaryBox from '../components/cart/OrderSummaryBox'
import { useLanguage } from '../hooks/useLanguage'
-import Loader from '../components/loader/Loader'
import useRequest from '../hooks/useRequest'
-import {
- DataPerBpp,
- CartItemForRequest,
- ICartRootState,
- TransactionIdRootState,
- CartRetailItem
-} from '../lib/types/cart'
+import { ICartRootState } from '../lib/types/cart'
import { responseDataActions } from '../store/responseData-slice'
-import { getCartItemsPerBpp, getItemsForCart, getPayloadForQuoteRequest } from '../utilities/cart-utils'
+import { getItemsForCart, getPayloadForSelectRequest } from '../utilities/cart-utils'
import EmptyCart from '../components/cart/EmptyCart'
import { Box } from '@chakra-ui/react'
+import { Item, SelectResponseModel } from '../lib/types/select.types'
+import LoaderWithMessage from '@beckn-ui/molecules/src/components/LoaderWithMessage/loader-with-message'
const Cart = () => {
- const [itemsForCart, setItemsForCart] = useState(null)
+ const [itemsForCart, setItemsForCart] = useState- (null)
const [isLoadingForCartCountChange, setIsLoadingForCartCountChange] = useState
(false)
const quoteRequest = useRequest()
@@ -30,13 +25,12 @@ const Cart = () => {
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const cartItems = useSelector((state: ICartRootState) => state.cart.items)
- const transactionId = useSelector((state: { transactionId: TransactionIdRootState }) => state.transactionId)
- const cartItemsPerBppPerProvider: DataPerBpp = getCartItemsPerBpp(cartItems as CartItemForRequest[])
- const payLoadForQuoteRequest = getPayloadForQuoteRequest(cartItemsPerBppPerProvider, transactionId)
+
+ const payLoadForQuoteRequest = getPayloadForSelectRequest(cartItems)
useEffect(() => {
if (localStorage && !localStorage.getItem('quoteResponse')) {
- quoteRequest.fetchData(`${apiUrl}/client/v2/get_quote`, 'POST', payLoadForQuoteRequest)
+ quoteRequest.fetchData(`${apiUrl}/select`, 'POST', payLoadForQuoteRequest)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
@@ -46,7 +40,9 @@ const Cart = () => {
dispatch(responseDataActions.addQuoteResponse(quoteRequest.data))
localStorage.setItem('quoteResponse', JSON.stringify(quoteRequest.data))
- const items = getItemsForCart(quoteRequest.data)
+ const selectResponse: SelectResponseModel = quoteRequest.data
+
+ const items = getItemsForCart(selectResponse.data)
setItemsForCart(items)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -57,7 +53,8 @@ const Cart = () => {
const cachedQuoteResults = localStorage.getItem('quoteResponse')
if (cachedQuoteResults) {
const parsedCachedResults = JSON.parse(cachedQuoteResults)
- setItemsForCart(parsedCachedResults)
+ const items = getItemsForCart(parsedCachedResults.data)
+ setItemsForCart(items)
}
}
}, [])
@@ -67,17 +64,28 @@ const Cart = () => {
}
if (quoteRequest.loading || isLoadingForCartCountChange) {
- return
+ // return
+ return (
+
+
+
+ )
+ }
+ if (!cartItems.length) {
+ return
}
if (!itemsForCart) {
return <>>
}
- if (!itemsForCart.length) {
- return
- }
-
return (
{
>
{/* */}
-
+
diff --git a/apps/dsep/pages/checkoutPage.tsx b/apps/dsep/pages/checkoutPage.tsx
index 02fa0a15e..6a5f66f1a 100644
--- a/apps/dsep/pages/checkoutPage.tsx
+++ b/apps/dsep/pages/checkoutPage.tsx
@@ -1,29 +1,28 @@
import React, { useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { Box, Flex, Text, Stack, Checkbox, Image } from '@chakra-ui/react'
-import DetailsCard from '../components/detailsCard/DetailsCard'
+import { Box, Flex, Text, Checkbox, Image } from '@chakra-ui/react'
+import { DetailCard } from '@beckn-ui/becknified-components'
import ItemDetails from '../components/detailsCard/ItemDetails'
-import ButtonComp from '../components/button/Button'
import { useLanguage } from '../hooks/useLanguage'
import ShippingOrBillingDetails from '../components/detailsCard/ShippingOrBillingDetails'
-import PaymentDetails from '../components/detailsCard/PaymentDetails'
import AddShippingButton from '../components/detailsCard/AddShippingButton'
import addShippingBtn from '../public/images/offer.svg'
-import { CartItemForRequest, DataPerBpp, ICartRootState, TransactionIdRootState } from '../lib/types/cart'
-import { getCartItemsPerBpp } from '../utilities/cart-utils'
+import { ICartRootState } from '../lib/types/cart'
import useRequest from '../hooks/useRequest'
import { responseDataActions } from '../store/responseData-slice'
-import {
- areShippingAndBillingDetailsSame,
- getPayloadForInitRequest,
- getSubTotalAndDeliveryCharges,
- getTotalCartItems
-} from '../utilities/checkout-utils'
-import Loader from '../components/loader/Loader'
-import AddBillingButton from '../components/detailsCard/AddBillingButton'
+import { areShippingAndBillingDetailsSame, getPaymentBreakDown, handleFormSubmit } from '../utilities/checkout-utils'
+
import { useRouter } from 'next/router'
import Cookies from 'js-cookie'
import axios from 'axios'
+import ShippingSection from '@beckn-ui/becknified-components/src/components/checkout/shipping-section'
+import addBillingButton from '../public/images/addShippingBtn.svg'
+import { SelectResponseModel } from '../lib/types/select.types'
+import { Typography } from '@beckn-ui/molecules'
+import { InitResponseModel } from '../lib/types/init.types'
+import LoaderWithMessage from '@beckn-ui/molecules/src/components/LoaderWithMessage/loader-with-message'
+import PaymentDetails from '@beckn-ui/becknified-components/src/components/checkout/payment-details'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
export type ShippingFormData = {
name: string
@@ -41,25 +40,18 @@ const CheckoutPage = () => {
address: '151-E, Janpath Road, New Delhi',
pinCode: '201016'
})
-
- const [isBillingAddressSameAsShippingAddress, setIsBillingAddressSameAsShippingAddress] = useState(true)
-
- const [billingFormData, setBillingFormData] = useState({
- name: '',
- mobileNumber: '',
- email: '',
- address: '',
- pinCode: ''
- })
+ // TODO :- check for refactoring and some issue fix in this component
+ const [isLoadingForInit, setIsLoadingForInit] = useState(false)
+ const [isError, setIsError] = useState(false)
+ const [initData, setInitData] = useState(null)
+ const [selectResponse, setSelectResponse] = useState(null)
const router = useRouter()
- const initRequest = useRequest()
const dispatch = useDispatch()
const { t, locale } = useLanguage()
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
const cartItems = useSelector((state: ICartRootState) => state.cart.items)
- const transactionId = useSelector((state: { transactionId: TransactionIdRootState }) => state.transactionId)
const totalAmount = useSelector((state: ICartRootState) => state.cart.totalAmount)
const scholarshipId = useSelector((state: any) => state.scholarshipCart.scholarshipId)
@@ -73,6 +65,19 @@ const CheckoutPage = () => {
}
}
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('initResult')) {
+ setInitData(JSON.parse(localStorage.getItem('initResult') as string))
+ }
+ }, [])
+
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('quoteResponse')) {
+ const parsedSelectResponse: SelectResponseModel = JSON.parse(localStorage.getItem('quoteResponse') as string)
+ setSelectResponse(parsedSelectResponse)
+ }
+ }, [])
+
useEffect(() => {
const email = Cookies.get('userEmail') as string
axios
@@ -82,29 +87,31 @@ const CheckoutPage = () => {
const documents = profileResponse.data.attributes.documents.data
const profileData = profileResponse.data.attributes
- const { name, phone, address, zip_code } = profileData
- setFormData({
- address: address ? address : '',
- email,
- mobileNumber: phone,
- pinCode: zip_code ? zip_code : '',
- name
+ const { phone } = profileData
+ setFormData(prevData => {
+ return {
+ ...prevData,
+ email,
+ mobileNumber: phone
+ }
})
})
- .catch(e => console.error(e))
+ .catch(e => {
+ console.error(e)
+ })
}, [])
useEffect(() => {
if (localStorage) {
if (localStorage.getItem('userPhone')) {
- const copiedFormData = structuredClone(formData)
- const copiedBillingFormData = structuredClone(billingFormData)
+ const userPhone = localStorage.getItem('userPhone') as string
+ setFormData(prevData => {
+ return {
+ ...prevData,
- copiedFormData.mobileNumber = localStorage.getItem('userPhone') as string
- copiedBillingFormData.mobileNumber = localStorage.getItem('userPhone') as string
-
- setFormData(copiedFormData)
- setBillingFormData(copiedBillingFormData)
+ mobileNumber: userPhone
+ }
+ })
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -115,23 +122,9 @@ const CheckoutPage = () => {
if (localStorage.getItem('shippingAdress')) {
setFormData(JSON.parse(localStorage.getItem('shippingAdress') as string))
}
- if (localStorage.getItem('billingAddress')) {
- setBillingFormData(JSON.parse(localStorage.getItem('billingAddress') as string))
- }
}
}, [])
- useEffect(() => {
- if (initRequest.data) {
- if (typeof window !== 'undefined') {
- localStorage.setItem('initResult', JSON.stringify(initRequest.data))
- }
-
- dispatch(responseDataActions.addInitResponse(initRequest.data))
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [initRequest.data])
-
useEffect(() => {
const shippingAddressComplete = Object.values(formData).every(value => value.length > 0)
if (shippingAddressComplete && typeof window !== 'undefined') {
@@ -139,51 +132,28 @@ const CheckoutPage = () => {
}
}, [formData])
- useEffect(() => {
- const isBillingAddressComplete = Object.values(billingFormData).every(value => value.length > 0)
-
- if (isBillingAddressComplete && typeof window !== 'undefined') {
- localStorage.setItem('billingAddress', JSON.stringify(billingFormData))
- }
- setIsBillingAddressSameAsShippingAddress(
- areShippingAndBillingDetailsSame(isBillingAddressComplete, formData, billingFormData)
- )
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [billingFormData])
-
- const formSubmitHandler = () => {
- if (formData) {
- // TODO :_ To check this again
-
- // if (isBillingAddressSameAsShippingAddress) {
- // const copiedFormData = structuredClone(formData);
- // setBillingFormData(copiedFormData);
- // }
-
- const cartItemsPerBppPerProvider: DataPerBpp = getCartItemsPerBpp(cartItems as CartItemForRequest[])
-
- const payLoadForInitRequest = getPayloadForInitRequest(
- cartItemsPerBppPerProvider,
- transactionId,
- formData,
- billingFormData
- )
- initRequest.fetchData(`${apiUrl}/client/v2/initialize_order`, 'POST', payLoadForInitRequest)
- }
+ if (!selectResponse) {
+ return <>>
}
- if (initRequest.loading) {
- return
+ if (isLoadingForInit) {
+ return (
+
+
+
+ )
}
- const isInitResultPresent = () => {
- if (typeof window !== 'undefined') {
- if (localStorage.getItem('initResult')) {
- return true
- }
- }
-
- return !!initRequest.data
+ if (isError) {
+ // TODO :- render toast on the error
+ return <>>
}
return (
@@ -196,70 +166,59 @@ const CheckoutPage = () => {
{/* start Item Details */}
- {t.overview}
+
-
+
{cartItems.map(item => {
return (
<>
>
)
})}
-
+
- {/* end item details */}
- {/* start shipping detals */}
- {!isInitResultPresent() ? (
-
-
- {t.billing}
-
-
-
-
-
- ) : (
-
-
- {t.billing}
-
-
-
-
-
- )}
- {/* end shipping detals */}
+ {
+ setFormData({ ...(formData as ShippingFormData) })
+ return handleFormSubmit(
+ formData as ShippingFormData,
+ selectResponse,
+ setInitData,
+ setIsLoadingForInit,
+ setIsError,
+ apiUrl as string
+ )
+ },
+ submitButton: { text: 'Save Billing Details' },
+ values: formData,
+ onChange: data => () => {
+ console.log('data in the change', data)
+ }
+ }}
+ />
{scholarshipTitle.length !== 0 && (
{
{t.scholarship}
-
+
{
{t.scholarshipApplied}
-
+
)}
{/* start payment details */}
- {initRequest.data && (
+ {!!initData && (
{
>
{t.paymentText}
-
-
-
+
+ {initData.data.map((data, idx) => {
+ return (
+
+ )
+ })}
+
)}
- {/* end payment details */}
-
- {!isInitResultPresent() ? (
-
- {}}
- isDisabled={true}
- />
-
- ) : (
- router.push('/paymentMode')}
- isDisabled={false}
+
+ router.push('/orderConfirmation')}
/>
- )}
+
)
}
diff --git a/apps/dsep/pages/orderConfirmation.tsx b/apps/dsep/pages/orderConfirmation.tsx
index 259fdff70..b28779d5b 100644
--- a/apps/dsep/pages/orderConfirmation.tsx
+++ b/apps/dsep/pages/orderConfirmation.tsx
@@ -1,186 +1,168 @@
-import React, { useEffect } from 'react'
+import React, { useEffect, useState } from 'react'
import { useRouter } from 'next/router'
-import { Box, HStack, Image, Stack, Text, VStack } from '@chakra-ui/react'
import axios from 'axios'
import Cookies from 'js-cookie'
-import { useSelector } from 'react-redux'
+import { Box } from '@chakra-ui/react'
+import { ConfirmationPage } from '@beckn-ui/becknified-components'
+import { LoaderWithMessage } from '@beckn-ui/molecules'
+
import { useLanguage } from '../hooks/useLanguage'
+import orderConfirmmark from '../public/images/orderConfirmmark.svg'
import useRequest from '../hooks/useRequest'
-import { getInitMetaDataPerBpp, getPayloadForConfirmRequest } from '../utilities/confirm-utils'
-import Loader from '../components/loader/Loader'
-import { TransactionIdRootState } from '../lib/types/cart'
-import Button from '../components/button/Button'
-import ConfirmOrder from '../components/confirmOrder/ConfirmOrder'
+import { getPayloadForConfirmRequest } from '../utilities/confirm-utils'
+
+import { InitResponseModel } from '../lib/types/init.types'
+
+import { ConfirmResponseModel } from '../lib/types/confirm.types'
const OrderConfirmation = () => {
const { t } = useLanguage()
const confirmRequest = useRequest()
const router = useRouter()
- const initResponse = useSelector((state: any) => state.initResponse.initResponse)
- const transactionId = useSelector((state: { transactionId: TransactionIdRootState }) => state.transactionId)
+ const [isLoading, setIsLoading] = useState(true)
+ const [confirmResponse, setConfirmResponse] = useState(null)
+ const [isError, setIsError] = useState(false)
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
useEffect(() => {
- if (initResponse) {
- const initMetaDataPerBpp = getInitMetaDataPerBpp(initResponse)
-
- const payLoadForConfirmRequest = getPayloadForConfirmRequest(
- initMetaDataPerBpp,
- transactionId,
- localStorage.getItem('userPhone') as string
- )
- confirmRequest.fetchData(`${apiUrl}/client/v2/confirm`, 'POST', payLoadForConfirmRequest)
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [])
-
- useEffect(() => {
- if (!initResponse && localStorage && localStorage.getItem('initResult')) {
- const parsedInitResult = JSON.parse(localStorage.getItem('initResult') as string)
- const initMetaDataPerBpp = getInitMetaDataPerBpp(parsedInitResult)
+ if (localStorage && localStorage.getItem('initResult')) {
+ const parsedInitResult: InitResponseModel = JSON.parse(localStorage.getItem('initResult') as string)
+ const payLoad = getPayloadForConfirmRequest(parsedInitResult)
+ setIsLoading(true)
+ axios
+ .post(`${apiUrl}/confirm`, payLoad)
+ .then(res => {
+ const data = res.data
+ setConfirmResponse(data)
+ localStorage.setItem('confirmResponse', JSON.stringify(data))
- const payLoadForConfirmRequest = getPayloadForConfirmRequest(
- initMetaDataPerBpp,
- transactionId,
- localStorage.getItem('userPhone') as string
- )
- confirmRequest.fetchData(`${apiUrl}/client/v2/confirm`, 'POST', payLoadForConfirmRequest)
+ setIsLoading(false)
+ })
+ .catch(err => {
+ setIsError(true)
+ setIsLoading(false)
+ console.error(err)
+ })
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
- useEffect(() => {
- if (confirmRequest.data) {
- const bearerToken = Cookies.get('authToken')
- const context = confirmRequest.data[0].message.responses[0].context
- const order = confirmRequest.data[0].message.responses[0].message.order
+ // TODO :- To enable this code for strapi order history call when the issue is fixed in the confirm response
+ // useEffect(() => {
+ // if (confirmResponse) {
+ // const bearerToken = Cookies.get('authToken')
+ // const context = confirmResponse.data[0].context
+ // const order = confirmResponse.data[0].message
- const orderPayLoad = {
- context: context,
- message: {
- order: {
- id: order.id,
- provider: {
- id: order.provider.id,
- descriptor: order.provider.descriptor
- },
- items: [
- {
- id: order.items[0].id,
- descriptor: order.items[0].descriptor,
- price: {
- value: order.items[0].price.value,
- currency: order.items[0].price.currency
- },
- tags: order.items[0].tags
- }
- ],
- fulfillments: [order.fulfillment],
- billing: {
- name: order.billing.name,
- address: order.billing.address.door,
- email: order.billing.email,
- phone: order.billing.phone
- },
- quote: {
- price: order.quote.price,
- breakup: order.quote.breakup
- },
- payments: [
- {
- type: order.payment.type,
- status: order.payment.status,
- params: {
- amount: order.payment.params.amount,
- currency: order.payment.params.currency
- }
- }
- ]
- }
- },
- category: {
- set: [1]
- }
- }
+ // const orderPayLoad = {
+ // context: context,
+ // message: {
+ // order: {
+ // id: order.orderId,
+ // provider: {
+ // id: order.provider.id,
+ // descriptor: order.provider.name
+ // },
+ // items: [
+ // {
+ // id: order.items[0].id,
+ // descriptor: order.items[0].descriptor,
+ // price: {
+ // value: order.items[0].price.value,
+ // currency: order.items[0].price.currency
+ // },
+ // tags: order.items[0].tags
+ // }
+ // ],
+ // fulfillments: [order.fulfillment],
+ // billing: {
+ // name: order.billing.name,
+ // address: order.billing.address.door,
+ // email: order.billing.email,
+ // phone: order.billing.phone
+ // },
+ // quote: {
+ // price: order.quote.price,
+ // breakup: order.quote.breakup
+ // },
+ // payments: [
+ // {
+ // type: order.payment.type,
+ // status: order.payment.status,
+ // params: {
+ // amount: order.payment.params.amount,
+ // currency: order.payment.params.currency
+ // }
+ // }
+ // ]
+ // }
+ // },
+ // category: {
+ // set: [1]
+ // }
+ // }
- const axiosConfig = {
- headers: {
- Authorization: `Bearer ${bearerToken}`,
- 'Content-Type': 'application/json' // You can set the content type as needed
- }
- }
- axios
- .post(`${strapiUrl}/orders`, orderPayLoad, axiosConfig)
- .then(res => {})
- .catch(err => console.error(err))
- }
- }, [confirmRequest.data])
+ // const axiosConfig = {
+ // headers: {
+ // Authorization: `Bearer ${bearerToken}`,
+ // 'Content-Type': 'application/json' // You can set the content type as needed
+ // }
+ // }
+ // axios
+ // .post(`${strapiUrl}/orders`, orderPayLoad, axiosConfig)
+ // .then(res => {})
+ // .catch(err => console.error(err))
+ // }
+ // }, [confirmRequest.data])
- if (confirmRequest.loading) {
+ if (isLoading) {
return (
-
+
+
+
)
}
- const handleViewCource = () => {
- if (confirmRequest.data) {
- localStorage.setItem('confirmData', JSON.stringify(confirmRequest.data))
- router.push('/orderDetails')
- }
- }
- const learningHistoryHandler = (): void => {
- router.push('/myLearningOrderHistory')
+ if (isError) {
+ return <>>
}
return (
-
-
-
- {t.orderPlaced}
-
-
-
- {t.confirmMessage1}
- {t.confirmMessage2}
-
-
- >
- }
- />
-
-
-
-
-
+ {
+ router.push('/orderDetails')
+ },
+ disabled: false,
+ variant: 'solid',
+ colorScheme: 'primary'
+ },
+ {
+ text: t.myLearnings,
+ handleClick: () => {
+ router.push('/myLearningOrderHistor')
+ },
+ disabled: false,
+ variant: 'outline',
+ colorScheme: 'primary'
+ }
+ ]
+ }}
+ />
)
}
diff --git a/apps/dsep/pages/product.tsx b/apps/dsep/pages/product.tsx
index 420377c1c..158751cc4 100644
--- a/apps/dsep/pages/product.tsx
+++ b/apps/dsep/pages/product.tsx
@@ -1,18 +1,18 @@
import Router from 'next/router'
import React, { useEffect, useState } from 'react'
import ProductDetails from '../components/productDetails'
-import { RetailItem } from '../lib/types/products'
+import { ParsedItemModel } from '../types/search.types'
import { fromBinary } from '../utilities/common-utils'
const Product = () => {
- const [product, setProduct] = useState(null)
+ const [product, setProduct] = useState(null)
+ const { productDetails } = Router.query
useEffect(() => {
- const { productDetails } = Router.query
if (productDetails) {
setProduct(JSON.parse(fromBinary(window.atob(productDetails as string))))
}
- }, [])
+ }, [productDetails])
if (!product) {
return <>>
diff --git a/apps/dsep/pages/search.tsx b/apps/dsep/pages/search.tsx
index 547485d14..19efac726 100644
--- a/apps/dsep/pages/search.tsx
+++ b/apps/dsep/pages/search.tsx
@@ -1,6 +1,8 @@
import React, { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
import { Box } from '@chakra-ui/react'
+import { LoaderWithMessage } from '@beckn-ui/molecules'
+import { ProductCard, Sort } from '@beckn-ui/becknified-components'
import SearchBar from '../components/header/SearchBar'
import ProductList from '../components/productList/ProductList'
import useRequest from '../hooks/useRequest'
@@ -9,51 +11,27 @@ import { RetailItem } from '../lib/types/products'
import Loader from '../components/loader/Loader'
import { useLanguage } from '../hooks/useLanguage'
import { useRouter } from 'next/router'
+import { getParsedSearchlist } from '../utilities/search-utils'
+import { ParsedItemModel, SearchResponseModel } from '../types/search.types'
+import CustomToast from '../components/customToast/custom-toast'
+import ProductCardRenderer from '../components/productCard/product-card-renderer'
//Mock data for testing search API. Will remove after the resolution of CORS issue
const Search = () => {
- const [items, setItems] = useState([])
+ const [items, setItems] = useState([])
const router = useRouter()
const [searchKeyword, setSearchKeyword] = useState(router.query?.searchTerm || '')
const dispatch = useDispatch()
- const [providerId, setProviderId] = useState('')
const { t, locale } = useLanguage()
- const [tagValue, setTagValue] = useState('')
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const { data, loading, error, fetchData } = useRequest()
- const categoryMap = {
- Books: { en: 'BookEnglish', fa: 'BookFrench' },
- restaurant: { en: 'FoodEnglish', fa: 'FoodFrench' }
- }
-
- useEffect(() => {
- if (!!searchKeyword) {
- localStorage.removeItem('searchItems')
- localStorage.setItem('optionTags', JSON.stringify({ name: searchKeyword }))
- window.dispatchEvent(new Event('storage-optiontags'))
- fetchDataForSearch()
- }
- if (localStorage) {
- const stringifiedOptiontags = localStorage.getItem('optionTags')
- const stringifiedSelectedOption = localStorage.getItem('selectedOption')
- if (stringifiedOptiontags) {
- const providerId = JSON.parse(stringifiedOptiontags).providerId
- setProviderId(providerId)
- }
- if (stringifiedSelectedOption) {
- setTagValue(JSON.parse(stringifiedSelectedOption).tagValue)
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [searchKeyword])
-
const searchPayload = {
context: {
- domain: 'retail'
+ domain: 'dsep:courses'
},
message: {
criteria: {
@@ -64,16 +42,14 @@ const Search = () => {
}
}
- const fetchDataForSearch = () => fetchData(`${apiUrl}/client/v2/search`, 'POST', searchPayload)
+ const fetchDataForSearch = () => fetchData(`${apiUrl}/search`, 'POST', searchPayload)
useEffect(() => {
if (localStorage && !localStorage.getItem('searchItems')) {
- if (providerId) {
- fetchData(`${apiUrl}/client/v2/search`, 'POST', searchPayload)
- }
+ fetchData(`${apiUrl}/search`, 'POST', searchPayload)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [providerId])
+ }, [])
useEffect(() => {
if (localStorage) {
@@ -84,37 +60,21 @@ const Search = () => {
}
}
}, [])
- console.log(items)
useEffect(() => {
if (data) {
- dispatch(responseDataActions.addTransactionId(data.context.transaction_id))
- const allItems = data.message.catalogs.flatMap((catalog: any) => {
- if (catalog.message && catalog.message.catalog && catalog.message.catalog['bpp/providers'].length > 0) {
- const providers = catalog.message.catalog['bpp/providers']
- return providers.flatMap((provider: any) => {
- if (provider.items && provider.items.length > 0) {
- return provider.items.map((item: RetailItem) => {
- return {
- bpp_id: catalog.context.bpp_id,
- bpp_uri: catalog.context.bpp_uri,
- ...item,
- providerId: provider.id,
- locations: provider.locations,
- bppName: catalog.message.catalog['bpp/descriptor'].name
- }
- })
- }
- return []
- })
- }
- return []
- })
- localStorage.setItem('searchItems', JSON.stringify(allItems))
- setItems(allItems)
+ const parsedItems = getParsedSearchlist(data.data as SearchResponseModel[])
+ dispatch(responseDataActions.addTransactionId(data.data[0].context.transaction_id))
+
+ localStorage.setItem('searchItems', JSON.stringify(parsedItems))
+ setItems(parsedItems)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [data])
+ if (error) {
+ return <>>
+ }
+
return (
<>
{
}}
/>
-
- {loading ? (
-
-
-
- ) : (
-
- )}
-
+
+ {loading ? (
+
+
+
+ ) : (
+
+ )}
>
)
}
diff --git a/apps/dsep/pages/signUp.tsx b/apps/dsep/pages/signUp.tsx
index b14881a71..89e813c38 100644
--- a/apps/dsep/pages/signUp.tsx
+++ b/apps/dsep/pages/signUp.tsx
@@ -1,16 +1,14 @@
import React, { useState } from 'react'
+import Router from 'next/router'
import { useLanguage } from '../hooks/useLanguage'
-import HomeImg from '../public/images/HomePageLogo.svg'
-import SkillUp from '../public/images/SkillUpLogo.svg'
+import SkillUpLogo from '../public/images/skillUpHomeLogo.svg'
+import { BecknAuth } from '@beckn-ui/becknified-components'
import { FormErrors, signUpValidateForm } from '../utilities/detailsForm-utils'
-import style from '../components/detailsCard/ShippingForm.module.css'
-import Styles from '../components/signIn/SignIn.module.css'
-import { Box, Flex, Image, useToast } from '@chakra-ui/react'
-
-import Button from '../components/button/Button'
-import Router from 'next/router'
-import { SignUpPropsModel } from '../components/signIn/Signin.types'
import Cookies from 'js-cookie'
+import { Box, useToast } from '@chakra-ui/react'
+import { SignUpPropsModel } from '../components/signIn/Signin.types'
+import CustomToast from '../components/customToast/custom-toast'
+
const SignUp = () => {
const { t } = useLanguage()
const toast = useToast()
@@ -74,10 +72,14 @@ const SignUp = () => {
} else {
const errorData = await response.json()
toast({
- title: 'Error!.',
- description: errorData.error.message,
- status: 'error',
- duration: 3000,
+ render: () => (
+
+ ),
+ position: 'top',
+ duration: 2000,
isClosable: true
})
console.error('Registration failed')
@@ -92,73 +94,58 @@ const SignUp = () => {
return (
<>
-
-
-
-
-
-
-
-
-
-
{t.formName}
- {formErrors.name &&
{formErrors.name}
}
-
-
-
-
{t.formEmail}
- {formErrors.email &&
{formErrors.email}
}
-
-
-
-
{t.password}
- {formErrors.password &&
{formErrors.password}
}
-
-
-
-
+ {
+ Router.push('/')
+ },
+ disabled: false,
+ variant: 'outline',
+ colorScheme: 'primary'
+ }
+ ],
+ inputs: [
+ {
+ type: 'text',
+ name: 'name',
+ value: formData.name,
+ handleChange: handleInputChange,
+ label: t.formName,
+ error: formErrors.name
+ },
+ {
+ type: 'text',
+ name: 'email',
+ value: formData.email,
+ handleChange: handleInputChange,
+ label: t.formEmail,
+ error: formErrors.email
+ },
+ {
+ type: 'password',
+ name: 'password',
+ value: formData.password,
+ handleChange: handleInputChange,
+ label: t.password,
+ error: formErrors.password
+ }
+ ]
+ }}
/>
>
diff --git a/apps/dsep/public/images/HomePageLogo.svg b/apps/dsep/public/images/HomePageLogo.svg
deleted file mode 100644
index cd1b1f604..000000000
--- a/apps/dsep/public/images/HomePageLogo.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/dsep/public/images/SkillUpLogo.svg b/apps/dsep/public/images/SkillUpLogo.svg
deleted file mode 100644
index 5010029b7..000000000
--- a/apps/dsep/public/images/SkillUpLogo.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/dsep/public/images/skillUpHomeLogo.svg b/apps/dsep/public/images/skillUpHomeLogo.svg
new file mode 100644
index 000000000..277f2b4c0
--- /dev/null
+++ b/apps/dsep/public/images/skillUpHomeLogo.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/dsep/store/cart-slice.ts b/apps/dsep/store/cart-slice.ts
index 24084e40c..ec874f258 100644
--- a/apps/dsep/store/cart-slice.ts
+++ b/apps/dsep/store/cart-slice.ts
@@ -1,6 +1,7 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { ICart } from '../lib/types/cart'
import { RetailItem } from '../lib/types/products'
+import { ParsedItemModel } from '../types/search.types'
import { calculateDiscountPercentage } from '../utilities/calculateDiscountPercentage'
const initialState: ICart = {
@@ -16,20 +17,21 @@ const cartSlice = createSlice({
addItemToCart(
state: ICart,
action: PayloadAction<{
- product: RetailItem
+ product: ParsedItemModel
quantity: number
}>
) {
const newItem = action.payload.product
- const existingItem = state.items.find(item => item.id === newItem.id)
+ const existingItem = state.items.find(item => item.item.id === newItem.item.id)
state.totalQuantity = state.totalQuantity + action.payload.quantity
- state.totalAmount = state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.price.value)
+ state.totalAmount =
+ state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.item.price.value)
if (!existingItem) {
- const totalPrice = parseFloat(newItem.price.value) * action.payload.quantity
+ const totalPrice = parseFloat(newItem.item.price.value) * action.payload.quantity
state.items.push({
...newItem,
@@ -38,7 +40,8 @@ const cartSlice = createSlice({
})
} else {
const totalPrice =
- parseFloat(existingItem.price.value) + parseFloat(existingItem.price.value) * action.payload.quantity
+ parseFloat(existingItem.item.price.value) +
+ parseFloat(existingItem.item.price.value) * action.payload.quantity
existingItem.quantity += action.payload.quantity
existingItem.totalPrice = totalPrice
@@ -50,17 +53,17 @@ const cartSlice = createSlice({
action: PayloadAction //slug.current as payload
) {
const productSlug = action.payload
- const existingItem = state.items.find(item => item.id === productSlug)
+ const existingItem = state.items.find(item => item.item.id === productSlug)
state.totalQuantity--
- state.totalAmount = state.totalAmount - parseFloat(existingItem?.price.value!)
+ state.totalAmount = state.totalAmount - parseFloat(existingItem?.item.price.value!)
if (existingItem?.quantity === 1) {
- state.items = state.items.filter(item => item.id !== productSlug)
+ state.items = state.items.filter(item => item.item.id !== productSlug)
} else {
existingItem!.quantity--
- existingItem!.totalPrice = existingItem!.totalPrice - parseFloat(existingItem?.price.value!)
+ existingItem!.totalPrice = existingItem!.totalPrice - parseFloat(existingItem?.item.price.value!)
}
},
diff --git a/apps/dsep/store/index.ts b/apps/dsep/store/index.ts
index e1d284a7e..a8c7ff0d2 100644
--- a/apps/dsep/store/index.ts
+++ b/apps/dsep/store/index.ts
@@ -1,4 +1,5 @@
-import { configureStore } from '@reduxjs/toolkit'
+import { combineReducers, configureStore } from '@reduxjs/toolkit'
+import { persistStore, persistReducer } from 'redux-persist'
import specialOfferProductsReducer from './specialOfferProducts-slice'
import newestProductReducer from './newestProduct-slice'
import SortedProductsListReducer from './sortedProductList-slice'
@@ -7,35 +8,43 @@ import cartSliceReducer from './cart-slice'
import userInfoReducer from './user-slice'
import sideNavBarReducer from './sideNavBar-slice'
import megaMenuReducer from './megaMenu-slice'
-import activeMenuItemReducer from './activeMenuItem-slice'
import settingBoxReducer from './settingBox-slice'
import scholarshipCartReducer from './scholarshipCart-slice'
import favoriteReducer from './favorite-slice'
import responseDataReducer from './responseData-slice'
+import storage from './storage'
-const store = configureStore({
- reducer: {
- specialOfferProductsList: specialOfferProductsReducer,
- newestProductsList: newestProductReducer,
- sortedProductsList: SortedProductsListReducer,
- cartUi: cartUiReducer,
- cart: cartSliceReducer,
- userInfo: userInfoReducer,
- sideNavBar: sideNavBarReducer,
- megaMenu: megaMenuReducer,
- activeMenuItem: activeMenuItemReducer,
- settingBox: settingBoxReducer,
- favorite: favoriteReducer,
- transactionId: responseDataReducer,
- quoteResponse: responseDataReducer,
- customerDetails: responseDataReducer,
- initResponse: responseDataReducer,
- scholarshipCart: scholarshipCartReducer
- },
+const persistConfig = {
+ key: 'root',
+ storage
+}
+
+const rootReducer = combineReducers({
+ specialOfferProductsList: specialOfferProductsReducer,
+ newestProductsList: newestProductReducer,
+ sortedProductsList: SortedProductsListReducer,
+ cartUi: cartUiReducer,
+ cart: cartSliceReducer,
+ userInfo: userInfoReducer,
+ sideNavBar: sideNavBarReducer,
+ megaMenu: megaMenuReducer,
+ settingBox: settingBoxReducer,
+ favorite: favoriteReducer,
+ transactionId: responseDataReducer,
+ quoteResponse: responseDataReducer,
+ customerDetails: responseDataReducer,
+ initResponse: responseDataReducer,
+ scholarshipCart: scholarshipCartReducer
+})
+
+const persistedReducer = persistReducer(persistConfig, rootReducer)
+
+export const store = configureStore({
+ reducer: persistedReducer,
middleware: getDefaultMiddleware =>
getDefaultMiddleware({
serializableCheck: false
})
})
-export default store
+export const persistor = persistStore(store)
diff --git a/apps/dsep/store/storage.ts b/apps/dsep/store/storage.ts
new file mode 100644
index 000000000..3a285bbe4
--- /dev/null
+++ b/apps/dsep/store/storage.ts
@@ -0,0 +1,19 @@
+import createWebStorage from 'redux-persist/lib/storage/createWebStorage'
+
+const createNoopStorage = () => {
+ return {
+ getItem(_key: any) {
+ return Promise.resolve(null)
+ },
+ setItem(_key: any, value: any) {
+ return Promise.resolve(value)
+ },
+ removeItem(_key: any) {
+ return Promise.resolve()
+ }
+ }
+}
+
+const storage = typeof window !== 'undefined' ? createWebStorage('local') : createNoopStorage()
+
+export default storage
diff --git a/apps/dsep/styles/globals.css b/apps/dsep/styles/globals.css
index 2ada04283..653214042 100644
--- a/apps/dsep/styles/globals.css
+++ b/apps/dsep/styles/globals.css
@@ -59,6 +59,10 @@ body {
color: rgb(var(--color-text-base));
}
+main {
+ background: #fbfcff;
+}
+
ul {
list-style: unset !important;
}
diff --git a/apps/dsep/types/common.types.ts b/apps/dsep/types/common.types.ts
new file mode 100644
index 000000000..0ca15a543
--- /dev/null
+++ b/apps/dsep/types/common.types.ts
@@ -0,0 +1,4 @@
+export interface Coordinate {
+ latitude: number
+ longitude: number
+}
diff --git a/apps/dsep/types/search.types.ts b/apps/dsep/types/search.types.ts
new file mode 100644
index 000000000..f5e748a42
--- /dev/null
+++ b/apps/dsep/types/search.types.ts
@@ -0,0 +1,112 @@
+import { CurrencyType } from '@beckn-ui/becknified-components'
+
+interface Location {
+ id: string
+ city: {
+ code: string
+ name: string
+ }
+ gps: string
+}
+
+interface Price {
+ value: string
+ currency: CurrencyType
+}
+
+interface Tag {
+ code: string
+ name: string
+ display: boolean
+ list?: Array<{
+ name: string
+ value: string
+ }>
+}
+
+interface Fulfillment {
+ id: string
+ type: string
+ tracking: boolean
+ tags: Tag[]
+}
+
+interface Image {
+ url: string
+ size_type: string
+}
+
+interface Item {
+ long_desc: string
+ short_desc: string
+ id: string
+ name: string
+ price: Price
+ locations: Location[]
+ fulfillments: Fulfillment[]
+ images: Image[]
+ tags: Tag[]
+ rating: string
+}
+
+interface LocationProvider {
+ id: string
+ name: string
+ rating: string
+ locations: Location[]
+ items: Item[]
+ images: Image[]
+}
+
+interface Message {
+ name: string
+ providers: LocationProvider[]
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+export interface SearchResponseModel {
+ context: Context
+ message: Message
+}
+
+export interface ParsedItemModel {
+ bppId: string
+ bppUri: string
+ domain: string
+ transactionId: string
+ providerId: string
+ providerName: string
+ item: Item
+ rating: string
+ // providerCoordinates: Coordinate
+}
+
+export interface AssemblyData {
+ type: string
+ colour: string
+ shape: string
+ length: string
+ width: string
+ quantity?: number
+ weight: string
+}
diff --git a/apps/dsep/utilities/cart-utils.ts b/apps/dsep/utilities/cart-utils.ts
index a5b3b5656..f8e506710 100644
--- a/apps/dsep/utilities/cart-utils.ts
+++ b/apps/dsep/utilities/cart-utils.ts
@@ -1,8 +1,9 @@
-import { CartItemForRequest, CartRetailItem, DataPerBpp } from '../lib/types/cart'
-import { ResponseModel } from '../lib/types/responseModel'
+import { CartItemForRequest, CartRetailItem } from '../lib/types/cart'
+import { Item, SelectData } from '../lib/types/select.types'
+import { ParsedItemModel } from '../types/search.types'
export const getCartItemsPerBpp = (cart: CartItemForRequest[]) => {
- const itemsPerBpp = {}
+ const itemsPerBpp: Record = {}
cart.map((item: CartItemForRequest) => {
const bppId = item.bpp_id
@@ -17,59 +18,75 @@ export const getCartItemsPerBpp = (cart: CartItemForRequest[]) => {
return itemsPerBpp
}
-export const getPayloadForQuoteRequest = (
- cartItemsPerBppPerProvider: DataPerBpp,
- transactionId: { transactionId: string }
-) => {
- const payload: any = {
- selectRequestDto: []
- }
-
- Object.keys(cartItemsPerBppPerProvider).forEach(bppId => {
- const cartItem: any = {
- context: {
- transaction_id: transactionId.transactionId,
- bpp_id: bppId,
- bpp_uri: cartItemsPerBppPerProvider[bppId][0].bpp_uri,
- domain: 'retail'
- },
- message: {
- order: {
- items: [],
- provider: {
- id: cartItemsPerBppPerProvider[bppId][0].providerId
- },
- locations: cartItemsPerBppPerProvider[bppId][0].locations
- }
- }
- }
- cartItemsPerBppPerProvider[bppId].forEach((item: any) => {
- if (item.bpp_id === bppId) {
- const itemObject = {
- quantity: {
- count: item.quantity
- },
- id: item.id
- }
- cartItem.message.order.items.push(itemObject)
- }
- })
-
- payload.selectRequestDto.push(cartItem)
- })
- return payload
-}
-
-export const getItemsForCart = (quoteData: ResponseModel[]) => {
- const items: CartRetailItem[] = []
+export const getItemsForCart = (quoteData: SelectData[]) => {
+ const items: Item[] = []
quoteData.forEach(data => {
- const { catalogs } = data.message
- const { order } = catalogs
+ const { order } = data.message
const { items: orderItems } = order
+ // const { items: orderItems } = order
items.push(...orderItems)
})
return items
}
+
+export const getPayloadForSelectRequest = (cartItems: CartRetailItem[]) => {
+ const payload: any = { data: [] }
+
+ // Group cart items by bppId
+ const groupedByBppId: Record = cartItems.reduce(
+ (acc: Record, item) => {
+ if (!acc[item.bppId]) {
+ acc[item.bppId] = []
+ }
+ acc[item.bppId].push(item)
+ return acc
+ },
+ {}
+ )
+
+ Object.entries(groupedByBppId).forEach(([bppId, items]) => {
+ const context = {
+ transaction_id: items[0].transactionId,
+ bpp_id: bppId,
+ bpp_uri: items[0].bppUri,
+ domain: items[0].domain
+ }
+
+ // Group items by providerName within each bppId
+ const groupedByProvider: Record = items.reduce(
+ (acc: Record, item) => {
+ if (!acc[item.providerName]) {
+ acc[item.providerName] = []
+ }
+ acc[item.providerName].push(item)
+ return acc
+ },
+ {}
+ )
+
+ const message = {
+ orders: Object.entries(groupedByProvider).map(([providerName, providerItems]) => {
+ const provider = { id: providerItems[0].providerId }
+ const items = providerItems.map(item => ({
+ id: item.item.id,
+ tags: [
+ {
+ descriptor: {
+ name: `select-${item.item.id}`
+ }
+ }
+ ]
+ }))
+
+ return { provider, items }
+ })
+ }
+
+ payload.data.push({ context, message })
+ })
+
+ return payload
+}
diff --git a/apps/dsep/utilities/checkout-utils.ts b/apps/dsep/utilities/checkout-utils.ts
index f40f534dc..d5fa67e42 100644
--- a/apps/dsep/utilities/checkout-utils.ts
+++ b/apps/dsep/utilities/checkout-utils.ts
@@ -1,97 +1,12 @@
+import axios from 'axios'
import { CartRetailItem, DataPerBpp } from '../lib/types/cart'
+import { InitResponseItem, InitResponseModel } from '../lib/types/init.types'
import { ResponseModel } from '../lib/types/responseModel'
+import { SelectResponseModel } from '../lib/types/select.types'
import { ShippingFormData } from '../pages/checkoutPage'
import { areObjectPropertiesEqual } from './common-utils'
-export const getPayloadForInitRequest = (
- cartItemsPerBppPerProvider: DataPerBpp,
- transactionId: { transactionId: string },
- customerAddress: ShippingFormData,
- billingFormData: ShippingFormData
-) => {
- const payload: any = {
- initRequestDto: []
- }
-
- Object.keys(cartItemsPerBppPerProvider).forEach(bppId => {
- const cartItem: any = {
- context: {
- transaction_id: transactionId.transactionId,
- bpp_id: bppId,
- bpp_uri: cartItemsPerBppPerProvider[bppId][0].bpp_uri,
- domain: 'retail'
- },
- message: {
- order: {
- items: [],
- provider: {
- id: cartItemsPerBppPerProvider[bppId][0].providerId,
- locations: [
- {
- id: cartItemsPerBppPerProvider[bppId][0].location_id
- }
- ]
- },
- addOns: [],
- offers: [],
- billing: {
- name: customerAddress.name,
- phone: customerAddress.mobileNumber,
- address: {
- door: '',
- building: customerAddress.address,
- city: customerAddress.address,
- state: customerAddress.address,
- country: 'IND',
- area_code: customerAddress.pinCode
- },
- email: 'testemail1@mailinator.com'
- },
- fulfillment: {
- type: 'HOME-DELIVERY',
- end: {
- location: {
- gps: cartItemsPerBppPerProvider[bppId][0].locations[0].gps,
- address: {
- door: '',
- building: customerAddress.address,
- street: customerAddress.address,
- city: customerAddress.address,
- state: customerAddress.address,
- country: 'IND',
- area_code: '560076'
- }
- },
- contact: {
- phone: '9191223433',
- email: 'testemail1@mailinator.com'
- }
- },
- customer: {
- person: {
- name: customerAddress.name
- }
- },
- id: cartItemsPerBppPerProvider[bppId][0].providerId
- }
- }
- }
- }
- cartItemsPerBppPerProvider[bppId].forEach((item: any) => {
- if (item.bpp_id === bppId) {
- const itemObject = {
- quantity: {
- count: item.quantity
- },
- id: item.id
- }
- cartItem.message.order.items.push(itemObject)
- }
- })
- payload.initRequestDto.push(cartItem)
- })
- return payload
-}
+const APIKEY = process.env.NEXT_PUBLIC_GOOGLE_API_KEY as string
export const getSubTotalAndDeliveryCharges = (initData: (ResponseModel & ResponseModel[]) | null) => {
let subTotal = 0
@@ -134,3 +49,170 @@ export const areShippingAndBillingDetailsSame = (
}
return !isBillingAddressComplete
}
+
+const extractAddressComponents = (result: any) => {
+ let country = null,
+ state = null,
+ city = null
+
+ for (const component of result.address_components) {
+ if (component.types.includes('country')) {
+ country = component.long_name
+ } else if (component.types.includes('administrative_area_level_1')) {
+ state = component.long_name
+ } else if (component.types.includes('locality')) {
+ city = component.long_name
+ }
+ }
+ return { country, state, city }
+}
+async function addressComponentsFromPincode(pincode: string) {
+ try {
+ const url = `https://maps.googleapis.com/maps/api/geocode/json?address=${pincode}&key=${APIKEY}`
+ const response = await axios.get(url)
+
+ const { country, state, city } = extractAddressComponents(response.data.results[0])
+
+ return { country, state, city }
+ } catch (error) {
+ console.error('Failed to geocode the pindcode', error)
+ }
+}
+
+export const getPayloadForInitRequest = async (selectResponse: SelectResponseModel, formData: ShippingFormData) => {
+ const { address, email, mobileNumber, name, pinCode } = formData
+ const cityData = await addressComponentsFromPincode(pinCode)
+ console.log('cityyyData', cityData)
+ let initPayload: any = {
+ data: []
+ }
+
+ selectResponse.data.forEach(res => {
+ const { transaction_id, bpp_id, bpp_uri, domain } = res.context
+ const { order } = res.message
+ const { items, provider, type, quote } = order
+ const { id: providerId } = provider
+
+ const context = {
+ transaction_id,
+ bpp_id,
+ bpp_uri,
+ domain
+ }
+
+ const message = {
+ orders: [
+ {
+ provider: {
+ id: providerId
+ },
+ items: items,
+ fulfillments: [
+ // TODO :- we have to map this with real data that ( fulfillment shoould come in select which is not coming)
+ {
+ id: '',
+ customer: {
+ contact: {
+ email,
+ mobileNumber
+ },
+ person: {
+ name
+ }
+ },
+ stops: [
+ {
+ type: 'end',
+ location: {
+ gps: '1.3806217468119772, 103.74636438437074',
+ address: address,
+ city: {
+ name: cityData?.city
+ },
+ country: {
+ code: ''
+ },
+ area_code: pinCode,
+ state: {
+ name: cityData?.state
+ }
+ },
+ contact: {
+ phone: mobileNumber
+ }
+ }
+ ]
+ }
+ ],
+ billing: {
+ name,
+ address,
+ state: {
+ name: cityData?.state
+ },
+ city: {
+ name: cityData?.city
+ },
+ email,
+ phone: mobileNumber
+ }
+ }
+ ]
+ }
+
+ initPayload.data.push({
+ context: context,
+ message: message
+ })
+ })
+ console.log('initPayload', initPayload)
+ return initPayload
+}
+
+export const handleFormSubmit = async (
+ formData: ShippingFormData,
+ selectResponse: SelectResponseModel,
+ setInitData: React.Dispatch>,
+ setIsLoadingForInit: React.Dispatch>,
+ setIsError: React.Dispatch>,
+ apiUrl: string
+) => {
+ setIsLoadingForInit(true)
+ try {
+ const initPayload = await getPayloadForInitRequest(selectResponse, formData)
+ console.log(initPayload)
+ axios
+ .post(`${apiUrl}/init`, initPayload)
+ .then(res => {
+ console.log('resss', res)
+ localStorage.setItem('initResult', JSON.stringify(res.data))
+ setInitData(res.data)
+ setIsLoadingForInit(false)
+ })
+ .catch(e => {
+ setIsError(true)
+ setIsLoadingForInit(false)
+ console.error(e)
+ })
+ } catch (error) {
+ console.error(error)
+ }
+}
+
+export const getPaymentBreakDown = (initData: InitResponseItem) => {
+ const { message } = initData
+ const { order } = message
+ const { quote } = order
+ const { breakup, price } = quote
+ const totalPricewithCurrent = `${price.currency} ${price.value}`
+
+ const breakUpMap: Record = {}
+ breakup.forEach(item => {
+ const {
+ title,
+ price: { currency, value }
+ } = item
+ breakUpMap[title] = `${currency} ${value} `
+ })
+ return { breakUpMap, totalPricewithCurrent }
+}
diff --git a/apps/dsep/utilities/confirm-utils.ts b/apps/dsep/utilities/confirm-utils.ts
index bf4b0541a..914e29edd 100644
--- a/apps/dsep/utilities/confirm-utils.ts
+++ b/apps/dsep/utilities/confirm-utils.ts
@@ -1,20 +1,6 @@
+import { InitResponseModel } from '../lib/types/init.types'
import { ResponseModel } from '../lib/types/responseModel'
-export const getInitMetaDataPerBpp = (initRes: ResponseModel[]) => {
- const itemsPerBpp = {}
- initRes.forEach(res => {
- const bppId = res.context.bpp_id
- const bpp_uri = res.context.bpp_uri
-
- itemsPerBpp[bppId] = {
- ...res.message.catalogs.responses[0].message.order,
- bpp_uri
- }
- })
-
- return itemsPerBpp
-}
-
export const getConfirmMetaDataForBpp = (initRes: ResponseModel[]) => {
const itemsPerBpp = {}
initRes.forEach(res => {
@@ -30,67 +16,57 @@ export const getConfirmMetaDataForBpp = (initRes: ResponseModel[]) => {
return itemsPerBpp
}
-export const getPayloadForConfirmRequest = (
- initMetaDataPerBpp: any,
- transactionId: { transactionId: string },
- userId: string
-) => {
- const payload: any = {
- confirmRequestDto: [],
- userId: userId
+export const getPayloadForConfirmRequest = (initResponse: InitResponseModel) => {
+ let payload: any = {
+ data: []
}
- Object.keys(initMetaDataPerBpp).forEach(bppId => {
- const confirmItem: any = {
- context: {
- transaction_id: transactionId.transactionId,
- bpp_id: bppId,
- bpp_uri: initMetaDataPerBpp[bppId].bpp_uri,
- domain: 'retail'
- },
+ initResponse.data.forEach(response => {
+ const { bpp_id, bpp_uri, transaction_id, domain } = response.context
+ const { order } = response.message
+ const { billing, fulfillments, items, provider, quote } = order
+ const { price } = quote
+ const { currency, value } = price
+
+ const context = {
+ transaction_id: transaction_id,
+ bpp_id: bpp_id,
+ bpp_uri: bpp_uri,
+ domain: domain
+ }
- message: {
- order: {
+ const message = {
+ orders: [
+ {
provider: {
- id: initMetaDataPerBpp[bppId].provider.id
+ id: provider.id
},
- addOns: [],
- offers: [],
- billing: initMetaDataPerBpp[bppId].billing,
- fulfillment: {
- type: initMetaDataPerBpp[bppId].fulfillment.type,
- end: {
- location: {
- gps: initMetaDataPerBpp[bppId].fulfillment.end.location.gps,
- address: initMetaDataPerBpp[bppId].billing.address
+ items: items,
+ fulfillments: fulfillments,
+ billing: billing,
+ payments: [
+ {
+ collected_by: 'BPP',
+ params: {
+ amount: value,
+ currency: currency,
+ bank_account_number: '',
+ bank_code: '',
+ bank_account_name: ''
},
- contact: {
- phone: initMetaDataPerBpp[bppId].billing.phone,
- email: 'testemail1@mailinator.com'
- }
- },
- customer: {
- person: {
- name: initMetaDataPerBpp[bppId].billing.name
- }
- },
- id: initMetaDataPerBpp[bppId].fulfillment.id
- },
- payment: initMetaDataPerBpp[bppId].payment,
- items: []
+ status: 'PAID',
+ type: 'PRE-ORDER',
+ transaction_id: transaction_id
+ }
+ ]
}
- }
+ ]
}
- initMetaDataPerBpp[bppId].items.forEach((item: any) => {
- const itemObject = {
- quantity: item.quantity,
- id: item.id
- }
- confirmItem.message.order.items.push(itemObject)
+ payload.data.push({
+ context,
+ message
})
-
- payload.confirmRequestDto.push(confirmItem)
})
return payload
diff --git a/apps/dsep/utilities/search-utils.ts b/apps/dsep/utilities/search-utils.ts
new file mode 100644
index 000000000..e146b4714
--- /dev/null
+++ b/apps/dsep/utilities/search-utils.ts
@@ -0,0 +1,36 @@
+// import { ParsedItemModel, SearchResponseModel } from '../types/search.types'
+
+import { ParsedItemModel, SearchResponseModel } from '../types/search.types'
+
+export const getParsedSearchlist = (data: SearchResponseModel[]) => {
+ const itemsarray: ParsedItemModel[] = []
+ data.forEach(entry => {
+ const context = entry.context
+ const message = entry.message
+ const domain = context.domain
+ const transactionId = context.transaction_id
+ const bppId = context.bpp_id
+ const bppUri = context.bpp_uri
+
+ message.providers.forEach(provider => {
+ const providerId = provider.id
+ const rating = provider.rating
+
+ provider?.items?.forEach(item => {
+ itemsarray.push({
+ bppId: bppId,
+ bppUri: bppUri,
+ domain,
+ transactionId,
+ providerId: providerId,
+ providerName: provider.name,
+ item,
+ rating
+ // providerCoordinates
+ })
+ })
+ })
+ })
+
+ return itemsarray
+}
diff --git a/apps/dsnp/pages/orderDetails/index.tsx b/apps/dsnp/pages/orderDetails/index.tsx
new file mode 100644
index 000000000..74fd4c623
--- /dev/null
+++ b/apps/dsnp/pages/orderDetails/index.tsx
@@ -0,0 +1,3 @@
+import OrderDetails from './orderDetails'
+
+export default orderDetails
diff --git a/apps/dsnp/pages/orderDetails/order b/apps/dsnp/pages/orderDetails/order
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/dsnp/pages/orderDetails.tsx b/apps/dsnp/pages/orderDetails/orderDetails.tsx
similarity index 100%
rename from apps/dsnp/pages/orderDetails.tsx
rename to apps/dsnp/pages/orderDetails/orderDetails.tsx
diff --git a/apps/dsnp/pages/orderDetails/orderSummary.tsx b/apps/dsnp/pages/orderDetails/orderSummary.tsx
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/mobility-bap/.prettierignore b/apps/mobility-bap/.prettierignore
new file mode 100644
index 000000000..a02ef09e5
--- /dev/null
+++ b/apps/mobility-bap/.prettierignore
@@ -0,0 +1,4 @@
+/node_modules/
+/coverage/
+/.next/
+/public/
diff --git a/apps/mobility-bap/Jenkinsfile b/apps/mobility-bap/Jenkinsfile
new file mode 100644
index 000000000..65d08c9ab
--- /dev/null
+++ b/apps/mobility-bap/Jenkinsfile
@@ -0,0 +1,29 @@
+pipeline {
+ agent any
+ stages {
+ stage('Executing Shell Script On Server') {
+ steps {
+ script {
+ sshagent(credentials: ['"${credentials}"']) {
+ sh '''
+ ssh -t -t ${userName}@${hostIP} -o StrictHostKeyChecking=no << EOF
+ ${listOfCommands}
+ logout
+ EOF
+ '''
+ }
+ }
+ }
+ }
+ }
+ post {
+ always {
+ cleanWs(cleanWhenNotBuilt: false,
+ deleteDirs: true,
+ disableDeferredWipeout: true,
+ notFailBuild: true,
+ patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
+ [pattern: '.propsfile', type: 'EXCLUDE']])
+ }
+ }
+}
diff --git a/apps/mobility-bap/components/BottomModal/BottomModal.tsx b/apps/mobility-bap/components/BottomModal/BottomModal.tsx
new file mode 100644
index 000000000..348e298bf
--- /dev/null
+++ b/apps/mobility-bap/components/BottomModal/BottomModal.tsx
@@ -0,0 +1,48 @@
+import { useState } from 'react'
+import { Transition } from '@headlessui/react'
+import { AiOutlineClose } from 'react-icons/ai'
+import { useLanguage } from '../../hooks/useLanguage'
+import { Image } from '@chakra-ui/react'
+
+interface ModalProps {
+ isOpen: boolean
+ onClose: () => void
+ children: React.ReactNode
+ partialClose?: boolean
+}
+
+const Modal: React.FC = ({ isOpen, onClose, children, partialClose }) => {
+ const { t } = useLanguage()
+ return (
+ onClose()}
+ >
+
+
+ )
+}
+
+export default Modal
diff --git a/apps/mobility-bap/components/BottomModal/index.tsx b/apps/mobility-bap/components/BottomModal/index.tsx
new file mode 100644
index 000000000..88b5f609a
--- /dev/null
+++ b/apps/mobility-bap/components/BottomModal/index.tsx
@@ -0,0 +1,3 @@
+import BottomModal from './BottomModal'
+
+export default BottomModal
diff --git a/apps/mobility-bap/components/Map/CenterMarker.svg b/apps/mobility-bap/components/Map/CenterMarker.svg
new file mode 100644
index 000000000..55bb20190
--- /dev/null
+++ b/apps/mobility-bap/components/Map/CenterMarker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/mobility-bap/components/Map/Map.tsx b/apps/mobility-bap/components/Map/Map.tsx
new file mode 100644
index 000000000..90439a655
--- /dev/null
+++ b/apps/mobility-bap/components/Map/Map.tsx
@@ -0,0 +1,148 @@
+import { MapContainer, TileLayer, Marker, Popup, useMap, ZoomControl } from 'react-leaflet'
+import { Image } from '@chakra-ui/react'
+import React, { useEffect, useState } from 'react'
+import Control from 'react-leaflet-custom-control'
+import 'leaflet/dist/leaflet.css'
+import { GiHamburgerMenu } from 'react-icons/gi'
+import { data } from './StoreMarkerData'
+import Icon from './store-marker.svg'
+import SelectedIcon from './SelectedMarker.svg'
+import CenterMarker from './CenterMarker.svg'
+import L from 'leaflet'
+import { isEmpty } from 'lodash'
+
+interface MapProps {
+ coords: { lat: number; long: number }
+ handleModalOpen: () => void
+ handleOptionDetailOpen: () => void
+ setSelectedStore: React.Dispatch>
+ selectedStore: any
+ // Using any for now since exact structure is not clear
+ stores: any[]
+}
+
+const Map: React.FC = ({
+ stores,
+ selectedStore,
+ coords,
+ handleModalOpen,
+ handleOptionDetailOpen,
+ setSelectedStore
+}) => {
+ const { lat, long } = coords
+ const [userLocation, setUserLocation] = useState<[number, number] | null>(null)
+ const [flyToUserLocation, setFlyToUserLocation] = useState(false)
+
+ useEffect(() => {
+ // Get the user's current location using the browser's geolocation API
+ navigator.geolocation.getCurrentPosition(
+ position => {
+ setUserLocation([position.coords.latitude, position.coords.longitude])
+ },
+ error => {
+ console.error('Error getting user location:', error)
+ }
+ )
+ }, [])
+
+ // Custom hook to zoom the map to the user's location
+ const ZoomToUserLocation = () => {
+ let map = useMap()
+
+ if (userLocation && flyToUserLocation) {
+ map.flyTo(userLocation, 12)
+ }
+
+ return null
+ }
+
+ const customIcon = new L.Icon({
+ iconUrl: Icon,
+ iconSize: [25, 35],
+ iconAnchor: [5, 30]
+ })
+
+ const customCenterMarker = new L.Icon({
+ iconUrl: CenterMarker,
+ iconSize: [40, 50],
+ iconAnchor: [5, 30]
+ })
+
+ const customSelectedIcon = new L.Icon({
+ iconUrl: Icon,
+ iconSize: [35, 45],
+ iconAnchor: [5, 30]
+ })
+
+ function MapView() {
+ let map = useMap()
+ map.setView([lat, long], map.getZoom())
+ return null
+ }
+
+ return (
+
+
+
+
+ setFlyToUserLocation(true)}
+ src="/images/LocateMe.svg"
+ alt="..."
+ />
+
+
+
+ {!isEmpty(stores) &&
+ stores.map((item: any, index: number) => {
+ const isSelected = item.lat === selectedStore?.lat && item.lon === selectedStore?.lon
+ const IconToUse = isSelected ? customSelectedIcon : customIcon
+ return (
+ {
+ setSelectedStore(item)
+ handleOptionDetailOpen()
+ }
+ }}
+ >
+ )
+ })}
+
+
+
+
+
+
+ )
+}
+
+// React memo not working for some reason
+//TODO Needed because the map is re-rendered even if the co-ords are same causing a flickering issue on the map. Will fix this later
+export default React.memo(Map, (prevProps, nextProps) => {
+ if (prevProps.coords.lat === nextProps.coords.lat && prevProps.coords.long === nextProps.coords.long) {
+ return true
+ }
+ return false
+})
diff --git a/apps/mobility-bap/components/Map/MapSearch.tsx b/apps/mobility-bap/components/Map/MapSearch.tsx
new file mode 100644
index 000000000..81b8a6085
--- /dev/null
+++ b/apps/mobility-bap/components/Map/MapSearch.tsx
@@ -0,0 +1,126 @@
+import React, { useState, useEffect } from 'react'
+import { Spinner } from '@chakra-ui/react'
+import { GoSearch } from 'react-icons/go'
+import { isEmpty } from 'lodash'
+import { Image } from '@chakra-ui/react'
+import { useLanguage } from '../../hooks/useLanguage'
+import useDebounce from '../../hooks/useDebounce'
+
+interface LocalNameFormat {
+ primaryName: string
+ secondaryName: string
+}
+
+function formatLocationName(name: string): LocalNameFormat {
+ const index = name.indexOf(',')
+ if (index !== -1) {
+ return {
+ primaryName: name.slice(0, index).trim(),
+ secondaryName: name.slice(index + 1).trim()
+ }
+ } else {
+ return {
+ primaryName: name.trim(),
+ secondaryName: ''
+ }
+ }
+}
+
+export interface SearchBarProp {
+ setQuery: React.Dispatch>
+ locations: any[]
+ query: string
+ handleLocationClick: (lat: number, long: number) => void
+ fetchResults: (query: string) => void
+ setShowSuggestions: React.Dispatch>
+}
+
+const SearchBar: React.FC = ({
+ setQuery,
+ locations,
+ query,
+ handleLocationClick,
+ fetchResults,
+ setShowSuggestions
+}) => {
+ const { t } = useLanguage()
+
+ //TODO Pseudo loading for now. Need to figure out to do this using map load events
+ const [loading, setLoading] = useState(false)
+
+ const [value, setValue] = useState('')
+
+ const debouncedValue = useDebounce(value, 300)
+
+ useEffect(() => {
+ setShowSuggestions(!isEmpty(value) && locations && !isEmpty(locations))
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [locations, value])
+
+ useEffect(() => {
+ setLoading(true)
+ setTimeout(() => {
+ setLoading(false)
+ }, 500)
+ }, [debouncedValue])
+
+ useEffect(() => {
+ // setQuery(debouncedValue);
+ fetchResults(debouncedValue)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [debouncedValue])
+
+ return (
+ <>
+
+
+ setValue(e.target.value)}
+ />
+ {loading && (
+
+ )}
+
+ {!isEmpty(value) && locations && !isEmpty(locations) && (
+
+ {locations.map((singleLocation, index) => {
+ const { primaryName, secondaryName } = formatLocationName(singleLocation.display_name)
+ return (
+
{
+ handleLocationClick(singleLocation.lat, singleLocation.lon)
+ setQuery(primaryName)
+ setValue('')
+ }}
+ >
+
+
+
{primaryName}
+ {secondaryName}
+
+
+ )
+ })}
+
+ )}
+ >
+ )
+}
+
+export default SearchBar
diff --git a/apps/mobility-bap/components/Map/OptionCard.tsx b/apps/mobility-bap/components/Map/OptionCard.tsx
new file mode 100644
index 000000000..eb9e27c8b
--- /dev/null
+++ b/apps/mobility-bap/components/Map/OptionCard.tsx
@@ -0,0 +1,79 @@
+import React from 'react'
+import { IconType } from 'react-icons'
+import cs from 'classnames'
+import { useLanguage } from '../../hooks/useLanguage'
+import { toast } from 'react-toastify'
+
+type OptionMeta = {
+ tagValue: string
+ tagName: string
+ title?: string
+}
+
+type OptionIcons = {
+ iconUrl: string
+ iconUrlLight: string
+}
+
+interface OptionCardProps {
+ optionMeta: OptionMeta
+ optionIcons: OptionIcons
+ isSelected?: boolean
+ setOption: React.Dispatch>
+}
+
+const OptionCard: React.FC = ({
+ optionMeta: { tagName, tagValue, title },
+ optionIcons: { iconUrl, iconUrlLight },
+ isSelected,
+ setOption
+}) => {
+ const { t } = useLanguage()
+ return (
+ {
+ if (tagValue !== 'Books' && tagValue !== 'restaurant') {
+ toast.info(`${t.comingSoon}`, {
+ theme: 'light',
+ position: 'top-center',
+ className: 'bg-[#fff] text-[#000]'
+ })
+ } else {
+ setOption({
+ tagName,
+ tagValue
+ })
+ }
+ }}
+ >
+ {/*
*/}
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+
+ {t[`${title}`]}
+
+
+ )
+}
+
+export default OptionCard
diff --git a/apps/mobility-bap/components/Map/SelectedMarker.svg b/apps/mobility-bap/components/Map/SelectedMarker.svg
new file mode 100644
index 000000000..3fe4e3b0f
--- /dev/null
+++ b/apps/mobility-bap/components/Map/SelectedMarker.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/mobility-bap/components/Map/StoreMarkerData.js b/apps/mobility-bap/components/Map/StoreMarkerData.js
new file mode 100644
index 000000000..8e7934824
--- /dev/null
+++ b/apps/mobility-bap/components/Map/StoreMarkerData.js
@@ -0,0 +1,1010 @@
+export const data = {
+ version: 0.6,
+ generator: 'Overpass API 0.7.60.6 e2dc3e5b',
+ osm3s: {
+ timestamp_osm_base: '2023-06-20T10:53:59Z',
+ copyright:
+ 'The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.'
+ },
+ elements: [
+ {
+ type: 'node',
+ id: 252590177,
+ lat: 48.86841,
+ lon: 2.3793255,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '93',
+ 'addr:postcode': '75011',
+ 'addr:street': 'Rue Jean-Pierre Timbaud',
+ amenity: 'restaurant',
+ bar: 'yes',
+ cuisine: 'regional;french',
+ internet_access: 'wlan',
+ 'internet_access:ssid': 'Cannibale_Café',
+ level: '0',
+ name: 'Cannibale Café',
+ opening_hours: 'Mo-Su 07:30-02:00; Sa 09:00-02:00; Su 09:00-24:00',
+ outdoor_seating: 'yes',
+ phone: '+33 1 49 29 95 59',
+ reservation: 'yes',
+ smoking: 'outside',
+ website: 'https://www.cannibalecafe.com',
+ wheelchair: 'limited'
+ }
+ },
+ {
+ type: 'node',
+ id: 289439792,
+ lat: 48.8686679,
+ lon: 2.3066263,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Spoon'
+ }
+ },
+ {
+ type: 'node',
+ id: 688020622,
+ lat: 48.8683074,
+ lon: 2.341731,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '17',
+ 'contact:phone': '+33 1 42 60 31 90',
+ 'contact:postcode': '75002',
+ 'contact:street': 'Rue Notre-Dame-des-Victoires',
+ name: 'Saturne',
+ 'name:en': 'Saturne',
+ source: 'cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2010'
+ }
+ },
+ {
+ type: 'node',
+ id: 692331225,
+ lat: 48.8682798,
+ lon: 2.3485268,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '95',
+ 'contact:postcode': '75002',
+ 'contact:street': "Rue d'Aboukir",
+ 'contact:website': 'https://www.echo-paris.com/',
+ cuisine: 'american;diner',
+ name: 'Echo',
+ opening_hours: 'We-Fr 09:00-16:00; Sa-Su 10:00-17:00',
+ source: 'cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2010'
+ }
+ },
+ {
+ type: 'node',
+ id: 706743990,
+ lat: 48.868273,
+ lon: 2.3614921,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-18',
+ microbrewery: 'no',
+ name: 'Le Pachyderme',
+ outdoor_seating: 'yes',
+ self_service: 'no',
+ 'toilets:wheelchair': 'no',
+ wheelchair: 'limited'
+ }
+ },
+ {
+ type: 'node',
+ id: 792056043,
+ lat: 48.8685089,
+ lon: 2.3894343,
+ tags: {
+ amenity: 'restaurant',
+ name: "L'Entrepot's",
+ 'toilets:wheelchair': 'no',
+ wheelchair: 'limited'
+ }
+ },
+ {
+ type: 'node',
+ id: 833088653,
+ lat: 48.8683182,
+ lon: 2.298485,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'italian',
+ name: 'Villa Sophia'
+ }
+ },
+ {
+ type: 'node',
+ id: 1490922341,
+ lat: 48.8682398,
+ lon: 2.3365168,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-19',
+ cuisine: 'sushi;japanese',
+ name: 'Fuji Sushi',
+ toilets: 'yes',
+ 'toilets:access': 'customers',
+ 'toilets:disposal': 'flush',
+ 'toilets:position': 'seated',
+ 'toilets:wheelchair': 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 1670265992,
+ lat: 48.8686409,
+ lon: 2.35998,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-18',
+ cuisine: 'chinese',
+ name: 'Han Shi Fang',
+ opening_hours: 'We-Su 12:00-14:30; Mo-Su 18:00-22:30',
+ phone: '+33 1 53 72 90 16',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 1686639133,
+ lat: 48.8685076,
+ lon: 2.326929,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:housename': 'Castille',
+ 'contact:housenumber': '37',
+ 'contact:postcode': '75001',
+ 'contact:street': 'Rue Cambon',
+ 'contact:website': 'http://www.castille.com',
+ cuisine: 'italian',
+ name: "L'Assagio",
+ source: 'http://www.castille.com',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 1799874666,
+ lat: 48.8685692,
+ lon: 2.2245926,
+ tags: {
+ 'access:covid19': 'no',
+ amenity: 'restaurant',
+ check_date: '2023-06-03',
+ 'contact:city': 'Suresnes',
+ 'contact:housenumber': '5',
+ 'contact:phone': '+33 1 41 11 00 60',
+ 'contact:postcode': '92150',
+ 'contact:street': 'Rue Jules Ferry',
+ 'contact:website': 'http://www.vallonduliban.com',
+ cuisine: 'lebanese',
+ 'delivery:covid19': 'only',
+ name: 'Vallon du Liban',
+ 'opening_hours:covid19': 'Mo-Sa 10:00-14:30,18:00-21:00',
+ 'takeaway:covid19': 'only'
+ }
+ },
+ {
+ type: 'node',
+ id: 1918939891,
+ lat: 48.8685479,
+ lon: 2.3683248,
+ tags: {
+ 'addr:housenumber': '2',
+ 'addr:street': 'Rue de la Fontaine au Roi',
+ amenity: 'restaurant',
+ 'breakfast:brunch': 'Sa-Su',
+ check_date: '2023-04-09',
+ 'contact:instagram': 'tawletparis',
+ 'contact:phone': '+33 6 73 92 49 12',
+ 'contact:website': 'https://www.soukeltayeb.com/tawlet/11/tawlet-paris',
+ cuisine: 'lebanese',
+ email: 'parisreservation@tawlet.com',
+ food: 'cuisine libanaise',
+ level: '0',
+ name: 'Tawlet',
+ opening_hours: 'Mo-Sa 12:00-14:00,19:30-22:00; Su 12:00-14:00',
+ outdoor_seating: 'yes',
+ reservation: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 1930249941,
+ lat: 48.8683213,
+ lon: 2.389647,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '6',
+ 'addr:postcode': '75020',
+ 'addr:street': 'Rue Sorbier',
+ amenity: 'restaurant',
+ email: 'contact@lelieudit.com',
+ name: 'Le Lieu Dit',
+ opening_hours: 'Tu-Su 16:00-02:00',
+ phone: '+33 1 40332629',
+ website: 'http://lelieudit.com/',
+ wheelchair: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 3086152504,
+ lat: 48.8684431,
+ lon: 2.3706292,
+ tags: {
+ 'addr:housenumber': '23',
+ 'addr:street': 'Rue de la Fontaine au Roi',
+ amenity: 'restaurant',
+ check_date: '2023-04-22',
+ cuisine: 'italian',
+ internet_access: 'no',
+ name: 'La Trottinette',
+ 'opening_hours:covid19': 'off',
+ outdoor_seating: 'yes',
+ 'payment:credit_cards': 'yes',
+ 'payment:mastercard': 'yes',
+ 'payment:visa': 'yes',
+ phone: '+33 7 60 91 93 51',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 3576432681,
+ lat: 48.8683753,
+ lon: 2.3433303,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'tacos',
+ name: 'Coyo Taco'
+ }
+ },
+ {
+ type: 'node',
+ id: 3701380596,
+ lat: 48.8683026,
+ lon: 2.3256832,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Caepus',
+ wheelchair: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 3701384270,
+ lat: 48.8685365,
+ lon: 2.3254094,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2022-10-01',
+ name: 'Nelly',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 3701384271,
+ lat: 48.8684636,
+ lon: 2.3254367,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Cuizines'
+ }
+ },
+ {
+ type: 'node',
+ id: 4081690989,
+ lat: 48.8684342,
+ lon: 2.3478844,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'chinese',
+ karaoke: 'yes',
+ name: 'Meet & Taste',
+ opening_hours: 'Tu-Su 13:00-22:30'
+ }
+ },
+ {
+ type: 'node',
+ id: 4365816270,
+ lat: 48.8682811,
+ lon: 2.4191129,
+ tags: {
+ amenity: 'restaurant',
+ name: "L'Amandine"
+ }
+ },
+ {
+ type: 'node',
+ id: 4405645654,
+ lat: 48.8683919,
+ lon: 2.2267087,
+ tags: {
+ 'addr:city': 'Suresnes',
+ 'addr:housenumber': '11',
+ 'addr:postcode': '92150',
+ 'addr:street': 'Rue des Bourets',
+ amenity: 'restaurant',
+ name: 'Les Rives'
+ }
+ },
+ {
+ type: 'node',
+ id: 4405645665,
+ lat: 48.8685823,
+ lon: 2.2267824,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'thai',
+ name: 'Chang Thai'
+ }
+ },
+ {
+ type: 'node',
+ id: 4405645666,
+ lat: 48.8686228,
+ lon: 2.226687,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'japanese',
+ name: 'Yamato',
+ phone: '+33 1 41 38 28 00',
+ website: 'http://yamato-suresnes.fr'
+ }
+ },
+ {
+ type: 'node',
+ id: 4684318340,
+ lat: 48.8684825,
+ lon: 2.3248349,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '7',
+ 'contact:postcode': '75008',
+ 'contact:street': 'Rue du Chevalier de Saint-George',
+ cuisine: 'italian',
+ name: 'Ferona'
+ }
+ },
+ {
+ type: 'node',
+ id: 4792366420,
+ lat: 48.8685504,
+ lon: 2.3749726,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ 'contact:housenumber': '140',
+ 'contact:street': 'Rue Saint-Maur',
+ name: 'Le Myrobolant',
+ opening_hours: 'Mo-We 10:00-23:45; Th-Sa 10:00-02:00',
+ 'opening_hours:covid19': 'open',
+ phone: '+33 1 71 28 84 79',
+ 'takeaway:covid19': 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 4876150813,
+ lat: 48.8682778,
+ lon: 2.398126,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '26',
+ 'contact:phone': '+33 9 81 42 68 88',
+ 'contact:postcode': '75020',
+ 'contact:street': 'Rue de la Chine',
+ 'contact:website': 'https://www.atelierfratelli.fr/',
+ name: 'Atelier Fratelli',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 4968226339,
+ lat: 48.8682947,
+ lon: 2.4008547,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'japanese',
+ name: 'Sushi Sun II'
+ }
+ },
+ {
+ type: 'node',
+ id: 5026230530,
+ lat: 48.8682306,
+ lon: 2.3711863,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-04-15',
+ 'contact:website': 'https://franginsparis.fr',
+ name: 'Frangins'
+ }
+ },
+ {
+ type: 'node',
+ id: 5030473225,
+ lat: 48.8684606,
+ lon: 2.2820539,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '112',
+ 'contact:phone': '+33 1 48 25 49 20',
+ 'contact:postcode': '75016',
+ 'contact:street': 'Avenue Victor Hugo',
+ 'contact:website': 'http://www.masa-paris.fr/',
+ cuisine: 'fine_dining',
+ name: 'MaSa'
+ }
+ },
+ {
+ type: 'node',
+ id: 5036805722,
+ lat: 48.8683814,
+ lon: 2.3477384,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'argentinian',
+ indoor_seating: 'yes',
+ name: 'Caminito',
+ 'name:fr': 'Caminito',
+ outdoor_seating: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 5062019472,
+ lat: 48.8684028,
+ lon: 2.3664068,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-04-07',
+ cuisine: 'pizza',
+ name: "Nolita's",
+ 'opening_hours:covid19': 'off'
+ }
+ },
+ {
+ type: 'node',
+ id: 5230354821,
+ lat: 48.8682611,
+ lon: 2.3504636,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Scarabee'
+ }
+ },
+ {
+ type: 'node',
+ id: 5327269521,
+ lat: 48.8685684,
+ lon: 2.2816776,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'italian',
+ name: 'Giulio Rebellato',
+ operator: 'Famille Rebellato',
+ phone: '+33 1 47 27 50 26',
+ website: 'https://www.rebellato.com'
+ }
+ },
+ {
+ type: 'node',
+ id: 5501780720,
+ lat: 48.86856,
+ lon: 2.3547945,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '6',
+ 'contact:phone': '+33 9 54 70 66 57',
+ 'contact:postcode': '75010',
+ 'contact:street': 'Rue Blondel',
+ description: 'Restaurant sénégalais.',
+ name: 'Le Djoliba',
+ opening_hours: 'Mo-Su 12:00-24:00'
+ }
+ },
+ {
+ type: 'node',
+ id: 5537765794,
+ lat: 48.8682814,
+ lon: 2.222624,
+ tags: {
+ 'addr:housenumber': '1',
+ 'addr:postcode': '92150',
+ 'addr:street': 'Rue de la Gare de Longchamp',
+ amenity: 'restaurant',
+ name: 'Bar des Amis',
+ 'opening_hours:covid19': 'off',
+ phone: '+33147724401'
+ }
+ },
+ {
+ type: 'node',
+ id: 5599022934,
+ lat: 48.8684918,
+ lon: 2.34155,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'japanese',
+ name: 'Saveurs Zen',
+ takeaway: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 5922608644,
+ lat: 48.8684756,
+ lon: 2.4042436,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '32',
+ 'addr:postcode': '75020',
+ 'addr:street': 'Rue du Surmelin',
+ amenity: 'restaurant',
+ cuisine: 'pizza',
+ name: 'Ma Pizza',
+ phone: '+33 1 77 32 57 96'
+ }
+ },
+ {
+ type: 'node',
+ id: 6356590086,
+ lat: 48.8684222,
+ lon: 2.3664704,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2022-07-29',
+ name: 'Cavalier',
+ 'survey:date': '2020-07-11'
+ }
+ },
+ {
+ type: 'node',
+ id: 6445733494,
+ lat: 48.8686176,
+ lon: 2.2817137,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'pizza;italian',
+ name: 'Pizzeria Rebellato',
+ operator: 'Famille Rebellato',
+ phone: '+33 1 44 05 08 08',
+ website: 'https://www.rebellato.com'
+ }
+ },
+ {
+ type: 'node',
+ id: 6578764687,
+ lat: 48.8682613,
+ lon: 2.3902713,
+ tags: {
+ amenity: 'restaurant',
+ name: 'La Dérive',
+ source: 'survey'
+ }
+ },
+ {
+ type: 'node',
+ id: 6641610085,
+ lat: 48.8682861,
+ lon: 2.3368525,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '5',
+ 'contact:phone': '+33 1 42 96 04 88',
+ 'contact:postcode': '75002',
+ 'contact:street': 'Rue de Louvois',
+ cuisine: 'japanese',
+ description: 'Restaurant japonais spécialisé en bento',
+ name: 'Chez Miki',
+ opening_hours: 'Mo 12:00-14:30; Tu-Sa 12:00-14:30, 19:00-22:30; Su 19:00-22:30'
+ }
+ },
+ {
+ type: 'node',
+ id: 7023953785,
+ lat: 48.8683405,
+ lon: 2.3350373,
+ tags: {
+ amenity: 'restaurant',
+ 'contact:city': 'Paris',
+ 'contact:housenumber': '1',
+ 'contact:phone': '+33 1 42 96 16 61',
+ 'contact:postcode': '75002',
+ 'contact:street': 'Rue Monsigny',
+ cuisine: 'italian',
+ 'diet:vegetarian': 'yes',
+ name: 'Villa Dondelli'
+ }
+ },
+ {
+ type: 'node',
+ id: 7447391351,
+ lat: 48.8682905,
+ lon: 2.373936,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '57',
+ 'addr:postcode': '75011',
+ 'addr:street': 'Rue de la Fontaine au Roi',
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ name: "Le p'tit deux"
+ }
+ },
+ {
+ type: 'node',
+ id: 7447391352,
+ lat: 48.8682779,
+ lon: 2.373876,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ name: 'La Passion'
+ }
+ },
+ {
+ type: 'node',
+ id: 7543127685,
+ lat: 48.868538,
+ lon: 2.3699693,
+ tags: {
+ 'addr:housenumber': '17',
+ 'addr:postcode': '75011',
+ 'addr:street': 'Rue de la Fontaine au Roi',
+ amenity: 'restaurant',
+ bar: 'no',
+ check_date: '2023-04-22',
+ cuisine: 'peruvian',
+ email: 'alpaso@picaflor.fr',
+ internet_access: 'no',
+ level: '0',
+ name: 'Picaflor al paso',
+ note: "horaires d'ouverture très aléatoires",
+ outdoor_seating: 'no',
+ 'payment:mastercard': 'yes',
+ 'payment:visa': 'yes',
+ phone: '+33 6 69 19 06 01',
+ takeaway: 'only',
+ website: 'https://www.picafloralpaso.com/',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 7595455047,
+ lat: 48.8682283,
+ lon: 2.3725524,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ name: 'Bloom',
+ opening_hours: 'Mo-Fr 12:00-15:00',
+ phone: '+33 7 85 46 11 18',
+ takeaway: 'only',
+ website: 'http://bloom-restaurant.fr/'
+ }
+ },
+ {
+ type: 'node',
+ id: 7995599846,
+ lat: 48.8685828,
+ lon: 2.3435702,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'sushi;sashimi',
+ delivery: 'yes',
+ level: '0',
+ name: 'Restaurant asiatique',
+ outdoor_seating: 'no',
+ smoking: 'no',
+ takeaway: 'yes',
+ wheelchair: 'yes'
+ }
+ },
+ {
+ type: 'node',
+ id: 8305863270,
+ lat: 48.868469,
+ lon: 2.3719492,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '117',
+ 'addr:postcode': '75011',
+ 'addr:street': 'Avenue Parmentier',
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ 'contact:instagram': 'https://www.instagram.com/cadence.paris/',
+ cuisine: 'french',
+ 'diet:meat': 'yes',
+ 'diet:vegetarian': 'yes',
+ email: 'bonappetit@cadencecadence.fr',
+ name: 'cadence',
+ opening_hours: 'Mo-Fr 12:00-14:00,18:00-23:00; Sa 12:00-15:30,18:00-01:00',
+ phone: '+33 986153065',
+ website: 'https://www.cadencecadence.fr/'
+ }
+ },
+ {
+ type: 'node',
+ id: 8376827624,
+ lat: 48.868319,
+ lon: 2.3751558,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-04-15',
+ cuisine: 'pizza',
+ name: '400° laboratorio',
+ outdoor_seating: 'yes',
+ 'survey:date': '2022-05-21'
+ }
+ },
+ {
+ type: 'node',
+ id: 8587058178,
+ lat: 48.868259,
+ lon: 2.3749238,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-11',
+ name: 'Le flamboyant'
+ }
+ },
+ {
+ type: 'node',
+ id: 8787334023,
+ lat: 48.8686397,
+ lon: 2.3862179,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '1',
+ 'addr:postcode': '75020',
+ 'addr:street': "Rue d'Eupatoria",
+ amenity: 'restaurant',
+ bar: 'no',
+ brewery: 'no',
+ check_date: '2023-04-22',
+ cuisine: 'italian',
+ delivery: 'no',
+ highchair: 'no',
+ internet_access: 'no',
+ level: '0',
+ name: 'Dilia',
+ opening_hours: 'Th-Mo 19:30-22:30; Th-Su 12:30-14:00',
+ outdoor_seating: 'yes',
+ 'payment:mastercard': 'yes',
+ 'payment:visa': 'yes',
+ phone: '+33 953562414',
+ reservation: 'yes',
+ takeaway: 'no',
+ website: 'http://www.dilia.fr/',
+ wheelchair: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 8793139852,
+ lat: 48.8685045,
+ lon: 2.3701736,
+ tags: {
+ 'addr:housenumber': '19',
+ 'addr:street': 'Rue de la Fontaine au Roi',
+ amenity: 'restaurant',
+ check_date: '2023-04-22',
+ 'contact:instagram': 'restaurant_vantre',
+ 'contact:phone': '+33148061696',
+ cuisine: 'french',
+ name: 'Vantre',
+ opening_hours: 'Mo-Fr 12:00-14:00,19:30-22:00',
+ website: 'http://www.vantre.fr/'
+ }
+ },
+ {
+ type: 'node',
+ id: 8813020831,
+ lat: 48.8683757,
+ lon: 2.3726204,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-09',
+ name: "P'tit Resto"
+ }
+ },
+ {
+ type: 'node',
+ id: 9196018021,
+ lat: 48.8683105,
+ lon: 2.3367286,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'korean',
+ name: 'Hang Ari',
+ opening_hours: 'Tu-Su 12:00-14:30, 19:00-22:30',
+ phone: '+33 1 44 50 44 50'
+ }
+ },
+ {
+ type: 'node',
+ id: 9753023878,
+ lat: 48.8682766,
+ lon: 2.3877051,
+ tags: {
+ 'addr:housenumber': '67',
+ 'addr:street': 'Rue de Ménilmontant, 75020 Paris',
+ amenity: 'restaurant',
+ check_date: '2023-04-24',
+ 'contact:phone': '+33 1 40 30 22 97',
+ name: 'Becquetance',
+ opening_hours: 'Mo-Fr 12:00-15:00,19:00-24:00; Sa-Su off',
+ outdoor_seating: 'yes',
+ reservation: 'yes',
+ takeaway: 'no',
+ website: 'https://www.instagram.com/becquetance_paris/'
+ }
+ },
+ {
+ type: 'node',
+ id: 9821175640,
+ lat: 48.8685726,
+ lon: 2.3900923,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Pacific Bowl'
+ }
+ },
+ {
+ type: 'node',
+ id: 9845296414,
+ lat: 48.8682431,
+ lon: 2.3897383,
+ tags: {
+ amenity: 'restaurant',
+ name: 'il parigino',
+ website: 'https://ilparigino.com'
+ }
+ },
+ {
+ type: 'node',
+ id: 9985705703,
+ lat: 48.8682277,
+ lon: 2.3307632,
+ tags: {
+ amenity: 'restaurant',
+ bar: 'yes',
+ cuisine: 'french',
+ name: 'Royal Vendôme'
+ }
+ },
+ {
+ type: 'node',
+ id: 10220756525,
+ lat: 48.8682975,
+ lon: 2.3367866,
+ tags: {
+ amenity: 'restaurant',
+ cuisine: 'korean',
+ name: 'Kimchi',
+ opening_hours: 'Mo-Sa 12:00-14:00, Mo,Tu,Th-Sa 19:00-22:00'
+ }
+ },
+ {
+ type: 'node',
+ id: 10283141386,
+ lat: 48.8684709,
+ lon: 2.3608529,
+ tags: {
+ amenity: 'restaurant',
+ check_date: '2023-03-18',
+ name: 'Martin',
+ website: 'https://www.marriott.com/en-us/hotels/parpr-renaissance-paris-republique-hotel/dining/'
+ }
+ },
+ {
+ type: 'node',
+ id: 10559135909,
+ lat: 48.8683454,
+ lon: 2.2980754,
+ tags: {
+ amenity: 'restaurant',
+ name: 'Côme Marceau'
+ }
+ },
+ {
+ type: 'node',
+ id: 10620314388,
+ lat: 48.8684578,
+ lon: 2.355482,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '326',
+ 'addr:postcode': '75003',
+ 'addr:street': 'Rue Saint-Martin',
+ amenity: 'restaurant',
+ cuisine: 'peruvian',
+ indoor_seating: 'yes',
+ name: 'Mikuna',
+ opening_hours: 'Mo-Sa 11:45-14:30, 18:30-23:00; Su 10:00-14:30',
+ outdoor_seating: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 10620314394,
+ lat: 48.8683999,
+ lon: 2.3554616,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '326',
+ 'addr:postcode': '75003',
+ 'addr:street': 'Rue Saint-Martin',
+ amenity: 'restaurant',
+ cuisine: 'japanese',
+ indoor_seating: 'yes',
+ name: 'Poketea Factory',
+ outdoor_seating: 'no'
+ }
+ },
+ {
+ type: 'node',
+ id: 10620314395,
+ lat: 48.8682532,
+ lon: 2.3553777,
+ tags: {
+ 'addr:city': 'Paris',
+ 'addr:housenumber': '324',
+ 'addr:postcode': '75003',
+ 'addr:street': 'Rue Saint-Martin',
+ amenity: 'restaurant',
+ cuisine: 'vietnamese',
+ name: 'Sen Viet'
+ }
+ }
+ ]
+}
+
+export const optionData = [
+ {
+ tagName: 'amenity',
+ tagValue: 'Books',
+ title: 'optionBooks',
+ iconUrl: '/images/store-options/Books.svg',
+ iconUrl_light: '/images/store-options/Books_light.svg'
+ },
+ {
+ tagName: 'amenity',
+ tagValue: 'restaurant',
+ title: 'optionRestaurants',
+ iconUrl: '/images/store-options/Restaurants.svg',
+ iconUrl_light: '/images/store-options/Restaurants_light.svg'
+ },
+
+ {
+ tagName: 'amenity',
+ tagValue: 'Shopping',
+ title: 'optionStores',
+ iconUrl: '/images/store-options/Shopping.svg',
+ iconUrl_light: '/images/store-options/Shopping_light.svg'
+ },
+
+ {
+ tagName: 'amenity',
+ tagValue: 'Hotels',
+ title: 'optionHotels',
+ iconUrl: '/images/store-options/Hotels.svg',
+ iconUrl_light: '/images/store-options/Hotels_light.svg'
+ }
+]
diff --git a/apps/mobility-bap/components/Map/index.tsx b/apps/mobility-bap/components/Map/index.tsx
new file mode 100644
index 000000000..f97ef1214
--- /dev/null
+++ b/apps/mobility-bap/components/Map/index.tsx
@@ -0,0 +1,3 @@
+import Map from './Map'
+
+export default Map
diff --git a/apps/mobility-bap/components/Map/store-marker.svg b/apps/mobility-bap/components/Map/store-marker.svg
new file mode 100644
index 000000000..beba769ea
--- /dev/null
+++ b/apps/mobility-bap/components/Map/store-marker.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/mobility-bap/components/appHeader/AppHeader.tsx b/apps/mobility-bap/components/appHeader/AppHeader.tsx
new file mode 100644
index 000000000..f2634fc90
--- /dev/null
+++ b/apps/mobility-bap/components/appHeader/AppHeader.tsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import Router from 'next/router'
+import { Box, Card, CardBody, Image, Text } from '@chakra-ui/react'
+import backArrow from '/public/images/Back.svg'
+
+export interface AppHeaderPropsModel {
+ appHeaderText: string
+}
+
+export const AppHeader: React.FC = props => {
+ const goBack = () => Router.back()
+ return (
+
+
+ goBack()}
+ cursor={'pointer'}
+ >
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+
+ {props.appHeaderText}
+
+
+
+ )
+}
diff --git a/apps/mobility-bap/components/button/Button.tsx b/apps/mobility-bap/components/button/Button.tsx
new file mode 100644
index 000000000..403ab7399
--- /dev/null
+++ b/apps/mobility-bap/components/button/Button.tsx
@@ -0,0 +1,36 @@
+import React, { ReactElement, useState } from 'react'
+import { Button as ButtonComp } from '@chakra-ui/react'
+
+export interface ButtonPropsModel {
+ buttonText: string | ReactElement
+ background: string
+ color: string
+ handleOnClick?: () => void
+ isDisabled: boolean
+}
+
+const Button: React.FC = props => {
+ const isDisabled = props.isDisabled
+
+ return (
+ <>
+
+ {props.buttonText}
+
+ >
+ )
+}
+
+export default Button
diff --git a/apps/mobility-bap/components/header/Logo.tsx b/apps/mobility-bap/components/header/Logo.tsx
new file mode 100644
index 000000000..dab51de2f
--- /dev/null
+++ b/apps/mobility-bap/components/header/Logo.tsx
@@ -0,0 +1,25 @@
+import { Image } from '@chakra-ui/react'
+import Link from 'next/link'
+import React from 'react'
+
+const Logo = () => {
+ return (
+
+
+
+
+
+ )
+}
+
+export default Logo
diff --git a/apps/mobility-bap/components/header/SearchBar.tsx b/apps/mobility-bap/components/header/SearchBar.tsx
new file mode 100644
index 000000000..d6f7d3945
--- /dev/null
+++ b/apps/mobility-bap/components/header/SearchBar.tsx
@@ -0,0 +1,39 @@
+import React, { useState } from 'react'
+import { GoSearch } from 'react-icons/go'
+import { useLanguage } from '../../hooks/useLanguage'
+import { SearchBarPropsModel } from '../../lib/types/search'
+
+const SearchBar: React.FC = ({ searchString, handleChange }) => {
+ const { t } = useLanguage()
+ const [searchText, setSearchText] = useState(searchString)
+
+ const inputChangeHandler = (event: React.BaseSyntheticEvent) => {
+ setSearchText(event.target.value)
+ }
+
+ const handleSubmit = () => {
+ handleChange(searchText)
+ }
+
+ return (
+
+ event.key === 'Enter' && handleSubmit()}
+ />
+
+ )
+}
+
+export default SearchBar
diff --git a/apps/mobility-bap/components/header/Settings.tsx b/apps/mobility-bap/components/header/Settings.tsx
new file mode 100644
index 000000000..e3f2c4bc0
--- /dev/null
+++ b/apps/mobility-bap/components/header/Settings.tsx
@@ -0,0 +1,53 @@
+import React from 'react'
+import { AiOutlineSetting, AiOutlineDown } from 'react-icons/ai'
+import { useDispatch, useSelector } from 'react-redux'
+import { settingBoxActions } from '../../store/settingBox-slice'
+import Language from './language/Language'
+import { useLanguage } from '../../hooks/useLanguage'
+import { ISettingBoxRootState } from '../../lib/types/settingBox'
+
+// Settings is just Language selector for now
+const Settings = () => {
+ const dispatch = useDispatch()
+ const { t, locale } = useLanguage()
+
+ const isSettingBoxOpen = useSelector((state: ISettingBoxRootState) => state.settingBox.isOpen)
+
+ function toggleShowSettingBox() {
+ dispatch(settingBoxActions.toggleSettingBox())
+ }
+
+ function onCloseSettingBox() {
+ dispatch(settingBoxActions.closeSettingBox())
+ }
+
+ return (
+
+
+
{locale == 'en' ? 'En' : 'Fr'}
+
+
+ {isSettingBoxOpen ? (
+ <>
+
+
+
+
+ >
+ ) : null}
+
+ )
+}
+
+export default Settings
diff --git a/apps/mobility-bap/components/header/index.tsx b/apps/mobility-bap/components/header/index.tsx
new file mode 100644
index 000000000..211072d18
--- /dev/null
+++ b/apps/mobility-bap/components/header/index.tsx
@@ -0,0 +1,219 @@
+import React, { useEffect, useState } from 'react'
+import BottomModal from '../BottomModal'
+import { Box, Image, Text } from '@chakra-ui/react'
+import Settings from './Settings'
+import { useRouter } from 'next/router'
+
+import { useLanguage } from '../../hooks/useLanguage'
+
+type PathnameObjectType = { [key: string]: string }
+
+const cartIconBlackList: string[] = [
+ '/orderConfirmation',
+ '/orderDetails',
+ '/trackOrder',
+ '/feedback',
+ '/orderHistory',
+ '/',
+ '/mobileOtp',
+ '/cart',
+ '/checkoutPage',
+ '/paymentMode'
+]
+
+const backIconList = ['/', '/orderDetails']
+
+const homeIconBlackList = ['/orderHistory', '/', '/homePage', '/mobileOtp']
+
+const storeHeaderBlackList = [
+ '/checkoutPage',
+ '/orderHistory',
+ '/orderDetails',
+ '/cart',
+ '/homePage',
+ '/orderConfirmation',
+ 'feedback',
+ '/',
+ '/mobileOtp',
+ '/paymentMode'
+]
+const headerValues: PathnameObjectType = {
+ '/checkoutPage': 'Billing & Shipping',
+ '/orderHistory': 'Order History',
+ '/orderDetails': 'Order Details',
+ '/': 'Sign In',
+ '/mobileOtp': 'Sign In',
+ '/cart': 'Cart',
+ '/paymentMode': 'Select Payment Method',
+ feedback: 'Feedback'
+}
+
+const headerValuesFrench: PathnameObjectType = {
+ '/checkoutPage': 'Facturation et Livraison',
+ '/orderHistory': 'Historique des Commandes',
+ '/orderDetails': 'Détails de la Commande',
+ '/': 'Se Connecter',
+ '/mobileOtp': 'Se Connecter',
+ '/cart': 'Panier',
+ '/paymentMode': 'Sélectionner la Méthode de Paiement',
+ feedback: "Retour d'Information"
+}
+
+const topHeaderBlackList: string[] = []
+
+const bottomHeaderBlackList = ['/homePage', '/orderConfirmation']
+
+const menuIconWhiteList = ['/homePage']
+
+const languageIconWhiteList = ['/homePage', '/', '/mobileOtp']
+
+const getHeaderTitleForPage = (name: string, logo: string, pathName: string, locale: string | undefined) => {
+ const values = locale === 'en' ? headerValues : headerValuesFrench
+ switch (true) {
+ case storeHeaderBlackList.includes(pathName):
+ return {values[pathName]}
+ default:
+ return (
+
+
+ {name}
+
+
+ )
+ }
+}
+
+export interface TopHeaderProps {
+ handleMenuClick?: () => void
+}
+
+const TopHeader: React.FC = ({ handleMenuClick }) => {
+ const [isMenuModalOpen, setMenuModalOpen] = useState(false)
+ const { t, locale } = useLanguage()
+ const router = useRouter()
+
+ const handleMenuModalClose = () => {
+ setMenuModalOpen(false)
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+ {languageIconWhiteList.includes(router.pathname) && }
+
+ {menuIconWhiteList.includes(router.pathname) && (
+ setMenuModalOpen(true)}
+ className="block"
+ src="/images/3-dots.svg"
+ alt="menu icon"
+ />
+ )}
+
+ {!homeIconBlackList.includes(router.pathname) && (
+ {
+ // localStorage.clear();
+ // router.push("/");
+ const user = localStorage.getItem('userPhone') as string
+ localStorage.clear()
+ localStorage.setItem('userPhone', user)
+ router.push('/homePage')
+ }}
+ src="/images/Home_icon.svg"
+ alt="home Icon"
+ />
+ )}
+
+
+
+
+ {/* Menu Modal */}
+
+ {
+ router.push('/orderHistory')
+ }}
+ className="flex gap-2 py-5"
+ >
+
+ {t['orderHistory']}
+
+
+ >
+ )
+}
+
+const BottomHeader = () => {
+ const [optionTags, setOptionTags] = useState()
+ const { t, locale } = useLanguage()
+
+ useEffect(() => {
+ setOptionTags(JSON.parse(localStorage.getItem('optionTags') as string))
+ }, [])
+
+ const router = useRouter()
+
+ return (
+
+
+
+
+ {!backIconList.includes(router.pathname) && (
+
router.back()}>
+
+
+ )}
+
+
+ {getHeaderTitleForPage(optionTags?.name, optionTags?.logo, router.pathname, locale)}
+
{!cartIconBlackList.includes(router.pathname)}
+
+
+
+ )
+}
+
+const Header = () => {
+ const router = useRouter()
+
+ const renderTopHeader = !topHeaderBlackList.includes(router.pathname)
+ const renderBottomHeader = !bottomHeaderBlackList.includes(router.pathname)
+
+ return (
+
+ {renderTopHeader && }
+ {renderBottomHeader && }
+
+ )
+}
+
+export default Header
diff --git a/apps/mobility-bap/components/header/language/Language.tsx b/apps/mobility-bap/components/header/language/Language.tsx
new file mode 100644
index 000000000..bdb4a2e63
--- /dev/null
+++ b/apps/mobility-bap/components/header/language/Language.tsx
@@ -0,0 +1,66 @@
+import React, { useEffect, useState } from 'react'
+import { useDispatch } from 'react-redux'
+import { settingBoxActions } from '../../../store/settingBox-slice'
+import { MdLanguage } from 'react-icons/md'
+import { useLanguage } from '../../../hooks/useLanguage'
+import LanguageItem from './LanguageItem'
+
+const Language = () => {
+ const { t, locale } = useLanguage()
+ const dispatch = useDispatch()
+ const [openLang, setOpenLang] = useState(false)
+
+ function onCloseLangBox(isOpen: boolean) {
+ setOpenLang(isOpen)
+ }
+
+ return (
+
+
+
{t.language}
+
+ dispatch(settingBoxActions.closeSettingBox())}
+ />
+ dispatch(settingBoxActions.closeSettingBox())}
+ />
+
+
+
+
setOpenLang(prevState => !prevState)}
+ >
+
{locale === 'en' ? 'En' : 'Fr'}
+
+
+ {openLang ? (
+ <>
+
setOpenLang(false)}
+ >
+
+
+
+
+ >
+ ) : null}
+
+ )
+}
+
+export default Language
diff --git a/apps/mobility-bap/components/header/language/LanguageItem.tsx b/apps/mobility-bap/components/header/language/LanguageItem.tsx
new file mode 100644
index 000000000..4c92b2f93
--- /dev/null
+++ b/apps/mobility-bap/components/header/language/LanguageItem.tsx
@@ -0,0 +1,51 @@
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import React, { useState } from 'react'
+import { useLanguage } from '../../../hooks/useLanguage'
+
+interface Props {
+ language: string
+ onCloseBox: (isLangOpen: boolean) => void
+}
+const LanguageItem: React.FC = ({ language, onCloseBox }) => {
+ const { t, locale } = useLanguage()
+ const router = useRouter()
+ const [lang, setLang] = useState(locale)
+
+ function onChangeHandler(e: React.ChangeEvent) {
+ setLang(e.currentTarget.id)
+ }
+
+ return (
+
+
+ onCloseBox(false)}
+ >
+
+
+ {t[`${language}`]}
+
+
+
+
+ )
+}
+
+export default LanguageItem
diff --git a/apps/mobility-bap/components/header/menu/MegaMenu/ExtraMenu.tsx b/apps/mobility-bap/components/header/menu/MegaMenu/ExtraMenu.tsx
new file mode 100644
index 000000000..94501bdd5
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/MegaMenu/ExtraMenu.tsx
@@ -0,0 +1,30 @@
+import React from 'react'
+import Link from 'next/link'
+import { extraMenu } from '../../../../mock/menuItems'
+import { useLanguage } from '../../../../hooks/useLanguage'
+
+const ExtraMenu = () => {
+ const { t } = useLanguage()
+ return (
+
+ {extraMenu.map(menuItem => {
+ return (
+
+ )
+ })}
+
+ )
+}
+
+export default ExtraMenu
diff --git a/apps/mobility-bap/components/header/menu/MegaMenu/MegaMenu.tsx b/apps/mobility-bap/components/header/menu/MegaMenu/MegaMenu.tsx
new file mode 100644
index 000000000..5fc4236ac
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/MegaMenu/MegaMenu.tsx
@@ -0,0 +1,73 @@
+import React, { useRef } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { megaMenuActions } from '../../../../store/megaMenu-slice'
+import { Transition } from 'react-transition-group'
+import { useLanguage } from '../../../../hooks/useLanguage'
+import { GoGrabber } from 'react-icons/go'
+import MenusContainer from './MenusContainer'
+import { IMegaMenuRootState } from '../../../../lib/types/megaMenu'
+
+const MegaMenu = () => {
+ const nodeRef = useRef(null)
+ const { t } = useLanguage()
+ const dispatch = useDispatch()
+ function showMegaMenuHandler() {
+ dispatch(megaMenuActions.openMegaMenu())
+ }
+ function closeMegaMenuHandler() {
+ dispatch(megaMenuActions.closeMegaMenu())
+ }
+ const isMegaMenuOpen = useSelector((state: IMegaMenuRootState) => state.megaMenu.isMegaMenuOpen)
+
+ return (
+
+
+
+
{t.CategoryOfGoods}
+
+
+
+ {state => {
+ return (
+
+ )
+ }}
+
+
+ )
+}
+
+export default MegaMenu
diff --git a/apps/mobility-bap/components/header/menu/MegaMenu/MenusContainer.tsx b/apps/mobility-bap/components/header/menu/MegaMenu/MenusContainer.tsx
new file mode 100644
index 000000000..aabf263c1
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/MegaMenu/MenusContainer.tsx
@@ -0,0 +1,36 @@
+import React, { useState, useEffect } from 'react'
+import { useDispatch } from 'react-redux'
+import { activeMenuItemActions } from '../../../../store/activeMenuItem-slice'
+import menuItems from '../../../../mock/menuItems'
+import MenuItems from '../../../UI/MenuItems/MenuItems'
+import { IDropDown } from '../../../../lib/types/dropDown'
+import SubMenu from './SubMenu'
+const MenusContainer = () => {
+ const [subMenuItems, setSubMenuItems] = useState()
+ const dispatch = useDispatch()
+ function activeItem(submenuList: IDropDown[] | undefined, activeItemIndex: number, activeItemName: string) {
+ setSubMenuItems(submenuList)
+ dispatch(activeMenuItemActions.setActiveMenuItemIndex(activeItemIndex))
+ dispatch(activeMenuItemActions.setActiveMenuItemText(activeItemName))
+ }
+
+ useEffect(() => {
+ setSubMenuItems(menuItems[0].productsGroup)
+ return () => {
+ dispatch(activeMenuItemActions.setActiveMenuItemIndex(0))
+ dispatch(activeMenuItemActions.setActiveMenuItemText('digital'))
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ return (
+
+
+
+
+
+
+ )
+}
+
+export default MenusContainer
diff --git a/apps/mobility-bap/components/header/menu/MegaMenu/SubMenu.tsx b/apps/mobility-bap/components/header/menu/MegaMenu/SubMenu.tsx
new file mode 100644
index 000000000..acdecc386
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/MegaMenu/SubMenu.tsx
@@ -0,0 +1,94 @@
+import React from 'react'
+import Link from 'next/link'
+import { useLanguage } from '../../../../hooks/useLanguage'
+import { IDropDown } from '../../../../lib/types/dropDown'
+import { useDispatch, useSelector } from 'react-redux'
+import { megaMenuActions } from '../../../../store/megaMenu-slice'
+import { IActiveMenuItemRootState } from '../../../../lib/types/activeMenuItem'
+import { HiChevronRight, HiChevronLeft } from 'react-icons/hi'
+
+interface Props {
+ subMenuItems: IDropDown[] | undefined
+}
+const SubMenu: React.FC = ({ subMenuItems }) => {
+ const { t, locale } = useLanguage()
+ const ArrowDirection = locale === 'en' ? HiChevronRight : HiChevronLeft
+ const dispatch = useDispatch()
+
+ const activeMenuItemText = useSelector((state: IActiveMenuItemRootState) => state.activeMenuItem.activeMenuItemText)
+
+ return (
+
+
+
+
+ {subMenuItems && activeMenuItemText ? (
+ <>
+ {subMenuItems.map((menuTitle, index) => {
+ return (
+
+ )
+ })}
+ >
+ ) : (
+
{t.noProduct}
+ )}
+
+
+ )
+}
+
+export default SubMenu
diff --git a/apps/mobility-bap/components/header/menu/MegaMenu/index.tsx b/apps/mobility-bap/components/header/menu/MegaMenu/index.tsx
new file mode 100644
index 000000000..1b44d45b5
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/MegaMenu/index.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import ExtraMenu from './ExtraMenu'
+import MegaMenu from './MegaMenu'
+
+const index = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default index
diff --git a/apps/mobility-bap/components/header/menu/SideBarMenu/SideBar.tsx b/apps/mobility-bap/components/header/menu/SideBarMenu/SideBar.tsx
new file mode 100644
index 000000000..14a684af8
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/SideBarMenu/SideBar.tsx
@@ -0,0 +1,65 @@
+import React, { useRef } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { sideNavBarActions } from '../../../../store/sideNavBar-slice'
+import { Transition } from 'react-transition-group'
+import { GoGrabber } from 'react-icons/go'
+import { ISideNavBarRootState } from '../../../../lib/types/sidebar'
+import SideNav from './SideNav'
+
+const SideBar = () => {
+ const nodeRef = useRef(null)
+ const dispatch = useDispatch()
+ const isNavbarOpen = useSelector((state: ISideNavBarRootState) => state.sideNavBar.isNavbarOpen)
+ const closeNav = () => {
+ dispatch(sideNavBarActions.closeNavbar())
+ }
+
+ const openNavBar = () => {
+ dispatch(sideNavBarActions.openNavbar())
+ }
+
+ return (
+
+
+
+
+
+ {state => {
+ return (
+ <>
+
+
+ >
+ )
+ }}
+
+
+ )
+}
+
+export default SideBar
diff --git a/apps/mobility-bap/components/header/menu/SideBarMenu/SideNav.tsx b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNav.tsx
new file mode 100644
index 000000000..4c964a90b
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNav.tsx
@@ -0,0 +1,50 @@
+import React, { forwardRef } from 'react'
+import { useRouter } from 'next/router'
+import { IoClose } from 'react-icons/io5'
+import SideNavContent from './SideNavContent'
+import Logo from '../../Logo'
+
+interface Props {
+ state?: string
+ onClose: () => void
+ children?: React.ReactNode
+ ref: React.HTMLProps
+}
+
+const SideNav = forwardRef(({ state, onClose }, ref) => {
+ const { locale } = useRouter()
+ return (
+
+ )
+})
+
+SideNav.displayName = 'SideNav'
+
+export default SideNav
diff --git a/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavContent.tsx b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavContent.tsx
new file mode 100644
index 000000000..0d5595cf3
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavContent.tsx
@@ -0,0 +1,47 @@
+import React from 'react'
+import Link from 'next/link'
+import { useLanguage } from '../../../../hooks/useLanguage'
+import { extraMenu } from '../../../../mock/menuItems'
+import { useDispatch } from 'react-redux'
+import { sideNavBarActions } from '../../../../store/sideNavBar-slice'
+import { activeMenuItemActions } from '../../../../store/activeMenuItem-slice'
+import { IDropDown } from '../../../../lib/types/dropDown'
+import MenuItems from '../../../UI/MenuItems/MenuItems'
+
+const SideNavContent = () => {
+ const { t } = useLanguage()
+ const dispatch = useDispatch()
+ const openNav = (sidebarSideContent: IDropDown[] = [], activeItemName: string, activeItemIndex: number) => {
+ dispatch(sideNavBarActions.setSidebarEntries(sidebarSideContent))
+ dispatch(sideNavBarActions.openSidebar())
+ dispatch(activeMenuItemActions.setActiveMenuItemText(activeItemName))
+ dispatch(activeMenuItemActions.setActiveMenuItemIndex(activeItemIndex))
+ }
+ return (
+
+
+ {extraMenu.map(menuItem => {
+ return (
+
+ )
+ })}
+
+
+
{t.CategoryOfGoods}
+
+
+ )
+}
+
+export default SideNavContent
diff --git a/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavSide.tsx b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavSide.tsx
new file mode 100644
index 000000000..8ee8247cf
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/SideBarMenu/SideNavSide.tsx
@@ -0,0 +1,119 @@
+import React, { useRef } from 'react'
+import { Transition } from 'react-transition-group'
+import { HiOutlineArrowSmRight, HiOutlineArrowSmLeft, HiChevronRight, HiChevronLeft } from 'react-icons/hi'
+import DropDown from '../../../UI/DropDown'
+import { useDispatch, useSelector } from 'react-redux'
+import { sideNavBarActions } from '../../../../store/sideNavBar-slice'
+import { ISideNavBarRootState } from '../../../../lib/types/sidebar'
+import { useLanguage } from '../../../../hooks/useLanguage'
+import Link from 'next/link'
+import { IActiveMenuItemRootState } from '../../../../lib/types/activeMenuItem'
+
+const SideNavSide = () => {
+ const dispatch = useDispatch()
+
+ const dropDownList = useSelector((state: ISideNavBarRootState) => state.sideNavBar.dropDownList)
+
+ const isSidebarOpen = useSelector((state: ISideNavBarRootState) => state.sideNavBar.isSidebarOpen)
+
+ const activeMenuItemText = useSelector((state: IActiveMenuItemRootState) => state.activeMenuItem.activeMenuItemText)
+
+ const closeSidebar = () => {
+ dispatch(sideNavBarActions.closeSidebar())
+ }
+
+ const closeNavbar = () => {
+ dispatch(sideNavBarActions.closeNavbar())
+ }
+
+ const nodeRef = useRef(null)
+ const { t, locale } = useLanguage()
+
+ const BackArrow = locale === 'en' ? HiOutlineArrowSmLeft : HiOutlineArrowSmRight
+
+ return (
+ <>
+ {dropDownList.length ? (
+
+ {state => {
+ return (
+
+
+
+
{t.mainMenu}
+
+
+
+
+
+ {dropDownList.map(item => {
+ return (
+
+
+
+ )
+ })}
+
+ )
+ }}
+
+ ) : null}
+ >
+ )
+}
+
+SideNavSide.displayName = 'SideNavSide'
+export default SideNavSide
diff --git a/apps/mobility-bap/components/header/menu/SideBarMenu/index.tsx b/apps/mobility-bap/components/header/menu/SideBarMenu/index.tsx
new file mode 100644
index 000000000..ee5e76ebb
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/SideBarMenu/index.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import SideBar from './SideBar'
+import SideNavSide from './SideNavSide'
+
+const index = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default index
diff --git a/apps/mobility-bap/components/header/menu/index.tsx b/apps/mobility-bap/components/header/menu/index.tsx
new file mode 100644
index 000000000..8da269e2e
--- /dev/null
+++ b/apps/mobility-bap/components/header/menu/index.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import SideBarMenu from './SideBarMenu'
+import MegaMenu from './MegaMenu'
+
+const index = () => {
+ return (
+ <>
+
+
+ >
+ )
+}
+
+export default index
diff --git a/apps/mobility-bap/components/header/theme/Theme.tsx b/apps/mobility-bap/components/header/theme/Theme.tsx
new file mode 100644
index 000000000..5ab243924
--- /dev/null
+++ b/apps/mobility-bap/components/header/theme/Theme.tsx
@@ -0,0 +1,53 @@
+import React from 'react'
+import { useTheme } from 'next-themes'
+import { MdOutlineLightMode } from 'react-icons/md'
+import { BiMoon } from 'react-icons/bi'
+import { useLanguage } from '../../../hooks/useLanguage'
+import ThemeItem from './ThemeItem'
+const Theme = () => {
+ const { t } = useLanguage()
+
+ const { systemTheme, theme } = useTheme()
+ const currentTheme = theme === 'system' ? systemTheme : theme
+
+ const renderThemeChanger = () => {
+ if (currentTheme === 'dark') {
+ return (
+
+ )
+ } else {
+ return (
+
+ )
+ }
+ }
+
+ return (
+
+
+
{renderThemeChanger()}
+
+ )
+}
+
+export default Theme
diff --git a/apps/mobility-bap/components/header/theme/ThemeItem.tsx b/apps/mobility-bap/components/header/theme/ThemeItem.tsx
new file mode 100644
index 000000000..623514925
--- /dev/null
+++ b/apps/mobility-bap/components/header/theme/ThemeItem.tsx
@@ -0,0 +1,47 @@
+import { useTheme } from 'next-themes'
+import React from 'react'
+import { IconType } from 'react-icons'
+import { useLanguage } from '../../../hooks/useLanguage'
+import { useDispatch, useSelector } from 'react-redux'
+import { settingBoxActions } from '../../../store/settingBox-slice'
+import { ISettingBoxRootState } from '../../../lib/types/settingBox'
+
+interface Props {
+ theme: string
+ currentTheme?: string
+ Icon: IconType
+}
+const ThemeItem: React.FC = ({ theme, Icon, currentTheme }) => {
+ const { t } = useLanguage()
+ const { setTheme } = useTheme()
+ const dispatch = useDispatch()
+ const isSettingBoxOpen = useSelector((state: ISettingBoxRootState) => state.settingBox.isOpen)
+
+ function onThemeClickHandler() {
+ setTheme(theme)
+ isSettingBoxOpen && dispatch(settingBoxActions.closeSettingBox())
+ }
+
+ return (
+
+
+
+
+
{t[`${theme}`]}
+
+ )
+}
+
+export default ThemeItem
diff --git a/apps/mobility-bap/components/header/user/LoginBtn.tsx b/apps/mobility-bap/components/header/user/LoginBtn.tsx
new file mode 100644
index 000000000..3a17e2afd
--- /dev/null
+++ b/apps/mobility-bap/components/header/user/LoginBtn.tsx
@@ -0,0 +1,36 @@
+import React from 'react'
+import { useLanguage } from '../../../hooks/useLanguage'
+import { HiOutlineLogin } from 'react-icons/hi'
+import Link from 'next/link'
+
+const LoginBtn = () => {
+ const { t } = useLanguage()
+ return (
+
+
+
+
+
+ {t.login} | {t.signUp}
+
+
+
+
+
+
+
+ )
+}
+
+export default LoginBtn
diff --git a/apps/mobility-bap/components/header/user/UserAccountBox.tsx b/apps/mobility-bap/components/header/user/UserAccountBox.tsx
new file mode 100644
index 000000000..1cbc4777a
--- /dev/null
+++ b/apps/mobility-bap/components/header/user/UserAccountBox.tsx
@@ -0,0 +1,67 @@
+import Link from 'next/link'
+import React from 'react'
+import { useDispatch } from 'react-redux'
+import { userInfoActions } from '../../../store/user-slice'
+import { useLanguage } from '../../../hooks/useLanguage'
+import { AiOutlineHeart } from 'react-icons/ai'
+import { IoLogOutOutline } from 'react-icons/io5'
+import jsCookie from 'js-cookie'
+
+interface Props {
+ onClose: () => void
+}
+const UserAccountBox: React.FC = ({ onClose }) => {
+ const { t } = useLanguage()
+ const dispatch = useDispatch()
+ function onLogoutClickHandler() {
+ dispatch(userInfoActions.userLogout())
+ jsCookie.remove('userInfo')
+ onClose()
+ }
+ return (
+
+ )
+}
+
+export default UserAccountBox
diff --git a/apps/mobility-bap/components/header/user/UserAccountBtn.tsx b/apps/mobility-bap/components/header/user/UserAccountBtn.tsx
new file mode 100644
index 000000000..2c4a42219
--- /dev/null
+++ b/apps/mobility-bap/components/header/user/UserAccountBtn.tsx
@@ -0,0 +1,60 @@
+import React, { useRef, useState } from 'react'
+import { AiOutlineUser } from 'react-icons/ai'
+import { HiChevronDown } from 'react-icons/hi'
+import { Transition } from 'react-transition-group'
+import UserAccountBox from './UserAccountBox'
+
+const UserAccountBtn = () => {
+ const [isUserBoxOpen, setIsUserBoxOpen] = useState(false)
+ const nodeRef = useRef(null)
+
+ function onClose() {
+ setIsUserBoxOpen(prev => prev && false)
+ }
+
+ function onIconClickHandler() {
+ setIsUserBoxOpen(prev => !prev)
+ }
+
+ return (
+
+
+
+ {state => {
+ return (
+ <>
+
+
+
+
+ >
+ )
+ }}
+
+
+ )
+}
+
+export default UserAccountBtn
diff --git a/apps/mobility-bap/components/header/user/index.tsx b/apps/mobility-bap/components/header/user/index.tsx
new file mode 100644
index 000000000..ceaf66bef
--- /dev/null
+++ b/apps/mobility-bap/components/header/user/index.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import { useSelector } from 'react-redux'
+import { IUserInfoRootState } from '../../../lib/types/user'
+import UserAccountBtn from './UserAccountBtn'
+import LoginBtn from './LoginBtn'
+
+const User = () => {
+ const userInfo = useSelector((state: IUserInfoRootState) => state.userInfo.userInformation)
+ return {userInfo ? : }
+}
+
+export default User
diff --git a/apps/mobility-bap/components/layout/Layout.tsx b/apps/mobility-bap/components/layout/Layout.tsx
new file mode 100644
index 000000000..12d6f3c1b
--- /dev/null
+++ b/apps/mobility-bap/components/layout/Layout.tsx
@@ -0,0 +1,73 @@
+import React from 'react'
+import { Provider } from 'react-redux'
+import Head from 'next/head'
+import { ThemeProvider } from 'next-themes'
+import { useRouter } from 'next/router'
+import Header from '../header'
+import store from '../../store/index'
+import Footer from '../footer'
+import { ToastContainer } from 'react-toastify'
+import { useLanguage } from '../../hooks/useLanguage'
+import NextNProgress from 'nextjs-progressbar'
+import cs from 'classnames'
+
+const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
+ const { locale } = useLanguage()
+ const router = useRouter()
+ const isHomepage = router.pathname === '/homePage'
+ const isSearch = router.pathname === '/search'
+ const paddingStyles = 'px-5 xl:px-16'
+ const marginStyles = 'mt-[100px]'
+
+ return (
+
+
+
+ Open Street Commerce
+
+
+
+
+
+ {children}
+
+ {/* */}
+
+
+
+
+ )
+}
+
+export default Layout
diff --git a/apps/mobility-bap/components/loader/Loader.tsx b/apps/mobility-bap/components/loader/Loader.tsx
new file mode 100644
index 000000000..885042bf1
--- /dev/null
+++ b/apps/mobility-bap/components/loader/Loader.tsx
@@ -0,0 +1,34 @@
+import { Spinner, Text } from '@chakra-ui/react'
+import React from 'react'
+
+interface LoaderPropsModel {
+ loadingText?: string
+ subLoadingText?: string
+ stylesForLoadingText?: React.CSSProperties
+}
+
+const Loader: React.FC = props => {
+ return (
+
+
+ {props.loadingText && (
+
+ {props.loadingText}
+
+ )}
+ {props.subLoadingText && {props.subLoadingText} }
+
+ )
+}
+
+export default React.memo(Loader)
diff --git a/apps/mobility-bap/components/starRating/StarRating.tsx b/apps/mobility-bap/components/starRating/StarRating.tsx
new file mode 100644
index 000000000..7ec8f6e7e
--- /dev/null
+++ b/apps/mobility-bap/components/starRating/StarRating.tsx
@@ -0,0 +1,53 @@
+import { Box, Text } from '@chakra-ui/react'
+import React, { useState } from 'react'
+import { FaStar } from 'react-icons/fa'
+
+export interface StarRatingProps {
+ rating: number
+ setRating: (rating: number) => void
+ count?: number
+ size?: number
+ transition: string
+ ratingText: string
+}
+
+const StarRating: React.FC = props => {
+ const [hover, setHover] = useState(null)
+
+ return (
+
+ {props.ratingText}
+
+ {[...Array(props.count || 5)].map((star, index) => {
+ const ratingValue = index + 1
+ return (
+ setHover(ratingValue)}
+ onMouseLeave={() => setHover(null)}
+ >
+ props.setRating(ratingValue)}
+ value={ratingValue}
+ style={{
+ display: 'none'
+ }}
+ />
+
+
+ )
+ })}
+
+
+ )
+}
+export default StarRating
diff --git a/apps/mobility-bap/global.d.ts b/apps/mobility-bap/global.d.ts
new file mode 100644
index 000000000..ba29177a1
--- /dev/null
+++ b/apps/mobility-bap/global.d.ts
@@ -0,0 +1,5 @@
+interface Date {
+ addDays: (days: number) => Date
+}
+
+//to fix error that when I want to add function (addDays) to Date.prototype, happen.
diff --git a/apps/mobility-bap/hooks/useCountdown.tsx b/apps/mobility-bap/hooks/useCountdown.tsx
new file mode 100644
index 000000000..0fd5d782c
--- /dev/null
+++ b/apps/mobility-bap/hooks/useCountdown.tsx
@@ -0,0 +1,38 @@
+import { useEffect, useState } from 'react'
+
+Date.prototype.addDays = function (days: number): Date {
+ var date = new Date(this.valueOf())
+ date.setDate(date.getDate() + days)
+ return date
+}
+
+var date = new Date()
+
+const getReturnValues = (countDown: number) => {
+ // calculate time left
+ const days = Math.floor(countDown / (1000 * 60 * 60 * 24))
+ const hours = Math.floor((countDown % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
+ const minutes = Math.floor((countDown % (1000 * 60 * 60)) / (1000 * 60))
+ const seconds = Math.floor((countDown % (1000 * 60)) / 1000)
+
+ return [days, hours, minutes, seconds]
+}
+
+const useCountdown = (targetDate: number) => {
+ var expireDate = date.addDays(targetDate)
+ const countDownDate = new Date(expireDate).getTime()
+
+ const [countDown, setCountDown] = useState(countDownDate - new Date().getTime())
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setCountDown(countDownDate - new Date().getTime())
+ }, 1000)
+
+ return () => clearInterval(interval)
+ }, [countDownDate])
+
+ return getReturnValues(countDown)
+}
+
+export { useCountdown }
diff --git a/apps/mobility-bap/hooks/useDebounce.tsx b/apps/mobility-bap/hooks/useDebounce.tsx
new file mode 100644
index 000000000..f22a669af
--- /dev/null
+++ b/apps/mobility-bap/hooks/useDebounce.tsx
@@ -0,0 +1,19 @@
+import { useState, useEffect } from 'react'
+
+const useDebounce = (value: string, delay: number): string => {
+ const [debouncedValue, setDebouncedValue] = useState(value)
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setDebouncedValue(value)
+ }, delay)
+
+ return () => {
+ clearTimeout(timer)
+ }
+ }, [value, delay])
+
+ return debouncedValue
+}
+
+export default useDebounce
diff --git a/apps/mobility-bap/hooks/useExchangeRateGBPToIRR.tsx b/apps/mobility-bap/hooks/useExchangeRateGBPToIRR.tsx
new file mode 100644
index 000000000..f7dfbf852
--- /dev/null
+++ b/apps/mobility-bap/hooks/useExchangeRateGBPToIRR.tsx
@@ -0,0 +1,39 @@
+import { useEffect, useState } from 'react'
+import { irrCurrencyFormat } from '../utilities/currencyFormat'
+
+const API_KEY = '230967b967bfa5f86ca99d6c'
+const URL = `https://v6.exchangerate-api.com/v6/${API_KEY}/pair/GBP/IRR`
+
+export const useExchangeRateGBPToIRR = (price: number) => {
+ const [exchangePrice, setExchangePrice] = useState(0)
+ const hardRateExchange = 52230.27 // each Pound into Rial
+ useEffect(() => {
+ const fetchExchangeRate = async () => {
+ try {
+ const result = await fetch(`${URL}/${price}`)
+ if (result.ok) {
+ const data = await result.json()
+ const irToman = Math.floor(data.conversion_result / 1000) * 1000 //common currency in Iran
+ setExchangePrice(irToman)
+ } else {
+ const priceWithHardRateExchange = price * hardRateExchange
+ const irToman = Math.floor(priceWithHardRateExchange / 1000) * 1000
+ setExchangePrice(irToman)
+ throw new Error()
+ }
+ } catch (e) {
+ console.log(
+ `⚠ Error: the server responded with a status of 429 ()=> free account has reached the number of requests allowed by free plan and price exchange is based on hard number`
+ )
+ }
+ }
+ if (price > 0) {
+ // fetchExchangeRate();
+ const priceWithHardRateExchange = price * hardRateExchange
+ const irToman = Math.ceil(priceWithHardRateExchange / 1000) * 1000
+ setExchangePrice(irToman)
+ }
+ }, [price])
+
+ return irrCurrencyFormat(exchangePrice)
+}
diff --git a/apps/mobility-bap/hooks/useLanguage.tsx b/apps/mobility-bap/hooks/useLanguage.tsx
new file mode 100644
index 000000000..f30556c73
--- /dev/null
+++ b/apps/mobility-bap/hooks/useLanguage.tsx
@@ -0,0 +1,9 @@
+import { useRouter } from 'next/router'
+import en from '../locales/en'
+import fa from '../locales/fa'
+
+export const useLanguage = () => {
+ const { locale } = useRouter()
+ const t = locale === 'en' ? en : fa
+ return { t, locale }
+}
diff --git a/apps/mobility-bap/hooks/useLocalStorage.tsx b/apps/mobility-bap/hooks/useLocalStorage.tsx
new file mode 100644
index 000000000..0a82af44f
--- /dev/null
+++ b/apps/mobility-bap/hooks/useLocalStorage.tsx
@@ -0,0 +1,25 @@
+import { useState, useEffect } from 'react'
+
+type ValueSetter = (value: T | ((prevValue: T) => T)) => void
+
+export function useLocalStorage(key: string, initialValue: T): [T, ValueSetter] {
+ const [storedValue, setStoredValue] = useState(() => {
+ try {
+ const item = window.localStorage.getItem(key)
+ return item ? JSON.parse(item) : initialValue
+ } catch (error) {
+ console.error(`Error retrieving localStorage item ${key}:`, error)
+ return initialValue
+ }
+ })
+
+ useEffect(() => {
+ try {
+ window.localStorage.setItem(key, JSON.stringify(storedValue))
+ } catch (error) {
+ console.error(`Error setting localStorage item ${key}:`, error)
+ }
+ }, [key, storedValue])
+
+ return [storedValue, setStoredValue]
+}
diff --git a/apps/mobility-bap/hooks/useRequest.tsx b/apps/mobility-bap/hooks/useRequest.tsx
new file mode 100644
index 000000000..29ec9c534
--- /dev/null
+++ b/apps/mobility-bap/hooks/useRequest.tsx
@@ -0,0 +1,29 @@
+import { useState } from 'react'
+import axios from 'axios'
+import { ResponseModel } from '../lib/types/responseModel'
+
+const useRequest = () => {
+ const [data, setData] = useState<(ResponseModel & ResponseModel[]) | null>(null)
+ const [loading, setLoading] = useState(false)
+ const [error, setError] = useState('')
+
+ const fetchData = async (url: string, method = 'POST', payLoad: any = null) => {
+ try {
+ setLoading(true)
+ const response = await axios.request({
+ url,
+ method,
+ data: payLoad
+ })
+ setData(response.data)
+ } catch (error: any) {
+ setError(error.message)
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ return { data, loading, error, fetchData }
+}
+
+export default useRequest
diff --git a/apps/mobility-bap/hooks/useWindowDimensions.tsx b/apps/mobility-bap/hooks/useWindowDimensions.tsx
new file mode 100644
index 000000000..106af28f2
--- /dev/null
+++ b/apps/mobility-bap/hooks/useWindowDimensions.tsx
@@ -0,0 +1,35 @@
+import { useState, useEffect } from 'react'
+
+export function useWindowDimensions() {
+ let width, height
+ if (typeof window !== 'undefined') {
+ width = window.innerWidth
+ height = window.innerHeight
+ } else {
+ width = 0
+ height = 0
+ }
+
+ const [windowDimensions, setWindowDimensions] = useState({
+ width,
+ height
+ })
+
+ useEffect(() => {
+ function getWindowDimensions() {
+ const { innerWidth: width, innerHeight: height } = window
+ return {
+ width,
+ height
+ }
+ }
+ function handleResize() {
+ setWindowDimensions(getWindowDimensions())
+ }
+
+ window.addEventListener('resize', handleResize)
+ return () => window.removeEventListener('resize', handleResize)
+ }, [])
+
+ return windowDimensions
+}
diff --git a/apps/mobility-bap/lib/client.ts b/apps/mobility-bap/lib/client.ts
new file mode 100644
index 000000000..e1e9f4529
--- /dev/null
+++ b/apps/mobility-bap/lib/client.ts
@@ -0,0 +1,16 @@
+import sanityClient from '@sanity/client'
+import imageUrlBuilder from '@sanity/image-url'
+
+//connect to sanity
+export const client = sanityClient({
+ projectId: '3c4n15ly',
+ dataset: 'production',
+ apiVersion: '2022-06-04',
+ useCdn: true,
+ token: process.env.NEXT_PUBLIC_SANITY_TOKEN
+})
+
+//be able to use sanity images
+const builder = imageUrlBuilder(client)
+
+export const urlFor = (source: any) => builder.image(source)
diff --git a/apps/mobility-bap/lib/config.ts b/apps/mobility-bap/lib/config.ts
new file mode 100644
index 000000000..1a294571c
--- /dev/null
+++ b/apps/mobility-bap/lib/config.ts
@@ -0,0 +1,5 @@
+const config = {
+ projectId: '3c4n15ly',
+ dataset: 'production'
+}
+export default config
diff --git a/apps/mobility-bap/lib/types/activeMenuItem.ts b/apps/mobility-bap/lib/types/activeMenuItem.ts
new file mode 100644
index 000000000..c7c376833
--- /dev/null
+++ b/apps/mobility-bap/lib/types/activeMenuItem.ts
@@ -0,0 +1,8 @@
+export interface IActiveMenuItem {
+ activeMenuItemIndex: number
+ activeMenuItemText: string
+}
+
+export interface IActiveMenuItemRootState {
+ activeMenuItem: IActiveMenuItem
+}
diff --git a/apps/mobility-bap/lib/types/breadcrumb.ts b/apps/mobility-bap/lib/types/breadcrumb.ts
new file mode 100644
index 000000000..7406360ef
--- /dev/null
+++ b/apps/mobility-bap/lib/types/breadcrumb.ts
@@ -0,0 +1,4 @@
+export interface IBreadcrumb {
+ breadcrumb: string
+ href: string
+}
diff --git a/apps/mobility-bap/lib/types/cart.ts b/apps/mobility-bap/lib/types/cart.ts
new file mode 100644
index 000000000..f0233b1ec
--- /dev/null
+++ b/apps/mobility-bap/lib/types/cart.ts
@@ -0,0 +1,61 @@
+import { IProductDetails, RetailItem, TSlug } from './products'
+
+export interface ICartProduct {
+ image: any
+ name: string
+ slug: TSlug
+ price: number
+ discount?: number
+ brand: string
+ category: string[]
+ starRating: number
+ isOffer?: boolean
+ details?: IProductDetails[]
+ registerDate?: string
+ quantity: number
+ totalPrice: number
+}
+
+export interface CartRetailItem extends RetailItem {
+ quantity: number
+ totalPrice: number
+}
+
+export interface CartItemForRequest extends CartRetailItem {
+ bpp_id: string
+ bpp_uri: string
+ providerId: string
+ locations: any
+}
+
+// export interface
+
+export interface ICartUI {
+ cartBoxIsVisible: boolean
+}
+
+export interface ICart {
+ items: CartRetailItem[]
+ totalQuantity: number
+ totalAmount: number
+}
+
+export type ItemPerBpp = Record
+
+//RootState interface => use for state type in useSelector hook
+
+export interface ICartUiRootState {
+ cartUi: ICartUI
+}
+
+export interface ICartRootState {
+ cart: ICart
+}
+
+export interface TransactionIdRootState {
+ transactionId: string
+}
+
+export interface DataPerBpp {
+ [key: string]: CartItemForRequest[]
+}
diff --git a/apps/mobility-bap/lib/types/categories.ts b/apps/mobility-bap/lib/types/categories.ts
new file mode 100644
index 000000000..2caf51ead
--- /dev/null
+++ b/apps/mobility-bap/lib/types/categories.ts
@@ -0,0 +1,8 @@
+import { TSlug } from './products'
+
+export interface ICategory {
+ title: string
+ slug: TSlug
+ description?: string
+ parents?: any
+}
diff --git a/apps/mobility-bap/lib/types/dropDown.ts b/apps/mobility-bap/lib/types/dropDown.ts
new file mode 100644
index 000000000..8028e0735
--- /dev/null
+++ b/apps/mobility-bap/lib/types/dropDown.ts
@@ -0,0 +1,5 @@
+export interface IDropDown {
+ title: string
+ url?: string
+ subtitles: string[]
+}
diff --git a/apps/mobility-bap/lib/types/favorite.ts b/apps/mobility-bap/lib/types/favorite.ts
new file mode 100644
index 000000000..969383cc8
--- /dev/null
+++ b/apps/mobility-bap/lib/types/favorite.ts
@@ -0,0 +1,8 @@
+import { RetailItem } from './products'
+export interface IFavorite {
+ items: RetailItem[]
+}
+
+export interface IFavoriteRootState {
+ favorite: IFavorite
+}
diff --git a/apps/mobility-bap/lib/types/megaMenu.ts b/apps/mobility-bap/lib/types/megaMenu.ts
new file mode 100644
index 000000000..e0d524d60
--- /dev/null
+++ b/apps/mobility-bap/lib/types/megaMenu.ts
@@ -0,0 +1,7 @@
+export interface IMegaMenuShow {
+ isMegaMenuOpen: boolean
+}
+
+export interface IMegaMenuRootState {
+ megaMenu: IMegaMenuShow
+}
diff --git a/apps/mobility-bap/lib/types/offerProductsState.ts b/apps/mobility-bap/lib/types/offerProductsState.ts
new file mode 100644
index 000000000..f2afa2b29
--- /dev/null
+++ b/apps/mobility-bap/lib/types/offerProductsState.ts
@@ -0,0 +1,5 @@
+import { IProduct } from './products'
+
+export interface IOfferProducts {
+ specialOfferProducts: IProduct[] | []
+}
diff --git a/apps/mobility-bap/lib/types/pagePathsParams.ts b/apps/mobility-bap/lib/types/pagePathsParams.ts
new file mode 100644
index 000000000..bfc4f4a05
--- /dev/null
+++ b/apps/mobility-bap/lib/types/pagePathsParams.ts
@@ -0,0 +1,21 @@
+export interface ICategoryPathsParams {
+ category: string
+}
+
+export interface ISubCategoryPathsParams {
+ category: string
+ subCategory: string
+}
+
+export interface ITitlePathsParams {
+ category: string
+ subCategory: string
+ title: string
+}
+
+export interface ISlugPathsParams {
+ slug: { current: string }
+ category: string
+ subCategory: string
+ title: string
+}
diff --git a/apps/mobility-bap/lib/types/productList.ts b/apps/mobility-bap/lib/types/productList.ts
new file mode 100644
index 000000000..68b4d9770
--- /dev/null
+++ b/apps/mobility-bap/lib/types/productList.ts
@@ -0,0 +1,9 @@
+import { RetailItem } from './products'
+
+export interface IProductList {
+ productsList: RetailItem[] | []
+}
+
+export interface IProductListRootState {
+ sortedProductsList: IProductList
+}
diff --git a/apps/mobility-bap/lib/types/products.ts b/apps/mobility-bap/lib/types/products.ts
new file mode 100644
index 000000000..f40aae382
--- /dev/null
+++ b/apps/mobility-bap/lib/types/products.ts
@@ -0,0 +1,110 @@
+export interface IProductDetails {
+ processor?: string
+ screen?: string
+ operating_system?: string
+ ram?: string
+ ssd?: string
+ ports?: string
+ graphic?: string
+ warranty?: string
+ back_camera?: string
+ front_camera?: string
+ battery?: string
+ frequency_response?: string
+ microphone?: boolean
+ wireless?: boolean
+ wireless_standby_time?: boolean
+ connectionType?: string[]
+ connectors?: string[]
+ bluetooth?: boolean
+ noise_cancelling?: boolean
+ sound_isolating?: boolean
+}
+
+export type TSlug = {
+ _type: string
+ current: string
+}
+
+export type TImage = {
+ _key: string
+ _type: 'image'
+ asset: {
+ _ref: string
+ _type: 'reference'
+ }
+}
+
+export interface IProduct {
+ image: any
+ name: string
+ slug: TSlug
+ price: number
+ discount?: number
+ details?: IProductDetails[]
+ brand: string
+ category: string[]
+ isOffer?: boolean
+ registerDate?: string
+ timeStamp?: number
+ starRating: number
+}
+
+/**
+ * New types for the retail
+ */
+
+export interface RetailItem {
+ extended_attributes?: any
+ price: {
+ listed_value?: string
+ currency?: string
+ value: string
+ }
+ matched?: boolean
+ id: string
+ descriptor: {
+ images: string[]
+ name: string
+ short_desc: string
+ long_desc: string
+ }
+ location_id?: string
+ recommended?: boolean
+ tags: {
+ fulfillment_start_loc?: string
+ Category?: string
+ Trekking?: string
+ Himalayas?: string
+ fulfillment_end_time?: string
+ Country?: string
+ Ladakh?: string
+ Treks?: string
+ Package?: string
+ Leh?: string
+ fulfillment_end_loc?: string
+ authorName: string
+ rating: string
+ foodType?: string
+ }
+}
+
+export interface IndustryItem {
+ extended_attributes?: any
+ price: {
+ currency?: string
+ value: string
+ }
+ id: string
+ descriptor: {
+ images: string[]
+ name: string
+ short_desc: string
+ long_desc: string
+ }
+ tags: {
+ assembly?: string
+ automated?: string
+ }
+ bppName?: string
+}
diff --git a/apps/mobility-bap/lib/types/responseModel.ts b/apps/mobility-bap/lib/types/responseModel.ts
new file mode 100644
index 000000000..048c64863
--- /dev/null
+++ b/apps/mobility-bap/lib/types/responseModel.ts
@@ -0,0 +1,23 @@
+export interface RetailContext {
+ action?: string
+ bap_id?: string
+ bap_uri?: string
+ bpp_id: string
+ bpp_uri: string
+ city?: string
+ core_version?: string
+ country?: string
+ domain?: string
+ max_callbacks?: number
+ message_id?: string
+ timestamp?: string
+ transaction_id: string
+ ttl?: string
+}
+
+export interface ResponseModel {
+ context: RetailContext
+ message: any
+ // Hacky fix
+ name: string
+}
diff --git a/apps/mobility-bap/lib/types/search.ts b/apps/mobility-bap/lib/types/search.ts
new file mode 100644
index 000000000..fc0c8e241
--- /dev/null
+++ b/apps/mobility-bap/lib/types/search.ts
@@ -0,0 +1,4 @@
+export interface SearchBarPropsModel {
+ searchString: string | string[] | undefined
+ handleChange: Function
+}
diff --git a/apps/mobility-bap/lib/types/settingBox.ts b/apps/mobility-bap/lib/types/settingBox.ts
new file mode 100644
index 000000000..87cb00502
--- /dev/null
+++ b/apps/mobility-bap/lib/types/settingBox.ts
@@ -0,0 +1,7 @@
+export interface ISettingBox {
+ isOpen: boolean
+}
+
+export interface ISettingBoxRootState {
+ settingBox: ISettingBox
+}
diff --git a/apps/mobility-bap/lib/types/sidebar.ts b/apps/mobility-bap/lib/types/sidebar.ts
new file mode 100644
index 000000000..390a42db1
--- /dev/null
+++ b/apps/mobility-bap/lib/types/sidebar.ts
@@ -0,0 +1,11 @@
+import { IDropDown } from './dropDown'
+
+export interface ISideNavBar {
+ isSidebarOpen: boolean
+ isNavbarOpen: boolean
+ dropDownList: IDropDown[]
+}
+
+export interface ISideNavBarRootState {
+ sideNavBar: ISideNavBar
+}
diff --git a/apps/mobility-bap/lib/types/user.ts b/apps/mobility-bap/lib/types/user.ts
new file mode 100644
index 000000000..a6c0ac3f6
--- /dev/null
+++ b/apps/mobility-bap/lib/types/user.ts
@@ -0,0 +1,18 @@
+export interface IUser {
+ _id?: any
+ name?: string
+ password?: string
+ email: string
+ isAdmin?: boolean
+ token?: string
+}
+
+export interface IUserInfo {
+ userInformation: IUser | null
+}
+
+//RootState interface=> used for state type in useSelector hook
+
+export interface IUserInfoRootState {
+ userInfo: IUserInfo
+}
diff --git a/apps/mobility-bap/locales/en.ts b/apps/mobility-bap/locales/en.ts
new file mode 100644
index 000000000..9b97656cc
--- /dev/null
+++ b/apps/mobility-bap/locales/en.ts
@@ -0,0 +1,361 @@
+const en: { [key: string]: string } = {
+ mainPage: 'ZiShop Main Page',
+ search: 'Search',
+ login: 'Login',
+ logout: 'Logout',
+ favorites: 'Favorites',
+ delete: 'Delete',
+ thereAreNoFavorites: 'currently, there are no favorite items',
+ signIn: 'Sign in',
+ seeCart: 'See Cart',
+ product: 'Product',
+ totalAmount: 'Total Amount',
+ totalQuantity: 'Total Quantity',
+ payableAmount: 'Payable Amount',
+ loginAndOrder: 'Login and Order',
+ orderSummary: 'Order Summary',
+ cartIsEmpty: 'Cart is empty',
+ categories: 'Categories',
+ seeAllProduct: 'See All product in this category',
+ offer: 'Offers and Discounts',
+ bestSells: 'The Best-Sells',
+ mainMenu: 'Main Menu',
+ language: 'Language: ',
+ fa: 'français - Fr',
+ en: 'English - En',
+ theme: 'Theme: ',
+ dark: 'Dark',
+ light: 'Light',
+ digital: 'Digital',
+ laptop: 'Laptop and Accessories',
+ asus: 'Asus',
+ apple: 'Apple',
+ dell: 'Dell',
+ lenovo: 'Lenovo',
+ samsung: 'Samsung',
+ hp: 'HP',
+ huawei: 'HUAWEI',
+ acer: 'Acer',
+ msi: 'MSI',
+ mobile: 'Mobile and Accessories',
+ nokia: 'Nokia',
+ xiaomi: 'Xiaomi',
+ motorola: 'Motorola',
+ lg: 'LG',
+ sony: 'Sony',
+ computer: 'Computer and Accessories',
+ monitor: 'Monitor',
+ mouse: 'Mouse',
+ keyboard: 'Keyboard',
+ hard: 'Hard, Flash memory and SSD',
+ other: 'Other',
+ tablet: 'Tablet',
+ powerBank: 'Power Bank',
+ speaker: 'Bluetooth Speaker and wire',
+ headphones: 'Headphone, Headset and Hands free',
+ fashion: 'Fashion and Clothes',
+ women: "Women's Fashion",
+ dress: 'Dress',
+ skirt: 'Skirt',
+ jeans: 'Jeans',
+ pants: 'Pants',
+ tShirt: 'T-shirt',
+ scarf: 'Scarf',
+ shirt: 'Shirt',
+ tie: 'Tie',
+ overalls: 'Overalls',
+ mittens: 'Mittens',
+ babyApron: 'Baby Apron',
+ shoes: 'Shoes',
+ watch: 'Watch',
+ wallet: 'Wallet',
+ hat: 'Hat',
+ belt: 'Belt',
+ men: "Men's Fashion",
+ child: "Child's Fashion",
+ toys: 'Toys and Baby',
+ cosmetic: 'Cosmetic',
+ home: 'Furniture and kitchen',
+ stationery: 'Books, Stationery and Art',
+ noProduct: 'There are no products in this category yet! New products will be added soon.',
+ digitalBT: 'Have the best Experiences',
+ digitalBD:
+ 'We provide the best Experience with the most popular Brands. With a warranty of 18 months, you can be confident in your choice',
+ stationeryBT: 'Variety in choice',
+ stationeryBD:
+ 'When it comes to Beauty and Efficiency. We specialize in providing stationery and office sets that are beautiful and high quality.',
+ toyBT: 'Entertainment and the growth of Creativity',
+ toyBD: 'Products with the best quality and anti-allergy to create happy moments',
+ houseBT: 'Modern Home',
+ houseBD:
+ 'enjoy beautiful moments of satisfaction and peace with your loved ones at home with products designed according to the most recent and prominent styles.',
+ fashionBT: 'Beauty and Comfort',
+ fashionBD:
+ 'You will find the best fabrics, the hottest designs, and the most popular brands at reasonable prices. Look your best and stand out among the crowd.',
+ beautyBT: 'Accentuates your Beauty',
+ beautyBD:
+ 'allergen-free, people with all skin types can find products they need. Approved by the World Health Organization, products from world-renowned brands.',
+ deliver: 'express delivery',
+ cash: 'payment on the spot',
+ support: '24/7 support',
+ warrantyBenefit: 'Guarantee the originality',
+ return: 'commodity-back guarantee',
+ offers: 'Special Offers',
+ newest: 'Newest Goods',
+ seeAll: 'See All',
+ specialSale: 'Special Sale',
+ seeAllNewProducts: 'See All New Products',
+ digitalCategoryDescription: 'We offer the newest products at the most competitive prices',
+ fashionCategoryDescription: 'The most popular brands with the most reasonable prices',
+ beautyCategoryDescription: 'Anti-allergy products suitable for all skin types from reputable brands',
+ sportCategoryDescription: 'High-quality and durable products',
+ houseCategoryDescription: 'In accordance with the designs of the day',
+ toyCategoryDescription: 'A combination of entertainment and creativity',
+ stationeryCategoryTitle: 'Books, Stationery and Art',
+ stationeryCategoryDescription: 'Variety in choice',
+ seeAllProducts: 'See All Products',
+ expireDiscount: 'Discount for this Product was Expire.',
+ days: 'Days',
+ hours: 'Hours',
+ mins: 'Mins',
+ seconds: 'Seconds',
+ larisaTitle: 'Larissa Furniture',
+ larisaDescription:
+ 'Larissa beautiful sofa with its private design can give a unique beauty to your reception decoration.',
+ byNow: 'Add to cart',
+ see: 'See Product',
+ romanoTitle: 'Romano furniture',
+ romanoDescription: 'Romano sofa has an impressive beauty and can multiply the charm of your home decoration.',
+ popularBrands: 'Popular Brands',
+ zishopMap: 'Zishop Map',
+ aboutUs: 'About Us',
+ contactUs: 'Contact Us',
+ saleInZishop: 'Sale In Zishop',
+ careerOpportunities: 'Career Opportunities',
+ customerServices: 'Customer Services',
+ commonQuestions: 'Common Questions',
+ returnProcedures: 'Return Procedures',
+ privacy: 'Privacy',
+ shoppingGuide: 'Shopping Guide',
+ howToPlaceAnOrder: 'How To Place An Order?',
+ orderSubmissionProcedure: 'Order Submission Procedure',
+ paymentMethods: 'Payment Methods',
+ beWithUs: 'Be With Us!',
+ emailRegister: 'Stay up to date with the latest discounts by emailing us',
+ yourEmail: 'Please Enter Your Email',
+ register: 'Register',
+ copyRight: '© 2022 ZiShop. All rights reserved - Designed and Developed with ',
+ sort: 'Sort based on: ',
+ all: 'All',
+ newestProducts: 'Newest',
+ cheapest: 'Cheapest',
+ popular: 'The Most Popular',
+ expensive: 'Most Expensive',
+ details: 'Product Details',
+ back_camera: 'Main Camera',
+ battery: 'Battery',
+ front_camera: 'Front Camera',
+ operating_system: 'Operating System',
+ processor: 'CPU',
+ ram: 'RAM',
+ screen: 'Screen',
+
+ resolution: 'Resolution',
+ display_type: 'Display Type',
+ viewing_angle: 'Viewing Angle',
+ response_time: 'Response Time',
+ refresh_rate: 'Refresh Rate',
+ panel_technology: 'Panel Technology',
+ input_output_types: 'Input/Output Types',
+
+ true: 'Yes',
+ false: 'No',
+ bluetooth: 'Bluetooth',
+ frequency_response: 'Frequency Response',
+ sound_isolating: 'Sound Isolating',
+ microphone: 'Microphone',
+ noise_cancelling: 'Noise Cancelling',
+ wireless: 'Wireless',
+ wireless_standby_time: 'Battery life in standby mode',
+ connectionType: 'Connection Type',
+ connectors: 'Connectors',
+
+ multimedia_keys: 'Multimedia Keys',
+ number_of_buttons: 'Number Of Buttons(Including Scroll Wheel)',
+ width: 'Width',
+ height: 'Height',
+ depth: 'Depth',
+ curved: 'Curved',
+ built_in_speakers: 'Built-in Speakers',
+ mechanical_keys: 'Mechanical Keys',
+ backlit_keys: 'Backlit Keys',
+ ergonomic_design: 'Ergonomic Design',
+ designed_for_gaming: 'Designed For Gaming',
+
+ graphic: 'Graphic',
+ ports: 'Ports',
+ ssd: 'SSD Hard',
+ warranty: 'Warranty',
+ addToCart: 'Add to Cart',
+ stars: 'Star',
+ price: 'Product price',
+ similarProducts: 'You May Be Interested In',
+ cart: 'Shopping Cart',
+ hi: 'Hi!',
+ loginExplanation:
+ 'Besides registering, you can also test the template with test account information(email: test@info.com - Password: 123456)',
+ testAccount: 'test account',
+ userName: 'User Name',
+ password: 'Password',
+ email: 'Email',
+ enterYourUserName: 'Please Enter Your UserName',
+ enterYourPassword: 'Please Enter Your Password',
+ enterYourEmail: 'Please Enter Your Email',
+ doHaveAnAccount: "Don't You Have An Account? ",
+ alreadyHaveAnAccount: 'Already You Have An Account? ',
+ signUp: 'Sign Up',
+ Invalid_email_or_password: 'Invalid email or password',
+ Email_already_exists: 'Email already exists',
+ aboutLongText:
+ 'The ZShop store template was written to consolidate my front-end knowledge, using technologies such as Nextjs, Typescript, React, Tailwindcss, etc. as a portfolio. I would like to thank CafeDX and engineer Seyed Mehdi Hasanpour for his support.',
+ aboutEnjoy: 'I hope you enjoy watching and working with this template.',
+ myName: 'Kehyshow',
+ cafeDX: 'Work is meant to improve life, not the opposite.',
+ productAddedToCartMsg: 'Product added to cart successfully',
+ /**
+ * New strings that are added
+ */
+
+ BrowseByCategory: 'Browse by Category',
+ meatAndFish: 'Meat & Fish',
+ fruitsVegetablesTitle: 'Fruits and Vegetables',
+ frozenFood: 'Frozen Food',
+ beverages: 'Beverages',
+ snacks: 'Snacks',
+ dairy: 'Dairy',
+ cashOnDelivery: 'Cash on Delivery',
+ selectPaymentMethod: 'Select payment method',
+ orderDetails: 'Order details',
+ trackOrder: 'Track Order',
+ proceedToPay: 'Proceed',
+ proceedToCheckout: 'Proceed to Checkout',
+ backToHome: 'Go back to home',
+ contactSupport: 'Contact Support',
+ orderDeliveredOnTime: 'Order Delivered on time!',
+ shareYourfeedback: 'Please share your feedback with us',
+ submitReview: 'Submit Review',
+ skipForNow: 'Skip for now',
+ orderConfirmed: 'Order Confirmed',
+ orderConfirmedMssg: 'ABC Mart has confirmed your order',
+ orderConfirmedTime: '10.13 AM',
+ agentAssigned: 'Delivery Agent Assigned',
+ agentAssignedMssg: 'Steve our delivery partner is at the store to pick up your order',
+ agentAssignedTime: '10.35AM',
+ OFD: 'Out for delivery',
+ OFDMssg: 'Order has been picked up! Our delivery partner is on their way to your location for delivery.',
+ OFDTime: '11.27AM',
+ orderDeliveredMssg: 'Order has been delivered ',
+ orderDeliveredTime: '12.23 PM',
+ checkout: 'Checkout',
+ items: 'Items',
+ shipping: 'Shipping',
+ billing: 'Billing',
+ changeText: 'Change',
+ paymentText: 'Payment',
+ orderDetailsCheckboxText: 'Same as Shipping Details',
+ subtotalText: 'Subtotal',
+ deliveryChargesText: 'Delivery Charges',
+ totalText: 'Total',
+ orderpolicyText: 'Order policy',
+ orderPolicyText:
+ 'In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on',
+ readMoreText: 'Read more',
+ readLessText: 'Read Less',
+ addShippingdetailsBtnText: 'Add Shipping Details',
+ orderHistory: 'Order history',
+ bottomModalTitle: 'Search',
+ optionRestaurants: 'Restaurants',
+ optionRestaurant: 'Restaurant',
+ restaurants: 'Restaurants in',
+ optionStores: 'Retail Stores',
+ optionHotels: 'Hotels',
+ optionBooks: 'Book Stores',
+ categoryLoadPrimary: 'Please wait!',
+ categoryLoadSecondary: 'Fetching store catalog from the network',
+ shopButton: 'Shop',
+ summary: 'Summary',
+ fulfillment: 'Fulfillment ',
+ order: 'Order',
+ localStores: 'Local stores in',
+ cartLoader: 'Getting Quotes',
+ initializingOrderLoader: 'Please wait while we set things up for you',
+ confirmingOrderLoader: 'Please wait while we confirm your order',
+ orderConfirm: 'Order Confirmed!',
+ confirmOrderMessage: 'Thank you! Our delivery agent will deliver your order',
+ currencySymbol: '€',
+ saveShippingDetails: 'Save Shipping Details',
+ saveBillingDetails: 'Save Billing Details',
+ addBillingDetails: 'Add Billing Details',
+ explorePlaces: 'Explore Nearby Places',
+ comingSoon: 'Coming Soon !',
+ confirmOrder: 'Confirm Order',
+ orderPlacedAt: 'Placed At',
+ ordersFulfilled: 'Orders Fulfilled',
+ subTotal: 'Sub Total',
+ deliveryCharge: 'Delivery Charges',
+ total: 'Total',
+ status: 'Status',
+ paymentMethod: 'Payment Method',
+ cards: 'Debit & Credit Cards',
+ addCard: 'Add',
+ orderPlaced: 'Order Placed!',
+ inStoreShopping: 'In-store-shopping',
+ delivery: 'Delivery',
+ clickAndCollect: 'Click & Collect',
+ dineIn: 'Dine-in',
+ takeAway: 'Takeaway',
+ bookstore: 'Bookstore',
+ formName: 'Name',
+ formNumber: 'Mobile Number',
+ formEmail: 'Email ID',
+ formAddress: 'Complete Address',
+ formZipCode: 'Zip Code',
+ errorName: 'Name is required',
+ errorNumber: 'Mobile Number is required',
+ errorNumber2: 'Invalid Mobile Number',
+ errorNumber3: 'Mobile Number must have 10 digits',
+ errorEmail: 'Email is required',
+ errorEmail2: 'Email Mobile Number',
+ errorAddress: 'Complete Address is required',
+ errorZipcode: 'Zip code is required',
+ errorZipcode2: 'Invalid Zip code',
+ confirmMessage1: 'Thank you! Your order will be',
+ confirmMessage2: 'confirmed shortly',
+ sendOtpButton: 'Send OTP',
+ verifyMobile: 'Verify your Mobile Number',
+ otpMessage1: 'Have sent an OTP to your mobile',
+ otpMessage2: 'number ending with',
+ otpPlaceholder: 'Enter OTP here',
+ loginButton: 'Login',
+ errorOtp1: 'OTP is required',
+ errorOtp2: 'OTP must have 6 digits',
+ catalogLoader: 'Please Wait!',
+ catalogSubLoader: 'Fetching store catalog from the network',
+ quoteRequestLoader: 'Please wait! Your order is getting processed',
+ estimatedDelivery: 'Estimated delivery time',
+ orderId: 'Order ID',
+ pending: 'Pending',
+ confirmed: 'Confirmed',
+ delivered: 'Delivered',
+ confirmationPending: 'Confirmation Pending',
+ itemsConfirmed: 'Items Confirmed',
+ orderPacked: 'Order Packed',
+ outForDelivery: 'Order Out for Delivery',
+ orderDelivered: 'Order Delivered',
+ rateStore: 'Rate the store',
+ rateDeliveryExperience: 'Rate the delivery experience',
+ addCommentsHere: 'Add your comments here',
+ writeExperience: 'Write about your experience..',
+ completed: 'Completed'
+}
+export default en
diff --git a/apps/mobility-bap/locales/fa.ts b/apps/mobility-bap/locales/fa.ts
new file mode 100644
index 000000000..f7f764ef9
--- /dev/null
+++ b/apps/mobility-bap/locales/fa.ts
@@ -0,0 +1,350 @@
+const fa: { [key: string]: string } = {
+ mainPage: 'Page principale de ZiShop',
+ search: 'Recherche',
+ login: 'Connexion',
+ logout: 'Se déconnecter',
+ favorites: 'Favoris',
+ delete: 'Supprimer',
+ thereAreNoFavorites: "actuellement, il n'y a pas d'articles favoris",
+ signIn: "S'identifier",
+ seeCart: 'Voir le panier',
+ product: 'Produit',
+ totalAmount: 'Montant total',
+ totalQuantity: 'Quantité totale',
+ payableAmount: 'Montant payable',
+ loginAndOrder: 'Se connecter et commander',
+ orderSummary: 'Récapitulatif de la commande',
+ cartIsEmpty: 'Le panier est vide',
+ categories: 'Catégories',
+ seeAllProduct: 'Voir tous les produits de cette catégorie',
+ offer: 'Offres et réductions',
+ bestSells: 'Les meilleures ventes',
+ mainMenu: 'Menu principal',
+ language: 'Langue: ',
+ fa: 'français - Fa',
+ en: 'Anglais - En',
+ theme: 'Thème: ',
+ dark: 'Sombre',
+ light: 'Lumière',
+ digital: 'Numérique',
+ laptop: 'Ordinateur portable et accessoires',
+ asus: 'Asus',
+ apple: 'Pomme',
+ dell: 'Dell',
+ lenovo: 'Lenovo',
+ samsung: 'Samsung',
+ hp: 'CV',
+ huawei: 'HUAWEI',
+ acer: 'Acer',
+ msi: 'MSI',
+ mobile: 'Mobile et Accessoires',
+ nokia: 'Nokia',
+ xiaomi: 'Xiaomi',
+ motorola: 'Motorola',
+ lg: 'LG',
+ sony: 'Sony',
+ computer: 'Ordinateur et Accessoires',
+ monitor: 'Moniteur',
+ mouse: 'Souris',
+ keyboard: 'Clavier',
+ hard: 'Disque dur, mémoire Flash et SSD',
+ other: 'Autre',
+ tablet: 'Tablette',
+ powerBank: "Banque d'alimentation",
+ speaker: 'Haut-parleur Bluetooth et fil',
+ headphones: 'Casque, casque et mains libres',
+ fashion: 'Mode et vêtements',
+ women: 'La mode des femmes',
+ dress: 'Robe',
+ skirt: 'Jupe',
+ jeans: 'jeans',
+ pants: 'Pantalon',
+ tShirt: 'T-shirt',
+ scarf: 'Foulard',
+ shirt: 'Chemise',
+ tie: 'Cravate',
+ overalls: 'Salopette',
+ mittens: 'Mitaines',
+ babyApron: 'Tablier bébé',
+ shoes: 'Chaussures',
+ watch: 'Montre',
+ wallet: 'Portefeuille',
+ hat: 'Chapeau',
+ belt: 'Ceinture',
+ men: 'La mode masculine',
+ child: 'Mode enfantine',
+ toys: 'Jouets et Bébé',
+ cosmetic: 'Cosmétique',
+ home: 'Meubles et cuisine',
+ stationery: 'Livres, Papeterie et Art',
+ noProduct: "Il n'y a pas encore de produits dans cette catégorie ! ",
+ digitalBT: 'Vivez les meilleures expériences',
+ digitalBD: 'Nous fournissons la meilleure expérience avec les marques les plus populaires. ',
+ stationeryBT: 'Variété de choix',
+ stationeryBD: "Quand il s'agit de Beauté et d'Efficacité. ",
+ toyBT: 'Divertissement et croissance de la créativité',
+ toyBD: 'Des produits de la meilleure qualité et anti-allergiques pour créer des moments heureux',
+ houseBT: 'Maison moderne',
+ houseBD:
+ 'profitez de beaux moments de satisfaction et de paix avec vos proches à la maison avec des produits conçus selon les styles les plus récents et les plus en vue.',
+ fashionBT: 'Beauté et confort',
+ fashionBD:
+ 'Vous trouverez les meilleurs tissus, les designs les plus en vogue et les marques les plus populaires à des prix raisonnables. ',
+ beautyBT: 'Accentue votre Beauté',
+ beautyBD: 'sans allergènes, les personnes de tous types de peau peuvent trouver les produits dont elles ont besoin. ',
+ deliver: 'livraison express',
+ cash: 'paiement sur place',
+ support: 'Assistance 24h/24 et 7j/7',
+ warrantyBenefit: "Garantir l'originalité",
+ return: 'garantie de remboursement des marchandises',
+ offers: 'Offres spéciales',
+ newest: 'Marchandises les plus récentes',
+ seeAll: 'Voir tout',
+ specialSale: 'Vente spéciale',
+ seeAllNewProducts: 'Voir tous les nouveaux produits',
+ digitalCategoryDescription: 'Nous offrons les produits les plus récents aux prix les plus compétitifs',
+ fashionCategoryDescription: 'Les marques les plus populaires avec les prix les plus raisonnables',
+ beautyCategoryDescription: 'Produits anti-allergiques adaptés à tous les types de peau de marques réputées',
+ sportCategoryDescription: 'Des produits de qualité et durables',
+ houseCategoryDescription: 'Conforme aux dessins du jour',
+ toyCategoryDescription: 'Une combinaison de divertissement et de créativité',
+ stationeryCategoryTitle: 'Livres, Papeterie et Art',
+ stationeryCategoryDescription: 'Variété de choix',
+ seeAllProducts: 'Voir tous les produits',
+ expireDiscount: 'La remise pour ce produit était Expire.',
+ days: 'Jours',
+ hours: 'Heures',
+ mins: 'Minutes',
+ seconds: 'Secondes',
+ larisaTitle: 'Meubles Larissa',
+ larisaDescription:
+ 'Le beau canapé Larissa avec son design privé peut donner une beauté unique à votre décoration de réception.',
+ byNow: 'Ajouter au panier',
+ see: 'Voir le produit',
+ romanoTitle: 'Meubles romans',
+ romanoDescription:
+ 'Le canapé Romano a une beauté impressionnante et peut multiplier le charme de la décoration de votre maison.',
+ popularBrands: 'Marques populaires',
+ zishopMap: 'Carte de Zishop',
+ aboutUs: 'À propos de nous',
+ contactUs: 'Contactez-nous',
+ saleInZishop: 'Vente à Zishop',
+ careerOpportunities: 'Opportunités de carrière',
+ customerServices: 'Service client',
+ commonQuestions: 'Questions courantes',
+ returnProcedures: 'Procédures de retour',
+ privacy: 'Confidentialité',
+ shoppingGuide: "Guide d'achat",
+ howToPlaceAnOrder: 'Comment passer une commande ?',
+ orderSubmissionProcedure: 'Procédure de soumission de commande',
+ paymentMethods: 'méthodes de payement',
+ beWithUs: 'Soyez avec nous!',
+ emailRegister: 'Restez au courant des dernières réductions en nous envoyant un e-mail',
+ yourEmail: 'Veuillez saisir votre e-mail',
+ register: 'Enregistrer',
+ copyRight: '© 2022 ZiShop. ',
+ sort: 'Trier en fonction de : ',
+ all: 'Tous',
+ newestProducts: 'Le plus récent',
+ cheapest: 'Le moins cher',
+ popular: 'Le plus populaire',
+ expensive: 'Le plus cher',
+ details: 'détails du produit',
+ back_camera: 'Caméra principale',
+ battery: 'Batterie',
+ front_camera: 'Caméra frontale',
+ operating_system: 'Système opérateur',
+ processor: 'CPU',
+ ram: 'RAM',
+ screen: 'Filtrer',
+ resolution: 'Résolution',
+ display_type: "Type d'affichage",
+ viewing_angle: 'Angle de vue',
+ response_time: 'Temps de réponse',
+ refresh_rate: 'Fréquence de rafraîchissement',
+ panel_technology: 'Technologie des panneaux',
+ input_output_types: "Types d'entrée/sortie",
+ true: 'Oui',
+ false: 'Non',
+ bluetooth: 'Bluetooth',
+ frequency_response: 'Fréquence de réponse',
+ sound_isolating: 'Isolation acoustique',
+ microphone: 'Microphone',
+ noise_cancelling: 'Suppression du bruit',
+ wireless: 'Sans fil',
+ wireless_standby_time: 'Autonomie de la batterie en mode veille',
+ connectionType: 'Type de connexion',
+ connectors: 'Connecteurs',
+ multimedia_keys: 'Touches multimédia',
+ number_of_buttons: 'Nombre de boutons (y compris la molette de défilement)',
+ width: 'Largeur',
+ height: 'Hauteur',
+ depth: 'Profondeur',
+ curved: 'Incurvé',
+ built_in_speakers: 'Haut-parleurs intégrés',
+ mechanical_keys: 'Clés mécaniques',
+ backlit_keys: 'Touches rétroéclairées',
+ ergonomic_design: 'Design ergonomique',
+ designed_for_gaming: 'Conçu pour les jeux',
+ graphic: 'Graphique',
+ ports: 'Ports',
+ ssd: 'Disque dur SSD',
+ warranty: 'garantie',
+ addToCart: 'AJOUTER AU PANIER',
+ stars: 'Étoile',
+ price: 'Prix du produit',
+ similarProducts: 'Vous etes peut etre intéressé',
+ cart: 'Panier',
+ hi: 'Salut!',
+ loginExplanation:
+ 'En plus de vous inscrire, vous pouvez également tester le modèle avec les informations du compte de test (e-mail : test@info.com - Mot de passe : 123456)',
+ testAccount: "compte d'essai",
+ userName: "Nom d'utilisateur",
+ password: 'Mot de passe',
+ email: 'E-mail',
+ enterYourUserName: "S'il vous plaît entrez votre nom d'utilisateur",
+ enterYourPassword: "S'il vous plait entrez votre mot de passe",
+ enterYourEmail: 'Veuillez saisir votre e-mail',
+ doHaveAnAccount: "Vous n'avez pas de compte ? ",
+ alreadyHaveAnAccount: 'Vous avez déjà un compte ? ',
+ signUp: "S'inscrire",
+ Invalid_email_or_password: 'email ou mot de passe invalide',
+ Email_already_exists: "l'email existe déjà",
+ aboutLongText:
+ 'Le modèle de magasin ZShop a été écrit pour consolider mes connaissances frontales, en utilisant des technologies telles que Nextjs, Typescript, React, Tailwindcss, etc. en tant que portefeuille. ',
+ aboutEnjoy: "J'espère que vous apprécierez regarder et travailler avec ce modèle.",
+ myName: 'Kehyshow',
+ cafeDX: "Le travail a pour but d'améliorer la vie, et non l'inverse.",
+ productAddedToCartMsg: 'Produit ajouté au panier avec succès',
+ BrowseByCategory: 'Parcourir par catégorie',
+ meatAndFish: 'Viande',
+ fruitsVegetablesTitle: 'Fruits et légumes',
+ frozenFood: 'Des surgelés',
+ beverages: 'Breuvages',
+ snacks: 'Collations',
+ dairy: 'Laitier',
+ cashOnDelivery: 'Paiement à la réception',
+ selectPaymentMethod: 'Sélectionnez le mode de paiement',
+ orderDetails: 'Détails de la commande',
+ trackOrder: 'Suivi de commande',
+ proceedToPay: 'Procéder au paiement',
+ backToHome: 'Retournez à la maison',
+ contactSupport: 'Contactez le support',
+ orderDeliveredOnTime: 'Commande livrée à temps !',
+ shareYourfeedback: "S'il vous plaît partagez vos commentaires avec nous",
+ submitReview: 'Poster le commentaire',
+ skipForNow: 'Passer pour le moment',
+ orderConfirmed: 'Commande confirmée',
+ orderConfirmedMssg: 'ABC Mart a confirmé votre commande',
+ orderConfirmedTime: '10h13',
+ agentAssigned: "Un livreur s'occupe de vous",
+ agentAssignedMssg: 'Steve notre transporteur est au magasin pour récupérer votre commande.',
+ agentAssignedTime: '10h35',
+ OFD: 'En cours de livraison',
+ OFDMssg: 'La commande a été récupérée ! ',
+ orderDeliveredMssg: 'La commande a été retirée ! Notre transporteur est en chemin pour vous livrer',
+ orderDeliveredTime: '12h23',
+ checkout: 'Vérifier',
+ items: 'Articles',
+ shipping: 'Expédition',
+ billing: 'Facturation',
+ changeText: 'Changer',
+ paymentText: 'Paiement',
+ orderDetailsCheckboxText: "Identique aux détails d'expédition",
+ subtotalText: 'Total',
+ deliveryChargesText: 'Frais de livraison',
+ totalText: 'Total',
+ orderpolicyText: 'Politique de commande',
+ orderPolicyText:
+ "Dans l'édition et la conception graphique, Lorem ipsum est un texte d'espace réservé couramment utilisé pour démontrer la forme visuelle d'un document ou d'une police de caractères sans s'appuyer sur Dans l'édition et la conception graphique, Lorem ipsum est un texte d'espace réservé couramment utilisé pour démontrer la forme visuelle d'un document ",
+ readMoreText: 'En savoir plus',
+ readLessText: 'Lire moins',
+ addShippingdetailsBtnText: 'Ajouter les détails de livraison',
+ orderHistory: 'Historique des commandes',
+ bottomModalTitle: 'Recherche',
+ optionRestaurants: 'Restaurants',
+ optionRestaurant: 'Restaurant',
+ restaurants: 'Restaurants à',
+ optionStores: 'Commerces',
+ optionHotels: 'Hôtels',
+ optionBooks: 'Librairies',
+ categoryLoadPrimary: "S'il vous plaît, attendez!",
+ categoryLoadSecondary: 'Récupération du catalogue du magasin à partir du réseau',
+ shopButton: 'magasiner',
+ summary: 'Summary',
+ fulfillment: 'Fulfillment ',
+ order: 'Commande',
+ localStores: 'Commerces de proximité',
+ cartLoader: 'Obtention des devis',
+ initializingOrderLoader: 'Veuillez patienter pendant que nous préparons les choses pour vous',
+ confirmingOrderLoader: 'Veuillez patienter pendant que nous confirmons votre commande',
+ orderConfirm: 'Commande confirmée!',
+ confirmOrderMessage: 'Merci ! Notre agent de livraison vous livrera votre commande.',
+ currencySymbol: '€',
+ saveShippingDetails: "Enregistrer l'expédition détails",
+ saveBillingDetails: 'Enregistrer les détails de facturation',
+ addBillingDetails: 'Ajouter les détails de facturation',
+ comingSoon: 'À venir !',
+ proceedToCheckout: 'Vérifier',
+ confirmOrder: 'Confirmer la commande',
+ orderPlacedAt: 'Passée à ',
+ ordersFulfilled: 'Commande honorée',
+ subTotal: 'Sous-total',
+ deliveryCharge: 'Frais de livraison',
+ total: 'Total',
+ status: 'Statut',
+ paymentMethod: 'Méthode de paiement',
+ explorePlaces: 'Explorer les lieux à proximité',
+ cards: 'Cartes bancaires',
+ addCard: 'Ajouter',
+ orderPlaced: 'commande passée',
+ inStoreShopping: 'Achats en magasin',
+ delivery: 'Livraison',
+ clickAndCollect: 'Click & Collect',
+ dineIn: 'Service sur place',
+ takeAway: 'À emporte',
+ bookstore: 'Librairie',
+ formName: 'Nom',
+ formNumber: 'Numéro de téléphone portable',
+ formEmail: 'Adresse e-mail',
+ formAddress: 'Adresse complète',
+ formZipCode: 'Code Interphone',
+ errorName: 'Le nom est requis',
+ errorNumber: 'Le numéro de téléphone portable est requis',
+ errorNumber2: 'Numéro de téléphone portable invalide',
+ errorNumber3: 'Le numéro de téléphone portable doit comporter 10 chiffres',
+ errorEmail: "L'e-mail est requis",
+ errorEmail2: 'Adresse e-mail invalide',
+ errorAddress: "L'adresse complète est requise",
+ errorZipcode: 'Le code interphone est requis',
+ errorZipcode2: 'Code nterphone invalide',
+ confirmMessage1: 'Merci ! Notre commande sera',
+ confirmMessage2: 'confirmée sous peu',
+ sendOtpButton: 'Envoyer',
+ verifyMobile: 'Vérifier le numéro de téléphone',
+ otpMessage1: 'Un code a été envoyé à votre téléphone',
+ otpMessage2: 'se termine par',
+ otpPlaceholder: 'Entrez le code ici',
+ loginButton: 'Se connecter',
+ errorOtp1: 'Code requis',
+ errorOtp2: 'Code invalide',
+ catalogLoader: 'Veuillez patienter !',
+ catalogSubLoader: 'Récupération du catalogue du magasin depuis le réseau',
+ quoteRequestLoader: "S'il vous plaît, attendez! Votre commande est en cours de traitement",
+ estimatedDelivery: 'Délai de livraison estimé au ',
+ orderId: 'De la livraison',
+ pending: 'En attente',
+ confirmed: 'Confirmé',
+ delivered: 'Livrée',
+ confirmationPending: 'Confirmation en attente',
+ itemsConfirmed: 'Articles confirmés',
+ orderPacked: 'Commande emballée',
+ outForDelivery: 'Prêt pour la livraison',
+ orderDelivered: 'Commande livrée',
+ rateStore: 'Évaluer le magasin',
+ rateDeliveryExperience: "Évaluer l'expérience de livraison",
+ addCommentsHere: 'Ajoutez vos commentaires ici',
+ writeExperience: 'Décrivez votre expérience..',
+ completed: 'Complété'
+}
+export default fa
diff --git a/apps/mobility-bap/mock/banner.js b/apps/mobility-bap/mock/banner.js
new file mode 100644
index 000000000..33616eb6a
--- /dev/null
+++ b/apps/mobility-bap/mock/banner.js
@@ -0,0 +1,22 @@
+export const bannerContent = [
+ {
+ title: 'larisaTitle',
+ description: 'larisaDescription',
+ buttonText: 'see',
+ imgSrc: '/images/banners-img/home1.webp',
+ imgWidth: 980,
+ imgHeight: 500,
+ numberOfDiscountDate: 9,
+ href: '/'
+ },
+ {
+ title: 'romanoTitle',
+ description: 'romanoDescription',
+ buttonText: 'see',
+ imgSrc: '/images/banners-img/home2.webp',
+ imgWidth: 980,
+ imgHeight: 500,
+ numberOfDiscountDate: 7,
+ href: '/'
+ }
+]
diff --git a/apps/mobility-bap/mock/benefits.js b/apps/mobility-bap/mock/benefits.js
new file mode 100644
index 000000000..2a90a085d
--- /dev/null
+++ b/apps/mobility-bap/mock/benefits.js
@@ -0,0 +1,22 @@
+export const benefitContent = [
+ {
+ imgSrc: '/images/benefit-icons/005-delivery-truck-2.webp',
+ title: 'deliver'
+ },
+ {
+ imgSrc: '/images/benefit-icons/003-cash-on-delivery.webp',
+ title: 'cash'
+ },
+ {
+ imgSrc: '/images/benefit-icons/004-headphones.webp',
+ title: 'support'
+ },
+ {
+ imgSrc: '/images/benefit-icons/006-best-seller.webp',
+ title: 'warrantyBenefit'
+ }
+ // {
+ // imgSrc: "/images/benefit-icons/007-return.png",
+ // title: "return",
+ // },
+]
diff --git a/apps/mobility-bap/mock/brand.js b/apps/mobility-bap/mock/brand.js
new file mode 100644
index 000000000..8d2a49622
--- /dev/null
+++ b/apps/mobility-bap/mock/brand.js
@@ -0,0 +1,122 @@
+export const brandContent = [
+ {
+ id: 1,
+ name: 'adidas',
+ imgSrc: '/images/brand-logo-img/adidas.webp'
+ },
+ {
+ id: 2,
+ name: 'apple',
+ imgSrc: '/images/brand-logo-img/apple.webp'
+ },
+ {
+ id: 3,
+ name: 'asus',
+ imgSrc: '/images/brand-logo-img/asus.webp'
+ },
+ {
+ id: 4,
+ name: 'benq',
+ imgSrc: '/images/brand-logo-img/benq.webp'
+ },
+ {
+ id: 5,
+ name: 'bvlgari',
+ imgSrc: '/images/brand-logo-img/bvlgari.webp'
+ },
+ {
+ id: 6,
+ name: 'del',
+ imgSrc: '/images/brand-logo-img/del.webp'
+ },
+ {
+ id: 7,
+ name: 'dior',
+ imgSrc: '/images/brand-logo-img/dior.webp'
+ },
+ {
+ id: 8,
+ name: 'dolce-gabbana',
+ imgSrc: '/images/brand-logo-img/dolce-gabbana.webp'
+ },
+ {
+ id: 9,
+ name: 'gucci',
+ imgSrc: '/images/brand-logo-img/gucci.webp'
+ },
+ {
+ id: 10,
+ name: 'hp',
+ imgSrc: '/images/brand-logo-img/hp.webp'
+ },
+ {
+ id: 11,
+ name: 'lg',
+ imgSrc: '/images/brand-logo-img/lg.webp'
+ },
+ {
+ id: 12,
+ name: 'loreal',
+ imgSrc: '/images/brand-logo-img/loreal.webp'
+ },
+ {
+ id: 13,
+ name: 'louis-vuitton',
+ imgSrc: '/images/brand-logo-img/louis-vuitton.webp'
+ },
+ {
+ id: 14,
+ name: 'mac',
+ imgSrc: '/images/brand-logo-img/mac.webp'
+ },
+ {
+ id: 15,
+ name: 'maybelline',
+ imgSrc: '/images/brand-logo-img/maybelline.webp'
+ },
+ {
+ id: 16,
+ name: 'msi',
+ imgSrc: '/images/brand-logo-img/msi.webp'
+ },
+ {
+ id: 17,
+ name: 'patek-philippe',
+ imgSrc: '/images/brand-logo-img/patek-philippe.webp'
+ },
+ {
+ id: 18,
+ name: 'puma',
+ imgSrc: '/images/brand-logo-img/puma.webp'
+ },
+ {
+ id: 19,
+ name: 'rolex',
+ imgSrc: '/images/brand-logo-img/rolex.webp'
+ },
+ {
+ id: 20,
+ name: 'samsung',
+ imgSrc: '/images/brand-logo-img/samsung.webp'
+ },
+ {
+ id: 21,
+ name: 'sony',
+ imgSrc: '/images/brand-logo-img/sony.webp'
+ },
+ {
+ id: 22,
+ name: 'toshiba',
+ imgSrc: '/images/brand-logo-img/toshiba.webp'
+ },
+ {
+ id: 23,
+ name: 'versace',
+ imgSrc: '/images/brand-logo-img/versace.webp'
+ },
+ {
+ id: 24,
+ name: 'xiaomi',
+ imgSrc: '/images/brand-logo-img/xiaomi.webp'
+ }
+]
diff --git a/apps/mobility-bap/mock/category-lg.js b/apps/mobility-bap/mock/category-lg.js
new file mode 100644
index 000000000..f1f2edd31
--- /dev/null
+++ b/apps/mobility-bap/mock/category-lg.js
@@ -0,0 +1,123 @@
+export const categoryLgContent = [
+ {
+ name: 'digital',
+ title: 'fruitsVegetablesTitle',
+ description: 'digitalCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--digital-category-bgc)',
+ flexDirection: 'row',
+ paddingBlock: '2rem',
+ paddingInline: '1rem',
+ gridRow: 'span 6 / span 6',
+ gridColumn: 'span 3 / span 3'
+ },
+ href: '/digital',
+ imgSrc: '/images/category-img/fruits-Vegetable.svg',
+ imgWidth: 190,
+ imgHeight: 240
+ },
+ {
+ name: 'fashion',
+ title: 'frozenFood',
+ description: 'fashionCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--fashion-category-bgc)',
+ flexDirection: 'row',
+ paddingInline: '1rem',
+ paddingBlock: 'unset',
+ gridRow: 'span 6 / span 6',
+ gridColumn: 'span 3 / span 3'
+ },
+ href: '/fashion',
+ imgSrc: '/images/category-img/frozen-food.svg',
+ imgWidth: 240,
+ imgHeight: 250
+ },
+ {
+ name: 'beauty',
+ title: 'beverages',
+ description: 'beautyCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--beauty-category-bgc)',
+ flexDirection: 'row',
+ paddingInline: '1rem',
+ paddingBlock: '0.5rem',
+ gridRow: 'span 3 / span 3',
+ gridColumn: 'span 3 / span 3'
+ },
+ href: '/beauty',
+ imgSrc: '/images/category-img/beverages.svg',
+ imgWidth: 170,
+ imgHeight: 150
+ },
+ {
+ name: 'sport',
+ title: 'meatAndFish',
+ description: 'sportCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--sport-category-bgc)',
+ flexDirection: 'row-reverse',
+ paddingInline: 'unset',
+ paddingBlock: '0.5rem',
+ gridRow: 'span 3 / span 3',
+ gridColumn: 'span 3 / span 3'
+ },
+ href: '/sport',
+ imgSrc: '/images/category-img/meat-and-fish.svg',
+ imgWidth: 130,
+ imgHeight: 150
+ },
+ {
+ name: 'house',
+ title: 'snacks',
+ description: 'houseCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--house-category-bgc)',
+ flexDirection: 'row',
+ paddingInline: '1rem',
+ paddingBlock: 'unset',
+ gridRow: 'span 2 / span 2',
+ gridColumn: 'span 5 / span 5'
+ },
+ href: '/house',
+ imgSrc: '/images/category-img/snacks.svg',
+ imgWidth: 320,
+ imgHeight: 240
+ },
+ {
+ name: 'toy',
+ title: 'dairy',
+ description: 'toyCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--toy-category-bgc)',
+ flexDirection: 'column',
+ paddingInline: '0.5rem',
+ paddingBlock: '0.5rem',
+ textAlign: 'center',
+ gridRow: 'span 2 / span 2',
+ gridColumn: 'span 2 / span 2'
+ },
+ href: '/toy',
+ imgSrc: '/images/category-img/dairy.svg',
+ imgWidth: 130,
+ imgHeight: 110
+ },
+ {
+ name: 'stationery',
+ title: 'stationeryCategoryTitle',
+ description: 'stationeryCategoryDescription',
+ styles: {
+ backgroundColor: 'var(--stationery-category-bgc)',
+ flexDirection: 'row',
+ paddingInline: '0.75rem',
+ paddingBlock: 'unset',
+ gridRow: 'span 2 / span 2',
+ gridColumn: 'span 2 / span 2'
+ },
+ href: '/stationery',
+ imgSrc: '/images/category-img/stationery-category.webp',
+ imgWidth: 130,
+ imgHeight: 250,
+ imgCustomStyles: { alignSelf: 'flex-start' }
+ }
+]
diff --git a/apps/mobility-bap/mock/category-sm.js b/apps/mobility-bap/mock/category-sm.js
new file mode 100644
index 000000000..372933252
--- /dev/null
+++ b/apps/mobility-bap/mock/category-sm.js
@@ -0,0 +1,44 @@
+export const categorySmContent = [
+ {
+ bgc: 'digitalCategory',
+ imgSrc: 'fruits-Vegetable.svg',
+ categoryTitle: 'fruitsVegetablesTitle',
+ href: '/digital'
+ },
+ {
+ bgc: 'fashionCategory',
+ imgSrc: 'frozen-food.svg',
+ categoryTitle: 'frozenFood',
+ href: '/fashion'
+ },
+ {
+ bgc: 'beautyCategory',
+ imgSrc: 'beverages.svg',
+ categoryTitle: 'beverages',
+ href: '/beauty'
+ },
+ {
+ bgc: 'sportCategory',
+ imgSrc: 'meat-and-fish.svg',
+ categoryTitle: 'meatAndFish',
+ href: '/sport'
+ },
+ {
+ bgc: 'houseCategory',
+ imgSrc: 'snacks.svg',
+ categoryTitle: 'snacks',
+ href: '/house'
+ },
+ {
+ bgc: 'toyCategory',
+ imgSrc: 'dairy.svg',
+ categoryTitle: 'dairy',
+ href: '/toy'
+ },
+ {
+ bgc: 'stationeryCategory',
+ imgSrc: 'stationery-category.webp',
+ categoryTitle: 'stationeryCategoryTitle',
+ href: '/stationery'
+ }
+]
diff --git a/apps/mobility-bap/mock/footer.js b/apps/mobility-bap/mock/footer.js
new file mode 100644
index 000000000..101b9c81f
--- /dev/null
+++ b/apps/mobility-bap/mock/footer.js
@@ -0,0 +1,83 @@
+import { FaLinkedin, FaTwitterSquare, FaTelegramPlane } from 'react-icons/fa'
+import { AiFillInstagram } from 'react-icons/ai'
+
+export const footerContent = [
+ {
+ title: 'zishopMap',
+ subtitles: [
+ {
+ text: 'aboutUs',
+ href: '/about'
+ },
+ {
+ text: 'contactUs',
+ href: '/blank'
+ },
+ {
+ text: 'saleInZishop',
+ href: '/blank'
+ },
+ {
+ text: 'careerOpportunities',
+ href: '/blank'
+ }
+ ]
+ },
+ {
+ title: 'customerServices',
+ subtitles: [
+ {
+ text: 'commonQuestions',
+ href: '/blank'
+ },
+ {
+ text: 'returnProcedures',
+ href: '/blank'
+ },
+ {
+ text: 'privacy',
+ href: '/blank'
+ }
+ ]
+ },
+ {
+ title: 'shoppingGuide',
+ subtitles: [
+ {
+ text: 'howToPlaceAnOrder',
+ href: '/blank'
+ },
+ {
+ text: 'orderSubmissionProcedure',
+ href: '/blank'
+ },
+ {
+ text: 'paymentMethods',
+ href: '/blank'
+ }
+ ]
+ }
+]
+
+export const socialMedia = [
+ {
+ name: 'instagram',
+ icon: AiFillInstagram,
+ href: '/'
+ },
+ {
+ name: 'linkedin',
+ icon: FaLinkedin,
+ href: '/'
+ },
+ {
+ name: 'twitter',
+ icon: FaTwitterSquare,
+ href: '/'
+ },
+ {
+ name: 'telegram',
+ icon: FaTelegramPlane,
+ href: '/'
+ }
+]
diff --git a/apps/mobility-bap/mock/menuItems.js b/apps/mobility-bap/mock/menuItems.js
new file mode 100644
index 000000000..72d273663
--- /dev/null
+++ b/apps/mobility-bap/mock/menuItems.js
@@ -0,0 +1,79 @@
+import { BsLaptop, BsBook } from 'react-icons/bs'
+import { IoShirtOutline, IoShirtSharp } from 'react-icons/io5'
+import { MdOutlineToys } from 'react-icons/md'
+import { RiHeartPulseLine, RiFireLine } from 'react-icons/ri'
+import { AiOutlineHome, AiOutlinePercentage } from 'react-icons/ai'
+import { BiFootball } from 'react-icons/bi'
+
+import { ImMobile } from 'react-icons/im'
+import { FiMonitor, FiHeadphones } from 'react-icons/fi'
+
+import { GiLargeDress } from 'react-icons/gi'
+import { FaBaby, FaRedhat } from 'react-icons/fa'
+
+const menuItems = [
+ {
+ category: 'digital',
+ icon: BsLaptop,
+ productsGroup: [
+ {
+ title: 'laptop',
+ icon: BsLaptop,
+ subtitles: ['asus', 'apple', 'dell', 'lenovo', 'samsung', 'hp', 'huawei', 'acer', 'msi']
+ },
+ {
+ title: 'mobile',
+ icon: ImMobile,
+ subtitles: ['samsung', 'apple', 'nokia', 'xiaomi', 'motorola', 'lg', 'sony']
+ },
+ {
+ title: 'computer',
+ icon: FiMonitor,
+ subtitles: ['monitor', 'mouse', 'keyboard', 'hard']
+ },
+ {
+ title: 'other',
+ icon: FiHeadphones,
+ subtitles: ['tablet', 'powerBank', 'speaker', 'headphones']
+ }
+ ]
+ },
+ {
+ category: 'fashion',
+ icon: IoShirtOutline,
+ productsGroup: [
+ {
+ title: 'women',
+ icon: GiLargeDress,
+ subtitles: ['dress', 'skirt', 'jeans', 'pants', 'tShirt', 'shoes', 'scarf']
+ },
+ {
+ title: 'men',
+ icon: IoShirtSharp,
+ subtitles: ['shirt', 'pants', 'tie', 'tShirt', 'shoes', 'jeans']
+ },
+ {
+ title: 'child',
+ icon: FaBaby,
+ subtitles: ['overalls', 'mittens', 'babyApron', 'shoes', 'tShirt']
+ },
+ {
+ title: 'other',
+ icon: FaRedhat,
+ subtitles: ['watch', 'wallet', 'hat', 'belt']
+ }
+ ]
+ },
+ { category: 'toys', icon: MdOutlineToys },
+ { category: 'cosmetic', icon: RiHeartPulseLine },
+ { category: 'home', icon: AiOutlineHome },
+ { category: 'sport', icon: BiFootball },
+ { category: 'stationery', icon: BsBook }
+]
+
+export default menuItems
+
+export const extraMenu = [
+ { title: 'offer', icon: AiOutlinePercentage, href: '/offers' },
+ { title: 'bestSells', icon: RiFireLine, href: '/' }
+]
diff --git a/apps/mobility-bap/mock/slider.js b/apps/mobility-bap/mock/slider.js
new file mode 100644
index 000000000..ecd123352
--- /dev/null
+++ b/apps/mobility-bap/mock/slider.js
@@ -0,0 +1,44 @@
+export const sliderContent = [
+ {
+ ID: 1,
+ title: 'digitalBT',
+ description: 'digitalBD',
+ bgImg: "url('/images/slider-img/digital-banner.webp')",
+ url: '/'
+ },
+ {
+ ID: 2,
+ title: 'stationeryBT',
+ description: 'stationeryBD',
+ bgImg: "url('/images/slider-img/stationery-banner.webp')",
+ url: '/'
+ },
+ {
+ ID: 3,
+ title: 'toyBT',
+ description: 'toyBD',
+ bgImg: "url('/images/slider-img/toy-banner.webp')",
+ url: '/'
+ },
+ {
+ ID: 4,
+ title: 'houseBT',
+ description: 'houseBD',
+ bgImg: "url('/images/slider-img/house-banner.webp')",
+ url: '/'
+ },
+ {
+ ID: 5,
+ title: 'fashionBT',
+ description: 'fashionBD',
+ bgImg: "url('/images/slider-img/fashion-banner.webp')",
+ url: '/'
+ },
+ {
+ ID: 6,
+ title: 'beautyBT',
+ description: 'beautyBD',
+ bgImg: "url('/images/slider-img/beauty-banner.webp')",
+ url: '/'
+ }
+]
diff --git a/apps/mobility-bap/mock/sortRadioInput.js b/apps/mobility-bap/mock/sortRadioInput.js
new file mode 100644
index 000000000..032175d06
--- /dev/null
+++ b/apps/mobility-bap/mock/sortRadioInput.js
@@ -0,0 +1 @@
+export const radioBtnValue = ['all', 'cheapest', 'expensive']
diff --git a/apps/mobility-bap/next-env.d.ts b/apps/mobility-bap/next-env.d.ts
new file mode 100644
index 000000000..4f11a03dc
--- /dev/null
+++ b/apps/mobility-bap/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/apps/mobility-bap/next-sitemap.config.js b/apps/mobility-bap/next-sitemap.config.js
new file mode 100644
index 000000000..75460e752
--- /dev/null
+++ b/apps/mobility-bap/next-sitemap.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next-sitemap').IConfig} */
+
+module.exports = {
+ siteUrl: process.env.SITE_URL,
+ generateRobotsTxt: true
+}
diff --git a/apps/mobility-bap/next.config.js b/apps/mobility-bap/next.config.js
new file mode 100644
index 000000000..65ff33546
--- /dev/null
+++ b/apps/mobility-bap/next.config.js
@@ -0,0 +1,48 @@
+/** @type {import('next').NextConfig} */
+
+const nextConfig = {
+ reactStrictMode: false,
+ transpilePackages: ['@beckn-ui/molecules', '@beckn-ui/becknified-components'],
+ i18n: {
+ locales: ['en', 'fa'],
+ defaultLocale: 'en',
+ localeDetection: false
+ },
+ images: {
+ domains: [
+ 'cdn.sanity.io',
+ 'bazaar.becknprotocol.io',
+ 'mandi.succinct.in',
+ 'market.becknprotocol.io',
+ 'retail-osm-stage.becknprotocol.io',
+ 'retail-osm-prod.becknprotocol.io'
+ ]
+ },
+ eslint: {
+ // Warning: This allows production builds to successfully complete even if
+ // your project has ESLint errors.
+ ignoreDuringBuilds: true
+ },
+ typescript: {
+ // !! WARN !!
+ // Dangerously allow production builds to successfully complete even if
+ // your project has type errors.
+ // !! WARN !!
+ ignoreBuildErrors: true
+ },
+ webpack: function (config) {
+ config.module.rules.push({
+ test: /\.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
+ use: {
+ loader: 'url-loader',
+ options: {
+ limit: 100000,
+ name: '[name].[ext]'
+ }
+ }
+ })
+ return config
+ }
+}
+
+module.exports = nextConfig
diff --git a/apps/mobility-bap/npm b/apps/mobility-bap/npm
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/mobility-bap/package-lock.json b/apps/mobility-bap/package-lock.json
new file mode 100644
index 000000000..995e2715f
--- /dev/null
+++ b/apps/mobility-bap/package-lock.json
@@ -0,0 +1,5794 @@
+{
+ "name": "online-shop",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "requires": {
+ "@babel/highlight": "^7.22.5"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ=="
+ },
+ "@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz",
+ "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.5.tgz",
+ "integrity": "sha512-TNPDN6aBFaUox2Lu+H/Y1dKKQgr4ucz/FGyCz67RVYLsBpVpUFf1dDngzg+Od8aqbrqwyztkaZjtWCZEUOT8zA==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/types": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@chakra-ui/accordion": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.2.0.tgz",
+ "integrity": "sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==",
+ "requires": {
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16"
+ }
+ },
+ "@chakra-ui/alert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz",
+ "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/spinner": "2.0.13"
+ }
+ },
+ "@chakra-ui/anatomy": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz",
+ "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ=="
+ },
+ "@chakra-ui/avatar": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.11.tgz",
+ "integrity": "sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==",
+ "requires": {
+ "@chakra-ui/image": "2.0.16",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/breadcrumb": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz",
+ "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==",
+ "requires": {
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/breakpoint-utils": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz",
+ "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/button": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz",
+ "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/spinner": "2.0.13"
+ }
+ },
+ "@chakra-ui/card": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz",
+ "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/checkbox": {
+ "version": "2.2.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.15.tgz",
+ "integrity": "sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/visually-hidden": "2.0.15",
+ "@zag-js/focus-visible": "0.2.2"
+ }
+ },
+ "@chakra-ui/clickable": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz",
+ "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==",
+ "requires": {
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/close-button": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz",
+ "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16"
+ }
+ },
+ "@chakra-ui/color-mode": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz",
+ "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/control-box": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz",
+ "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A=="
+ },
+ "@chakra-ui/counter": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz",
+ "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==",
+ "requires": {
+ "@chakra-ui/number-utils": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/css-reset": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.2.tgz",
+ "integrity": "sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A=="
+ },
+ "@chakra-ui/descendant": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz",
+ "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7"
+ }
+ },
+ "@chakra-ui/dom-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz",
+ "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ=="
+ },
+ "@chakra-ui/editable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.0.0.tgz",
+ "integrity": "sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/event-utils": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz",
+ "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw=="
+ },
+ "@chakra-ui/focus-lock": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.17.tgz",
+ "integrity": "sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "react-focus-lock": "^2.9.4"
+ }
+ },
+ "@chakra-ui/form-control": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz",
+ "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/hooks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.0.tgz",
+ "integrity": "sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==",
+ "requires": {
+ "@chakra-ui/react-utils": "2.0.12",
+ "@chakra-ui/utils": "2.0.15",
+ "compute-scroll-into-view": "1.0.20",
+ "copy-to-clipboard": "3.3.3"
+ }
+ },
+ "@chakra-ui/icon": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz",
+ "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/icons": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.0.19.tgz",
+ "integrity": "sha512-0A6U1ZBZhLIxh3QgdjuvIEhAZi3B9v8g6Qvlfa3mu6vSnXQn2CHBZXmJwxpXxO40NK/2gj/gKXrLeUaFR6H/Qw==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16"
+ }
+ },
+ "@chakra-ui/image": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.16.tgz",
+ "integrity": "sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/input": {
+ "version": "2.0.22",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.22.tgz",
+ "integrity": "sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/layout": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.2.0.tgz",
+ "integrity": "sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==",
+ "requires": {
+ "@chakra-ui/breakpoint-utils": "2.0.8",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/lazy-utils": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz",
+ "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg=="
+ },
+ "@chakra-ui/live-region": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz",
+ "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ=="
+ },
+ "@chakra-ui/media-query": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz",
+ "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==",
+ "requires": {
+ "@chakra-ui/breakpoint-utils": "2.0.8",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/menu": {
+ "version": "2.1.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.15.tgz",
+ "integrity": "sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==",
+ "requires": {
+ "@chakra-ui/clickable": "2.0.14",
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-animation-state": "2.0.9",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-focus-effect": "2.0.11",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-outside-click": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16"
+ }
+ },
+ "@chakra-ui/modal": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.12.tgz",
+ "integrity": "sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==",
+ "requires": {
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/focus-lock": "2.0.17",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16",
+ "aria-hidden": "^1.2.2",
+ "react-remove-scroll": "^2.5.5"
+ }
+ },
+ "@chakra-ui/number-input": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz",
+ "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==",
+ "requires": {
+ "@chakra-ui/counter": "2.0.14",
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-interval": "2.0.5",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/number-utils": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz",
+ "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg=="
+ },
+ "@chakra-ui/object-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz",
+ "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ=="
+ },
+ "@chakra-ui/pin-input": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz",
+ "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==",
+ "requires": {
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/popover": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.12.tgz",
+ "integrity": "sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==",
+ "requires": {
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-animation-state": "2.0.9",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-focus-effect": "2.0.11",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/popper": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.14.tgz",
+ "integrity": "sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==",
+ "requires": {
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@popperjs/core": "^2.9.3"
+ }
+ },
+ "@chakra-ui/portal": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz",
+ "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/progress": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz",
+ "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8"
+ }
+ },
+ "@chakra-ui/provider": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.3.0.tgz",
+ "integrity": "sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==",
+ "requires": {
+ "@chakra-ui/css-reset": "2.1.2",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/system": "2.5.8",
+ "@chakra-ui/utils": "2.0.15"
+ }
+ },
+ "@chakra-ui/radio": {
+ "version": "2.0.22",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz",
+ "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@zag-js/focus-visible": "0.2.2"
+ }
+ },
+ "@chakra-ui/react": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.7.1.tgz",
+ "integrity": "sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==",
+ "requires": {
+ "@chakra-ui/accordion": "2.2.0",
+ "@chakra-ui/alert": "2.1.0",
+ "@chakra-ui/avatar": "2.2.11",
+ "@chakra-ui/breadcrumb": "2.1.5",
+ "@chakra-ui/button": "2.0.18",
+ "@chakra-ui/card": "2.1.6",
+ "@chakra-ui/checkbox": "2.2.15",
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/control-box": "2.0.13",
+ "@chakra-ui/counter": "2.0.14",
+ "@chakra-ui/css-reset": "2.1.2",
+ "@chakra-ui/editable": "3.0.0",
+ "@chakra-ui/focus-lock": "2.0.17",
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/hooks": "2.2.0",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/image": "2.0.16",
+ "@chakra-ui/input": "2.0.22",
+ "@chakra-ui/layout": "2.2.0",
+ "@chakra-ui/live-region": "2.0.13",
+ "@chakra-ui/media-query": "3.2.12",
+ "@chakra-ui/menu": "2.1.15",
+ "@chakra-ui/modal": "2.2.12",
+ "@chakra-ui/number-input": "2.0.19",
+ "@chakra-ui/pin-input": "2.0.20",
+ "@chakra-ui/popover": "2.1.12",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/progress": "2.1.6",
+ "@chakra-ui/provider": "2.3.0",
+ "@chakra-ui/radio": "2.0.22",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/select": "2.0.19",
+ "@chakra-ui/skeleton": "2.0.24",
+ "@chakra-ui/skip-nav": "2.0.15",
+ "@chakra-ui/slider": "2.0.25",
+ "@chakra-ui/spinner": "2.0.13",
+ "@chakra-ui/stat": "2.0.18",
+ "@chakra-ui/stepper": "2.2.0",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/switch": "2.0.27",
+ "@chakra-ui/system": "2.5.8",
+ "@chakra-ui/table": "2.0.17",
+ "@chakra-ui/tabs": "2.1.9",
+ "@chakra-ui/tag": "3.0.0",
+ "@chakra-ui/textarea": "2.0.19",
+ "@chakra-ui/theme": "3.1.2",
+ "@chakra-ui/theme-utils": "2.0.18",
+ "@chakra-ui/toast": "6.1.4",
+ "@chakra-ui/tooltip": "2.2.9",
+ "@chakra-ui/transition": "2.0.16",
+ "@chakra-ui/utils": "2.0.15",
+ "@chakra-ui/visually-hidden": "2.0.15"
+ }
+ },
+ "@chakra-ui/react-children-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz",
+ "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA=="
+ },
+ "@chakra-ui/react-context": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz",
+ "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A=="
+ },
+ "@chakra-ui/react-env": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz",
+ "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/react-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz",
+ "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ=="
+ },
+ "@chakra-ui/react-use-animation-state": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.9.tgz",
+ "integrity": "sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-callback-ref": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz",
+ "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw=="
+ },
+ "@chakra-ui/react-use-controllable-state": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz",
+ "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-disclosure": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz",
+ "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-event-listener": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz",
+ "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-focus-effect": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.11.tgz",
+ "integrity": "sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-focus-on-pointer-down": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz",
+ "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==",
+ "requires": {
+ "@chakra-ui/react-use-event-listener": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-interval": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz",
+ "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-latest-ref": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz",
+ "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ=="
+ },
+ "@chakra-ui/react-use-merge-refs": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz",
+ "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw=="
+ },
+ "@chakra-ui/react-use-outside-click": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.1.0.tgz",
+ "integrity": "sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-pan-event": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz",
+ "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==",
+ "requires": {
+ "@chakra-ui/event-utils": "2.0.8",
+ "@chakra-ui/react-use-latest-ref": "2.0.5",
+ "framesync": "6.1.2"
+ }
+ },
+ "@chakra-ui/react-use-previous": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz",
+ "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw=="
+ },
+ "@chakra-ui/react-use-safe-layout-effect": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz",
+ "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ=="
+ },
+ "@chakra-ui/react-use-size": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz",
+ "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==",
+ "requires": {
+ "@zag-js/element-size": "0.3.2"
+ }
+ },
+ "@chakra-ui/react-use-timeout": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz",
+ "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-update-effect": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz",
+ "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg=="
+ },
+ "@chakra-ui/react-utils": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz",
+ "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==",
+ "requires": {
+ "@chakra-ui/utils": "2.0.15"
+ }
+ },
+ "@chakra-ui/select": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz",
+ "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/shared-utils": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz",
+ "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q=="
+ },
+ "@chakra-ui/skeleton": {
+ "version": "2.0.24",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz",
+ "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==",
+ "requires": {
+ "@chakra-ui/media-query": "3.2.12",
+ "@chakra-ui/react-use-previous": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/skip-nav": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.0.15.tgz",
+ "integrity": "sha512-5UtmlnV4BmIgEk6lQ0h81JEYhPX04wJEk5ZMoilQ2zEQYL6TkVVHkhRXyc1Zfq76hmHuZPXZV/yJeTecj6jIrA=="
+ },
+ "@chakra-ui/slider": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.25.tgz",
+ "integrity": "sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==",
+ "requires": {
+ "@chakra-ui/number-utils": "2.0.7",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-latest-ref": "2.0.5",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-pan-event": "2.0.9",
+ "@chakra-ui/react-use-size": "2.0.10",
+ "@chakra-ui/react-use-update-effect": "2.0.7"
+ }
+ },
+ "@chakra-ui/spinner": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz",
+ "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/stat": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz",
+ "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/stepper": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.2.0.tgz",
+ "integrity": "sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/styled-system": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.1.tgz",
+ "integrity": "sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5",
+ "csstype": "^3.0.11",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/switch": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.27.tgz",
+ "integrity": "sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==",
+ "requires": {
+ "@chakra-ui/checkbox": "2.2.15",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/system": {
+ "version": "2.5.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.8.tgz",
+ "integrity": "sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==",
+ "requires": {
+ "@chakra-ui/color-mode": "2.1.12",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-utils": "2.0.12",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme-utils": "2.0.18",
+ "@chakra-ui/utils": "2.0.15",
+ "react-fast-compare": "3.2.1"
+ }
+ },
+ "@chakra-ui/table": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz",
+ "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/tabs": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz",
+ "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==",
+ "requires": {
+ "@chakra-ui/clickable": "2.0.14",
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/tag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz",
+ "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8"
+ }
+ },
+ "@chakra-ui/textarea": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz",
+ "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/theme": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.1.2.tgz",
+ "integrity": "sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==",
+ "requires": {
+ "@chakra-ui/anatomy": "2.1.2",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/theme-tools": "2.0.18"
+ }
+ },
+ "@chakra-ui/theme-tools": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.18.tgz",
+ "integrity": "sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==",
+ "requires": {
+ "@chakra-ui/anatomy": "2.1.2",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "color2k": "^2.0.0"
+ }
+ },
+ "@chakra-ui/theme-utils": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.18.tgz",
+ "integrity": "sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme": "3.1.2",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/toast": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.4.tgz",
+ "integrity": "sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==",
+ "requires": {
+ "@chakra-ui/alert": "2.1.0",
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-timeout": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme": "3.1.2"
+ }
+ },
+ "@chakra-ui/tooltip": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.9.tgz",
+ "integrity": "sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/transition": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz",
+ "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/utils": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz",
+ "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==",
+ "requires": {
+ "@types/lodash.mergewith": "4.6.7",
+ "css-box-model": "1.2.1",
+ "framesync": "6.1.2",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/visually-hidden": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz",
+ "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw=="
+ },
+ "@corex/deepmerge": {
+ "version": "4.0.29",
+ "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.29.tgz",
+ "integrity": "sha512-q/yVUnqckA8Do+EvAfpy7RLdumnBy9ZsducMUtZTvpdbJC7azEf1hGtnYYxm0QfphYxjwggv6XtH64prvS1W+A=="
+ },
+ "@emotion/babel-plugin": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
+ "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/serialize": "^1.1.2",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+ }
+ }
+ },
+ "@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "requires": {
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
+ }
+ },
+ "@emotion/hash": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
+ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ },
+ "@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "requires": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ },
+ "@emotion/react": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
+ "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/cache": "^11.11.0",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "hoist-non-react-statics": "^3.3.1"
+ }
+ },
+ "@emotion/serialize": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
+ "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
+ "requires": {
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/unitless": "^0.8.1",
+ "@emotion/utils": "^1.2.1",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@emotion/sheet": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
+ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ },
+ "@emotion/styled": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
+ "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/is-prop-valid": "^1.2.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1"
+ }
+ },
+ "@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ },
+ "@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
+ "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw=="
+ },
+ "@emotion/utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
+ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ },
+ "@emotion/weak-memoize": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
+ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ },
+ "@eslint/eslintrc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
+ "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.1",
+ "globals": "^13.9.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@fullhuman/postcss-purgecss": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-4.1.3.tgz",
+ "integrity": "sha512-jqcsyfvq09VOsMXxJMPLRF6Fhg/NNltzWKnC9qtzva+QKTxerCO4esG6je7hbnmkpZtaDyPTwMBj9bzfWorsrw==",
+ "requires": {
+ "purgecss": "^4.1.3"
+ }
+ },
+ "@headlessui/react": {
+ "version": "1.7.15",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz",
+ "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==",
+ "requires": {
+ "client-only": "^0.0.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@next/env": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.6.tgz",
+ "integrity": "sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA=="
+ },
+ "@next/eslint-plugin-next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.6.tgz",
+ "integrity": "sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.7"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "@next/swc-android-arm-eabi": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.6.tgz",
+ "integrity": "sha512-BxBr3QAAAXWgk/K7EedvzxJr2dE014mghBSA9iOEAv0bMgF+MRq4PoASjuHi15M2zfowpcRG8XQhMFtxftCleQ==",
+ "optional": true
+ },
+ "@next/swc-android-arm64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.6.tgz",
+ "integrity": "sha512-EboEk3ROYY7U6WA2RrMt/cXXMokUTXXfnxe2+CU+DOahvbrO8QSWhlBl9I9ZbFzJx28AGB9Yo3oQHCvph/4Lew==",
+ "optional": true
+ },
+ "@next/swc-darwin-arm64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.6.tgz",
+ "integrity": "sha512-P0EXU12BMSdNj1F7vdkP/VrYDuCNwBExtRPDYawgSUakzi6qP0iKJpya2BuLvNzXx+XPU49GFuDC5X+SvY0mOw==",
+ "optional": true
+ },
+ "@next/swc-darwin-x64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz",
+ "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==",
+ "optional": true
+ },
+ "@next/swc-linux-arm-gnueabihf": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.6.tgz",
+ "integrity": "sha512-PvfEa1RR55dsik/IDkCKSFkk6ODNGJqPY3ysVUZqmnWMDSuqFtf7BPWHFa/53znpvVB5XaJ5Z1/6aR5CTIqxPw==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-gnu": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.6.tgz",
+ "integrity": "sha512-53QOvX1jBbC2ctnmWHyRhMajGq7QZfl974WYlwclXarVV418X7ed7o/EzGY+YVAEKzIVaAB9JFFWGXn8WWo0gQ==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-musl": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.6.tgz",
+ "integrity": "sha512-CMWAkYqfGdQCS+uuMA1A2UhOfcUYeoqnTW7msLr2RyYAys15pD960hlDfq7QAi8BCAKk0sQ2rjsl0iqMyziohQ==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-gnu": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.6.tgz",
+ "integrity": "sha512-AC7jE4Fxpn0s3ujngClIDTiEM/CQiB2N2vkcyWWn6734AmGT03Duq6RYtPMymFobDdAtZGFZd5nR95WjPzbZAQ==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-musl": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.6.tgz",
+ "integrity": "sha512-c9Vjmi0EVk0Kou2qbrynskVarnFwfYIi+wKufR9Ad7/IKKuP6aEhOdZiIIdKsYWRtK2IWRF3h3YmdnEa2WLUag==",
+ "optional": true
+ },
+ "@next/swc-win32-arm64-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.6.tgz",
+ "integrity": "sha512-3UTOL/5XZSKFelM7qN0it35o3Cegm6LsyuERR3/OoqEExyj3aCk7F025b54/707HTMAnjlvQK3DzLhPu/xxO4g==",
+ "optional": true
+ },
+ "@next/swc-win32-ia32-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.6.tgz",
+ "integrity": "sha512-8ZWoj6nCq6fI1yCzKq6oK0jE6Mxlz4MrEsRyu0TwDztWQWe7rh4XXGLAa2YVPatYcHhMcUL+fQQbqd1MsgaSDA==",
+ "optional": true
+ },
+ "@next/swc-win32-x64-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.6.tgz",
+ "integrity": "sha512-4ZEwiRuZEicXhXqmhw3+de8Z4EpOLQj/gp+D9fFWo6ii6W1kBkNNvvEx4A90ugppu+74pT1lIJnOuz3A9oQeJA==",
+ "optional": true
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@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
+ },
+ "@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"
+ }
+ },
+ "@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
+ },
+ "@react-leaflet/core": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz",
+ "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg=="
+ },
+ "@reduxjs/toolkit": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.8.2.tgz",
+ "integrity": "sha512-CtPw5TkN1pHRigMFCOS/0qg3b/yfPV5qGCsltVnIz7bx4PKTJlGHYfIxm97qskLknMzuGfjExaYdXJ77QTL0vg==",
+ "requires": {
+ "immer": "^9.0.7",
+ "redux": "^4.1.2",
+ "redux-thunk": "^2.4.1",
+ "reselect": "^4.1.5"
+ }
+ },
+ "@rushstack/eslint-patch": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz",
+ "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
+ "dev": true
+ },
+ "@sanity/client": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@sanity/client/-/client-3.3.0.tgz",
+ "integrity": "sha512-ecIRsV+IncI1P9I6ZdB3xKLBpWVggqtiY0RLWeT3RWaP4cX6lXzD5fPknaXaBnCxtIr9ZhqZVqpRkyjrUlHe0Q==",
+ "requires": {
+ "@sanity/eventsource": "^3.0.2",
+ "@sanity/generate-help-url": "^3.0.0",
+ "get-it": "^6.0.1",
+ "make-error": "^1.3.0",
+ "object-assign": "^4.1.1",
+ "rxjs": "^6.0.0"
+ }
+ },
+ "@sanity/eventsource": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@sanity/eventsource/-/eventsource-3.0.2.tgz",
+ "integrity": "sha512-cg0NTs75gbW84tpKFRBeFLbG6hSLp9U5mwLaGaMjuqP7DkfXbpkZsgRPPnRRVj1M+o32eiGZ8xQaLop2Ixn7yw==",
+ "requires": {
+ "event-source-polyfill": "1.0.25",
+ "eventsource": "^1.0.6"
+ }
+ },
+ "@sanity/generate-help-url": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sanity/generate-help-url/-/generate-help-url-3.0.0.tgz",
+ "integrity": "sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA=="
+ },
+ "@sanity/image-url": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@sanity/image-url/-/image-url-1.0.1.tgz",
+ "integrity": "sha512-AdKQ3zMk7WdoNwoJPrAvQhW+kUtBldBX0nHtnGy+rwmgsCQ0rAXasrgH43Fhmsp/yB6piiq+F2d5qEuBFsdQVg=="
+ },
+ "@sanity/timed-out": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@sanity/timed-out/-/timed-out-4.0.2.tgz",
+ "integrity": "sha512-NBDKGj14g9Z+bopIvZcQKWCzJq5JSrdmzRR1CS+iyA3Gm8SnIWBfZa7I3mTg2X6Nu8LQXG0EPKXdOGozLS4i3w=="
+ },
+ "@stripe/stripe-js": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.29.0.tgz",
+ "integrity": "sha512-OsUxk0VLlum8E2d6onlEdKuQcvLMs7qTrOXCnl/BGV3fAm65qr6h3e1IZ5AX4lgUlPRrzRcddSOA5DvkKKYLvg=="
+ },
+ "@types/bcryptjs": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
+ "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ=="
+ },
+ "@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/js-cookie": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.2.tgz",
+ "integrity": "sha512-6+0ekgfusHftJNYpihfkMu8BWdeHs9EOJuGcSofErjstGPfPGEu9yTu4t460lTzzAMl2cM5zngQJqPMHbbnvYA=="
+ },
+ "@types/json-schema": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA=="
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "@types/jsonwebtoken": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz",
+ "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/leaflet": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz",
+ "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==",
+ "requires": {
+ "@types/geojson": "*"
+ }
+ },
+ "@types/lodash": {
+ "version": "4.14.195",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
+ "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg=="
+ },
+ "@types/lodash.mergewith": {
+ "version": "4.6.7",
+ "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz",
+ "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==",
+ "requires": {
+ "@types/lodash": "*"
+ }
+ },
+ "@types/node": {
+ "version": "17.0.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz",
+ "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q=="
+ },
+ "@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.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "@types/react": {
+ "version": "18.0.8",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz",
+ "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.3.tgz",
+ "integrity": "sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-redux": {
+ "version": "7.1.24",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz",
+ "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "@types/react-slick": {
+ "version": "0.23.8",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.8.tgz",
+ "integrity": "sha512-SfzSg++/3uyftVZaCgHpW+2fnJFsyJEQ/YdsuqfOWQ5lqUYV/gY/UwAnkw4qksCj5jalto/T5rKXJ8zeFldQeA==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-star-rating-component": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@types/react-star-rating-component/-/react-star-rating-component-1.4.1.tgz",
+ "integrity": "sha512-f4rKKGvS9//wr2mjsT2Ol3N7tgV3DPmu4RZRp2dabEvYukHDx5tIjXecnEZGxpdU6HszKkvbpcy4kPq5VrAqew==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-transition-group": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz",
+ "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz",
+ "integrity": "sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.22.0",
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/typescript-estree": "5.22.0",
+ "debug": "^4.3.2"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz",
+ "integrity": "sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/visitor-keys": "5.22.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz",
+ "integrity": "sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz",
+ "integrity": "sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/visitor-keys": "5.22.0",
+ "debug": "^4.3.2",
+ "globby": "^11.0.4",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz",
+ "integrity": "sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "eslint-visitor-keys": "^3.0.0"
+ }
+ },
+ "@zag-js/element-size": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
+ "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
+ },
+ "@zag-js/focus-visible": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
+ "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
+ },
+ "@zeit/next-css": {
+ "version": "1.0.2-canary.0",
+ "resolved": "https://registry.npmjs.org/@zeit/next-css/-/next-css-1.0.2-canary.0.tgz",
+ "integrity": "sha512-7W4LAy1FDaYZF+kMbDVNy353tf/h90P8RWRCS9JlduTM/XOaUjYbZoa6oKOCZLPuePfSOYvFAz25WfTF2uqJ+Q==",
+ "requires": {
+ "css-loader": "1.0.0",
+ "extract-css-chunks-webpack-plugin": "^3.2.0",
+ "extracted-loader": "1.0.4",
+ "find-up": "2.1.0",
+ "ignore-loader": "0.1.2",
+ "postcss-loader": "3.0.0"
+ }
+ },
+ "acorn": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
+ "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "requires": {
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
+ }
+ },
+ "array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ }
+ },
+ "array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true
+ },
+ "axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "requires": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==",
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
+ }
+ }
+ },
+ "babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "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"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
+ },
+ "big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "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==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "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"
+ }
+ },
+ "broadcast-channel": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+ "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+ "requires": {
+ "@babel/runtime": "^7.7.2",
+ "detect-node": "^2.1.0",
+ "js-sha3": "0.8.0",
+ "microseconds": "0.2.0",
+ "nano-time": "1.0.0",
+ "oblivious-set": "1.0.0",
+ "rimraf": "3.0.2",
+ "unload": "2.2.0"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
+ "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001359",
+ "electron-to-chromium": "^1.4.172",
+ "node-releases": "^2.0.5",
+ "update-browserslist-db": "^1.0.4"
+ }
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+ "requires": {
+ "callsites": "^2.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="
+ }
+ }
+ },
+ "caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+ "requires": {
+ "caller-callsite": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "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==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001363",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
+ "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg=="
+ },
+ "capture-stack-trace": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz",
+ "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w=="
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "color2k": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz",
+ "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
+ },
+ "compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "requires": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "core-js-pure": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.0.tgz",
+ "integrity": "sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==",
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "css-box-model": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
+ "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
+ "requires": {
+ "tiny-invariant": "^1.0.6"
+ }
+ },
+ "css-loader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz",
+ "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==",
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "css-selector-tokenizer": "^0.7.0",
+ "icss-utils": "^2.1.0",
+ "loader-utils": "^1.0.2",
+ "lodash.camelcase": "^4.3.0",
+ "postcss": "^6.0.23",
+ "postcss-modules-extract-imports": "^1.2.0",
+ "postcss-modules-local-by-default": "^1.2.0",
+ "postcss-modules-scope": "^1.1.0",
+ "postcss-modules-values": "^1.3.0",
+ "postcss-value-parser": "^3.3.0",
+ "source-list-map": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "css-selector-tokenizer": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+ "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
+ "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.11",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
+ "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "requires": {
+ "mimic-response": "^3.1.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dev": true,
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "defined": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+ "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ }
+ },
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "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==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.447",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz",
+ "integrity": "sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
+ "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.21.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz",
+ "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==",
+ "dev": true,
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.0",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.9"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ },
+ "eslint": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
+ "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.2.2",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
+ },
+ "eslint-config-next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.1.6.tgz",
+ "integrity": "sha512-qoiS3g/EPzfCTkGkaPBSX9W0NGE/B1wNO3oWrd76QszVGrdpLggNqcO8+LR6MB0CNqtp9Q8NoeVrxNVbzM9hqA==",
+ "dev": true,
+ "requires": {
+ "@next/eslint-plugin-next": "12.1.6",
+ "@rushstack/eslint-patch": "^1.1.3",
+ "@typescript-eslint/parser": "^5.21.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^2.7.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.29.4",
+ "eslint-plugin-react-hooks": "^4.5.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7",
+ "resolve": "^1.20.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-import-resolver-typescript": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz",
+ "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "glob": "^7.2.0",
+ "is-glob": "^4.0.3",
+ "resolve": "^1.22.0",
+ "tsconfig-paths": "^3.14.1"
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
+ "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.4",
+ "array.prototype.flat": "^1.2.5",
+ "debug": "^2.6.9",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-module-utils": "^2.7.3",
+ "has": "^1.0.3",
+ "is-core-module": "^2.8.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.5",
+ "resolve": "^1.22.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
+ "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.16.3",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.4",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.3.5",
+ "axobject-query": "^2.2.0",
+ "damerau-levenshtein": "^1.0.7",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.2.1",
+ "language-tags": "^1.0.5",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.29.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
+ "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.4",
+ "array.prototype.flatmap": "^1.2.5",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.5",
+ "object.fromentries": "^2.0.5",
+ "object.hasown": "^1.1.0",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.3",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.6"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz",
+ "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz",
+ "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "event-source-polyfill": {
+ "version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz",
+ "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg=="
+ },
+ "eventsource": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz",
+ "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA=="
+ },
+ "extract-css-chunks-webpack-plugin": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/extract-css-chunks-webpack-plugin/-/extract-css-chunks-webpack-plugin-3.3.3.tgz",
+ "integrity": "sha512-4DYo3jna9ov81rdKtE1U2cirb3ERoWhHldzRxZWx3Q5i5Dm6U+mmfon7PmaKDuh6+xySVOqtlXrZyJY2V4tc+g==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "lodash": "^4.17.11",
+ "normalize-url": "^3.3.0",
+ "schema-utils": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "extracted-loader": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/extracted-loader/-/extracted-loader-1.0.4.tgz",
+ "integrity": "sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q=="
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-glob": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
+ "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
+ },
+ "fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "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"
+ }
+ },
+ "find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "focus-lock": {
+ "version": "0.11.6",
+ "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
+ "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==",
+ "requires": {
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
+ "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "form-urlencoded": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz",
+ "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA=="
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true
+ },
+ "framer-motion": {
+ "version": "10.12.16",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.16.tgz",
+ "integrity": "sha512-w/SfWEIWJkYSgRHYBmln7EhcNo31ao8Xexol8lGXf1pR/tlnBtf1HcxoUmEiEh6pacB4/geku5ami53AAQWHMQ==",
+ "requires": {
+ "@emotion/is-prop-valid": "^0.8.2",
+ "tslib": "^2.4.0"
+ },
+ "dependencies": {
+ "@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "requires": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
+ "tslib": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz",
+ "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w=="
+ }
+ }
+ },
+ "framesync": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
+ "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
+ "requires": {
+ "tslib": "2.4.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "dev": true
+ },
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-it": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/get-it/-/get-it-6.1.0.tgz",
+ "integrity": "sha512-hvk2h2hiOHji57MpBQ/o9CnJT7hpNII7Jio3AyY41I7AmkUVvnYrpQAPIQGc3j7R5QNYnhwyXmok+DSSdBLWbg==",
+ "requires": {
+ "@sanity/timed-out": "^4.0.2",
+ "create-error-class": "^3.0.2",
+ "debug": "^2.6.8",
+ "decompress-response": "^6.0.0",
+ "follow-redirects": "^1.2.4",
+ "form-urlencoded": "^2.0.7",
+ "into-stream": "^3.1.0",
+ "is-plain-object": "^2.0.4",
+ "is-retry-allowed": "^1.1.0",
+ "is-stream": "^1.1.0",
+ "nano-pubsub": "^1.0.2",
+ "object-assign": "^4.1.1",
+ "parse-headers": "^2.0.4",
+ "progress-stream": "^2.0.0",
+ "same-origin": "^0.1.1",
+ "simple-concat": "^1.0.1",
+ "tunnel-agent": "^0.6.0",
+ "url-parse": "^1.1.9"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "goober": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.9.tgz",
+ "integrity": "sha512-PAtnJbrWtHbfpJUIveG5PJIB6Mc9Kd0gimu9wZwPyA+wQUSeOeA4x4Ug16lyaaUUKZ/G6QEH1xunKOuXP1F4Vw=="
+ },
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ }
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="
+ },
+ "icss-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+ "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==",
+ "requires": {
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "ignore-loader": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz",
+ "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA=="
+ },
+ "immer": {
+ "version": "9.0.14",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz",
+ "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw=="
+ },
+ "import-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+ "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==",
+ "requires": {
+ "import-from": "^2.1.0"
+ }
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-from": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+ "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==",
+ "requires": {
+ "resolve-from": "^3.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "into-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+ "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==",
+ "requires": {
+ "from2": "^2.1.1",
+ "p-is-promise": "^1.1.0"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "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==",
+ "dev": true,
+ "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",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "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
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
+ },
+ "js-cookie": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+ "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw=="
+ },
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+ },
+ "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",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "requires": {
+ "string-convert": "^0.2.0"
+ }
+ },
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
+ "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true
+ },
+ "language-tags": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.8.tgz",
+ "integrity": "sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==",
+ "dev": true,
+ "requires": {
+ "language-subtag-registry": "^0.3.20"
+ }
+ },
+ "leaflet": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
+ "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
+ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "dev": true
+ },
+ "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": "2.0.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+ "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ }
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "requires": {
+ "p-locate": "^2.0.0",
+ "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.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "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.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ },
+ "match-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
+ "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "remove-accents": "0.4.2"
+ }
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "microseconds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+ "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "nano-pubsub": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nano-pubsub/-/nano-pubsub-1.0.2.tgz",
+ "integrity": "sha512-HtPs1RbULM/z8wt3BbeeZlxVNiJbl+zQAwwrbc0KAq5NHaCG3MmffOVCpRhNTs+TK67MdN6aZ+5wzPtRZvME+w=="
+ },
+ "nano-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+ "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+ "requires": {
+ "big-integer": "^1.6.16"
+ }
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz",
+ "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==",
+ "requires": {
+ "@next/env": "12.1.6",
+ "@next/swc-android-arm-eabi": "12.1.6",
+ "@next/swc-android-arm64": "12.1.6",
+ "@next/swc-darwin-arm64": "12.1.6",
+ "@next/swc-darwin-x64": "12.1.6",
+ "@next/swc-linux-arm-gnueabihf": "12.1.6",
+ "@next/swc-linux-arm64-gnu": "12.1.6",
+ "@next/swc-linux-arm64-musl": "12.1.6",
+ "@next/swc-linux-x64-gnu": "12.1.6",
+ "@next/swc-linux-x64-musl": "12.1.6",
+ "@next/swc-win32-arm64-msvc": "12.1.6",
+ "@next/swc-win32-ia32-msvc": "12.1.6",
+ "@next/swc-win32-x64-msvc": "12.1.6",
+ "caniuse-lite": "^1.0.30001332",
+ "postcss": "8.4.5",
+ "styled-jsx": "5.0.2"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.4.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+ "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+ "requires": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ }
+ }
+ }
+ },
+ "next-connect": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/next-connect/-/next-connect-0.12.2.tgz",
+ "integrity": "sha512-B/zKHPs5S7XWvAVsZVLvOeY2eL2U3g0W/BgCDetEJRcNDzxX2vi8rzqBuEoLLPlI8LvtHwujDVUFFjSgOEZTbA==",
+ "requires": {
+ "trouter": "^3.2.0"
+ }
+ },
+ "next-sanity-image": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/next-sanity-image/-/next-sanity-image-3.2.1.tgz",
+ "integrity": "sha512-lnynR/h7kD5ueVxQoam8ElKXb+bGWuU1cP+PCwx1NzIiBUHM2wBMnvmpt+emubGocMaIURT/iwPU46VnmB9rsQ==",
+ "requires": {
+ "@sanity/image-url": "^0.140.22"
+ },
+ "dependencies": {
+ "@sanity/image-url": {
+ "version": "0.140.22",
+ "resolved": "https://registry.npmjs.org/@sanity/image-url/-/image-url-0.140.22.tgz",
+ "integrity": "sha512-CAmQZnj+KM7FSEYiWlIGDit072syicYuAw0w7R2ctMzHiZ4p9mE/g6dBnYqrqFUrw2J+GpJgPt+RVspKP8vdqA=="
+ }
+ }
+ },
+ "next-sitemap": {
+ "version": "3.1.17",
+ "resolved": "https://registry.npmjs.org/next-sitemap/-/next-sitemap-3.1.17.tgz",
+ "integrity": "sha512-xop7KgEbWsqOe4Fr50g9RQ1UGb1bAEJoKYVVynbUqietpSltAnCIzvq/StL2gZcNyFW9K+9tZV7EpcD+72gRrA==",
+ "requires": {
+ "@corex/deepmerge": "^4.0.29",
+ "minimist": "^1.2.6"
+ }
+ },
+ "next-themes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.0.tgz",
+ "integrity": "sha512-myhpDL4vadBD9YDSHiewqvzorGzB03N84e+3LxCwHRlM/hiBOaW+UsKsQojQAzC7fdcJA0l2ppveXcYaVV+hxQ=="
+ },
+ "nextjs-progressbar": {
+ "version": "0.0.14",
+ "resolved": "https://registry.npmjs.org/nextjs-progressbar/-/nextjs-progressbar-0.0.14.tgz",
+ "integrity": "sha512-AXYXHDN6M52AwFnGqH/vlwyo0gbC9zM7QS/4ryOTI0RUqfze5FJl8uSrxKJMzK6hGFdDeQXcZoWsLGXeCVtTwg==",
+ "requires": {
+ "nprogress": "^0.2.0",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+ },
+ "nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ },
+ "object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "oblivious-set": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+ "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-is-promise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg=="
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww=="
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-headers": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "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=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "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=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-load-config": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+ "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "import-cwd": "^2.0.0"
+ }
+ },
+ "postcss-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "postcss": "^7.0.0",
+ "postcss-load-config": "^2.0.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
+ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+ "requires": {
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+ "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==",
+ "requires": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+ "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==",
+ "requires": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-values": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+ "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==",
+ "requires": {
+ "icss-replace-symbols": "^1.1.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "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==",
+ "dev": true
+ },
+ "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
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "progress-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz",
+ "integrity": "sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==",
+ "requires": {
+ "speedometer": "~1.0.0",
+ "through2": "~2.0.3"
+ }
+ },
+ "prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+ },
+ "purgecss": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz",
+ "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==",
+ "requires": {
+ "commander": "^8.0.0",
+ "glob": "^7.1.7",
+ "postcss": "^8.3.5",
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "qs": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+ "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "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
+ },
+ "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==",
+ "dev": true
+ },
+ "react": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz",
+ "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-clientside-effect": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz",
+ "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==",
+ "requires": {
+ "@babel/runtime": "^7.12.13"
+ }
+ },
+ "react-dom": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz",
+ "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.22.0"
+ }
+ },
+ "react-fast-compare": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz",
+ "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg=="
+ },
+ "react-focus-lock": {
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz",
+ "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==",
+ "requires": {
+ "@babel/runtime": "^7.0.0",
+ "focus-lock": "^0.11.6",
+ "prop-types": "^15.6.2",
+ "react-clientside-effect": "^1.2.6",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ }
+ },
+ "react-hot-toast": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.2.0.tgz",
+ "integrity": "sha512-248rXw13uhf/6TNDVzagX+y7R8J183rp7MwUMNkcrBRyHj/jWOggfXTGlM8zAOuh701WyVW+eUaWG2LeSufX9g==",
+ "requires": {
+ "goober": "^2.1.1"
+ }
+ },
+ "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=="
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "react-leaflet": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz",
+ "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==",
+ "requires": {
+ "@react-leaflet/core": "^2.1.0"
+ }
+ },
+ "react-leaflet-custom-control": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/react-leaflet-custom-control/-/react-leaflet-custom-control-1.3.5.tgz",
+ "integrity": "sha512-9/v7AxY6CoUbc6fAD/0u8O6wCBopxtdzJukWOR7vLZcyAN5rQCYWXjF5wXJ8klONweZGsRaGPJelfEBRtZAgQA=="
+ },
+ "react-query": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.38.1.tgz",
+ "integrity": "sha512-CM9hsz6oib17hsBguGaMJr+a0swMzou2gvNHHjAusnXvkfTx6CTzx0Iwuplox1jI2j3WiY91BGrcIN6bp1n1Iw==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "broadcast-channel": "^3.4.1",
+ "match-sorter": "^6.0.2"
+ }
+ },
+ "react-redux": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.2.tgz",
+ "integrity": "sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
+ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg=="
+ }
+ }
+ },
+ "react-remove-scroll": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz",
+ "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==",
+ "requires": {
+ "react-remove-scroll-bar": "^2.3.4",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-remove-scroll-bar": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
+ "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "requires": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "dependencies": {
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ }
+ }
+ },
+ "react-star-rating-component": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/react-star-rating-component/-/react-star-rating-component-1.4.1.tgz",
+ "integrity": "sha512-i0YEvQzToS0s0GDkxn01Jy4EeLpVEyh023NXJTJ+/1+xkvhpACyD4d1YeBhYWZab53ppUnUxs5gmp75gJr3khA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "prop-types": "^15.6.1"
+ },
+ "dependencies": {
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ }
+ }
+ },
+ "react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "requires": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-toastify": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.7.tgz",
+ "integrity": "sha512-UG5P/2F/fYdbK+v3XRWHM6xfMkWeLM+k2swKvwU8oO9DXx31GkeoH7Z6slBTkavZ0VjoQ+n/YD6xOBqEwN7HRg==",
+ "requires": {
+ "clsx": "^1.1.1"
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "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==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-thunk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
+ "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q=="
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ }
+ },
+ "regexparam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-1.3.0.tgz",
+ "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g=="
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "remove-accents": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
+ "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "reselect": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz",
+ "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ=="
+ },
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "requires": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "same-origin": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/same-origin/-/same-origin-0.1.1.tgz",
+ "integrity": "sha512-effkSW9cap879l6CVNdwL5iubVz8tkspqgfiqwgBgFQspV7152WHaLzr5590yR8oFgt7E1d4lO09uUhtAgUPoA=="
+ },
+ "scheduler": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz",
+ "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+ "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+ "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA=="
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+ },
+ "speedometer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz",
+ "integrity": "sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw=="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "stripe": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-9.1.0.tgz",
+ "integrity": "sha512-Kpa+DoB5GCV360a6fvIrWokLhj3SXRadWAxR6duN2mIgrIkvLK0tVDd8b2OT2/QtJ6WX9EI3vLvaErzG76d+tg==",
+ "requires": {
+ "@types/node": ">=8.1.0",
+ "qs": "^6.10.3"
+ }
+ },
+ "styled-jsx": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
+ "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ=="
+ },
+ "stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "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=="
+ },
+ "tailwindcss": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz",
+ "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==",
+ "dev": true,
+ "requires": {
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "detective": "^5.2.1",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "lilconfig": "^2.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.4",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "dependencies": {
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ },
+ "to-regex-range": {
+ "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"
+ }
+ },
+ "toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
+ "trouter": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/trouter/-/trouter-3.2.0.tgz",
+ "integrity": "sha512-rLLXbhTObLy2MBVjLC+jTnoIKw99n0GuJs9ov10J870vDw5qhTurPzsDrudNtBf5w/CZ9ctZy2p2IMmhGcel2w==",
+ "requires": {
+ "regexparam": "^1.3.0"
+ }
+ },
+ "tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
+ },
+ "typescript": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==",
+ "dev": true
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unload": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+ "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+ "requires": {
+ "@babel/runtime": "^7.6.2",
+ "detect-node": "^2.0.4"
+ }
+ },
+ "update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use-callback-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
+ "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "requires": {
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "requires": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "use-sync-external-store": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
+ "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "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/apps/mobility-bap/package.json b/apps/mobility-bap/package.json
new file mode 100644
index 000000000..5a8fd629c
--- /dev/null
+++ b/apps/mobility-bap/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "@beckn-ui/mobility-bap",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "postbuild": "next-sitemap",
+ "export": "next export"
+ },
+ "prettier": "@beckn-ui/prettier-config",
+ "dependencies": {
+ "@chakra-ui/icons": "^2.0.19",
+ "@chakra-ui/react": "^2.7.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.11.0",
+ "@fullhuman/postcss-purgecss": "^4.1.3",
+ "@headlessui/react": "^1.7.15",
+ "@reduxjs/toolkit": "^1.8.2",
+ "@sanity/client": "^3.3.0",
+ "@sanity/image-url": "^1.0.1",
+ "@stripe/stripe-js": "^1.29.0",
+ "@types/bcryptjs": "^2.4.2",
+ "@types/js-cookie": "^3.0.2",
+ "@types/jsonwebtoken": "^8.5.8",
+ "@types/leaflet": "^1.9.3",
+ "@types/react-redux": "^7.1.24",
+ "@types/react-slick": "^0.23.8",
+ "@types/react-star-rating-component": "^1.4.1",
+ "@types/react-transition-group": "^4.4.4",
+ "@zeit/next-css": "^1.0.2-canary.0",
+ "axios": "^0.27.2",
+ "bcryptjs": "^2.4.3",
+ "classnames": "^2.3.2",
+ "framer-motion": "^10.12.16",
+ "js-cookie": "^3.0.1",
+ "jsonwebtoken": "^8.5.1",
+ "leaflet": "^1.9.4",
+ "next": "^13.4.19",
+ "next-connect": "^0.12.2",
+ "next-sanity-image": "^3.2.1",
+ "next-sitemap": "^3.1.17",
+ "next-themes": "^0.2.0",
+ "nextjs-progressbar": "^0.0.14",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hot-toast": "^2.2.0",
+ "react-icons": "^4.3.1",
+ "react-leaflet": "^4.2.1",
+ "react-leaflet-custom-control": "^1.3.5",
+ "react-query": "^3.38.1",
+ "react-redux": "^8.0.2",
+ "react-slick": "^0.29.0",
+ "react-star-rating-component": "^1.4.1",
+ "react-toastify": "^9.0.7",
+ "react-transition-group": "^4.4.5",
+ "slick-carousel": "^1.8.1",
+ "stripe": "^9.1.0",
+ "url-loader": "^4.1.1"
+ },
+ "devDependencies": {
+ "@beckn-ui/prettier-config": "workspace:^",
+ "@types/node": "17.0.31",
+ "@types/react": "18.0.8",
+ "@types/react-dom": "18.0.3",
+ "autoprefixer": "^10.4.7",
+ "eslint": "8.14.0",
+ "eslint-config-next": "latest",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "prettier": "^3.0.3",
+ "tailwindcss": "^3.1.4",
+ "typescript": "4.6.4"
+ }
+}
diff --git a/apps/mobility-bap/pages/_app.tsx b/apps/mobility-bap/pages/_app.tsx
new file mode 100644
index 000000000..9a9912fd7
--- /dev/null
+++ b/apps/mobility-bap/pages/_app.tsx
@@ -0,0 +1,23 @@
+import type { AppProps } from 'next/app'
+
+import Layout from '../components/layout/Layout'
+
+import 'slick-carousel/slick/slick.css'
+import 'slick-carousel/slick/slick-theme.css'
+
+import 'react-toastify/dist/ReactToastify.css'
+import { ChakraProvider } from '@chakra-ui/react'
+
+import '../styles/globals.css'
+
+function MyApp({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+
+
+ )
+}
+
+export default MyApp
diff --git a/apps/mobility-bap/pages/_document.tsx b/apps/mobility-bap/pages/_document.tsx
new file mode 100644
index 000000000..6c4908511
--- /dev/null
+++ b/apps/mobility-bap/pages/_document.tsx
@@ -0,0 +1,34 @@
+import { Html, Head, Main, NextScript } from 'next/document'
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/mobility-bap/pages/api/hello.ts b/apps/mobility-bap/pages/api/hello.ts
new file mode 100644
index 000000000..9bafa6e25
--- /dev/null
+++ b/apps/mobility-bap/pages/api/hello.ts
@@ -0,0 +1,10 @@
+// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+type Data = {
+ name: string
+}
+
+export default function handler(req: NextApiRequest, res: NextApiResponse) {
+ res.status(200).json({ name: 'John Doe' })
+}
diff --git a/apps/mobility-bap/pages/api/users/login.ts b/apps/mobility-bap/pages/api/users/login.ts
new file mode 100644
index 000000000..824b3d025
--- /dev/null
+++ b/apps/mobility-bap/pages/api/users/login.ts
@@ -0,0 +1,32 @@
+import { NextApiRequest, NextApiResponse } from 'next'
+import nc from 'next-connect'
+import bcrypt from 'bcryptjs'
+import { client } from '../../../lib/client'
+import { signToken } from '../../../utilities/auth'
+
+const handler = nc()
+
+handler.post(async (req: NextApiRequest, res: NextApiResponse) => {
+ const user = await client.fetch(`*[_type == "user" && email == $email][0]`, {
+ email: req.body.email
+ })
+ if (user && bcrypt.compareSync(req.body.password, user.password)) {
+ const token = signToken({
+ _id: user._id,
+ name: user.name,
+ email: user.email,
+ isAdmin: user.isAdmin
+ })
+ res.send({
+ _id: user._id,
+ name: user.name,
+ email: user.email,
+ isAdmin: user.isAdmin,
+ token
+ })
+ } else {
+ res.status(401).send({ message: 'Invalid_email_or_password' })
+ }
+})
+
+export default handler
diff --git a/apps/mobility-bap/pages/api/users/register.ts b/apps/mobility-bap/pages/api/users/register.ts
new file mode 100644
index 000000000..d94d3c868
--- /dev/null
+++ b/apps/mobility-bap/pages/api/users/register.ts
@@ -0,0 +1,53 @@
+import { NextApiRequest, NextApiResponse } from 'next'
+import nc from 'next-connect'
+import bcrypt from 'bcryptjs'
+import axios from 'axios'
+import config from '../../../lib/config'
+import { client } from '../../../lib/client'
+import { signToken } from '../../../utilities/auth'
+
+const handler = nc()
+
+handler.post(async (req: NextApiRequest, res: NextApiResponse) => {
+ const projectId = config.projectId
+ const dataset = config.dataset
+ const tokenWithWriteAccess = process.env.NEXT_PUBLIC_SANITY_TOKEN
+ const createMutations = [
+ {
+ create: {
+ _type: 'user',
+ name: req.body.name,
+ email: req.body.email,
+ password: bcrypt.hashSync(req.body.password),
+ isAdmin: false
+ }
+ }
+ ]
+ const existUser = await client.fetch(`*[_type == "user" && email == $email][0]`, {
+ email: req.body.email
+ })
+ if (existUser) {
+ return res.status(401).send({ message: 'Email_already_exists' })
+ }
+ const { data } = await axios.post(
+ `https://${projectId}.api.sanity.io/v2021-06-07/data/mutate/${dataset}?returnIds=true`,
+ { mutations: createMutations },
+ {
+ headers: {
+ 'Content-type': 'application/json',
+ Authorization: `Bearer ${tokenWithWriteAccess}`
+ }
+ }
+ )
+ const userId = data.results[0].id
+ const user = {
+ _id: userId,
+ name: req.body.name,
+ email: req.body.email,
+ isAdmin: false
+ }
+ const token = signToken(user)
+ res.send({ ...user, token })
+})
+
+export default handler
diff --git a/apps/mobility-bap/pages/homePage.tsx b/apps/mobility-bap/pages/homePage.tsx
new file mode 100644
index 000000000..ba53c7b99
--- /dev/null
+++ b/apps/mobility-bap/pages/homePage.tsx
@@ -0,0 +1,337 @@
+import React, { useRef, useEffect, useState } from 'react'
+import { Transition } from 'react-transition-group'
+import dynamic from 'next/dynamic'
+import BottomModal from '../components/BottomModal'
+import OptionCard from '../components/Map/OptionCard'
+import { optionData } from '../components/Map/StoreMarkerData'
+import { useRouter } from 'next/router'
+import useRequest from '../hooks/useRequest'
+import cs from 'classnames'
+import { Image } from '@chakra-ui/react'
+import { useLanguage } from '../hooks/useLanguage'
+import { Button } from '@beckn-ui/molecules'
+import MapSearch from '../components/Map/MapSearch'
+import { isEmpty } from 'lodash'
+
+const tagValuetoApiMap: { [key: string]: string } = {
+ Books: 'books',
+ restaurant: 'bakery'
+}
+
+enum StoreType {
+ books = 'Books',
+ restaurant = 'restaurant'
+}
+
+type Coords = {
+ lat: number
+ long: number
+}
+type OptionType = {
+ tagName: string
+ tagValue: string
+ title?: string
+}
+
+const initialOption: OptionType = {
+ tagName: '',
+ tagValue: ''
+}
+
+const duration = 300
+
+const defaultStyle = {
+ transition: `height ${duration}ms ease-in-out`,
+ height: '4rem'
+}
+
+const transitionStyles = {
+ entering: { height: '12rem' },
+ entered: { height: '12rem' },
+ exiting: { height: '3.8rem' },
+ exited: { height: '3.8rem' }
+}
+
+const getProperImages = (selectedStore: any) => {
+ if (selectedStore && selectedStore.tags) {
+ if (selectedStore.tags.image) return selectedStore.tags.image
+ else return selectedStore.tags.images
+ } else return ''
+}
+
+const staticTagsList = ['inStoreShopping', 'delivery', 'clickAndCollect']
+
+const getStaticTags = (tag: string) => {
+ if (tag === StoreType.books) return ['inStoreShopping', 'delivery', 'clickAndCollect']
+ else return ['dineIn', 'takeAway', 'delivery']
+}
+
+const Homepage = () => {
+ const MapWithNoSSR = dynamic(() => import('../components/Map'), {
+ ssr: false
+ })
+
+ const nodeRef = useRef(null)
+ const [showSuggestions, setShowSuggestions] = useState(false)
+
+ const { t, locale } = useLanguage()
+
+ // create a state value called query in typescript
+ const [query, setQuery] = useState('')
+ // const [coords, setCoords] = useState({
+ // lat: 48.719242,
+ // long: 2.346078,
+ // });
+ const [coords, setCoords] = useState({
+ lat: 48.800345,
+ long: 2.346078
+ })
+
+ const [isOptionModalOpen, setIsOptionModalOpen] = useState(true)
+ const [isOptionDetailOpen, setIsOptionDetailOpen] = useState(false)
+ const [isMenuModalOpen, setIsMenuModalOpen] = useState(true)
+ const [option, setOption] = useState(initialOption)
+
+ //TODO local store and coords states can be removed in further iterations
+ const [stores, setStores] = useState([])
+ // const [selectedStore, setSelectedStore] = useState(null);
+ const [selectedStore, setSelectedStore] = useState(null)
+
+ const { data: searchedLocationData, loading, error, fetchData } = useRequest()
+ const { data: locationData, loading: loadingLocation, error: locationError, fetchData: fetchLocation } = useRequest()
+ const { data: storesByLocation, loading: loadingStores, error: errorStores, fetchData: fetchStores } = useRequest()
+ const router = useRouter()
+
+ useEffect(() => {
+ setOption(JSON.parse(localStorage.getItem('selectedOption') as string))
+ }, [])
+
+ useEffect(() => {
+ localStorage.setItem('selectedOption', JSON.stringify(option))
+ }, [option])
+
+ const handleModalOpen = () => {
+ setIsOptionModalOpen(prevState => !prevState)
+ }
+
+ const handleModalClose = () => {
+ setIsOptionModalOpen(false)
+ }
+
+ const handleOptionDetailOpen = () => {
+ setIsOptionDetailOpen(prevState => !prevState)
+ }
+
+ const handleOptionDetailClose = () => {
+ setIsOptionDetailOpen(false)
+ setSelectedStore(null)
+ }
+
+ const handleLocationClick = (lat: number, long: number) => {
+ setCoords({ lat, long })
+ }
+
+ const fetchLocationByQuery = (query: string) => {
+ const url = `${process.env.NEXT_PUBLIC_NOMINATIM_URL}/search?format=jsonv2&q=${query}`
+
+ fetchData(url, 'GET')
+ }
+
+ const fetchLocationNameByCoords = (lat: number, long: number) => {
+ const url = `${process.env.NEXT_PUBLIC_NOMINATIM_URL}/reverse?format=jsonv2&lat=${lat}&lon=${long}`
+
+ fetchLocation(url, 'GET')
+ }
+
+ const fetchStoresByLocation = (lat: number, long: number, tagValue: string, tagName: string) => {
+ // static tagName and tagValue for now
+ const url = `${process.env.NEXT_PUBLIC_BECKN_API_URL}/stores?tagName=becknified&tagValue=true&latitude=${lat}&longitude=${long}&filter=${tagValuetoApiMap[tagValue]}`
+
+ // Only fetch when Books are selected for now
+ fetchStores(url, 'GET')
+ }
+
+ useEffect(() => {
+ // Not refilling stores if option is empty
+ if (storesByLocation && !isEmpty(option.tagValue)) {
+ setStores(storesByLocation)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [storesByLocation])
+
+ useEffect(() => {
+ if (isEmpty(query) && !isEmpty(coords)) {
+ fetchLocationNameByCoords(coords.lat, coords.long)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [coords])
+
+ useEffect(() => {
+ if (
+ !isEmpty(coords) &&
+ !isEmpty(option?.tagValue) &&
+ (option?.tagValue === StoreType.books || option?.tagValue === StoreType.restaurant)
+ ) {
+ fetchStoresByLocation(coords.lat, coords.long, option?.tagValue, option?.tagName)
+ }
+ if (option?.tagValue !== StoreType.books) {
+ setStores([])
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [coords, option])
+
+ //resetting option state and stores when location changes
+ useEffect(() => {
+ // setOption(initialOption);
+ setStores([])
+ }, [coords])
+
+ return (
+
+
+ {!showSuggestions && (
+ <>
+
+
+
+
+
+
+ {state => (
+
+
setIsMenuModalOpen(prev => !prev)}>
+
+
{t.explorePlaces}
+
+
+ {optionData.map((currentOption, index) => {
+ const isSelected = option ? option.tagValue === currentOption.tagValue : false
+ const optionMeta = {
+ tagName: currentOption.tagName,
+ tagValue: currentOption.tagValue,
+ title: currentOption.title
+ }
+ const optionIcons = {
+ iconUrl: currentOption.iconUrl,
+ iconUrlLight: currentOption.iconUrl_light
+ }
+ return (
+
+ )
+ })}
+
+
+ )}
+
+
+
+
+
+
+ {t[option?.tagValue === StoreType.books ? 'localStores' : 'restaurants']}{' '}
+ {query ? query : locationData?.name} {' '}
+
+
+
+ {selectedStore?.tags.name} -{' '}
+ {option?.tagValue === StoreType.books ? t.bookstore : t.optionRestaurant}
+
+
+
+ {getProperImages(selectedStore)
+ .split(',')
+ .map((singleImage: string, i: number) => {
+ return (
+
+ )
+ })}
+
+
+ {selectedStore?.tags['addr:full'] || selectedStore?.tags['addr:street']}
+
+
+ {getStaticTags(option?.tagValue).map((tag, i) => {
+ return (
+
+ )
+ })}
+
+
{
+ router.push('/search')
+ localStorage.setItem('optionTags', JSON.stringify(selectedStore?.tags))
+ }}
+ className="px-[47px] mt-1 py-[12px] bg-palette-primary border_radius_all text-white"
+ >
+ {t['shopButton']}
+
+
+
+ >
+ )}
+
+ )
+}
+
+export default Homepage
diff --git a/apps/mobility-bap/pages/index.tsx b/apps/mobility-bap/pages/index.tsx
new file mode 100644
index 000000000..ba53c7b99
--- /dev/null
+++ b/apps/mobility-bap/pages/index.tsx
@@ -0,0 +1,337 @@
+import React, { useRef, useEffect, useState } from 'react'
+import { Transition } from 'react-transition-group'
+import dynamic from 'next/dynamic'
+import BottomModal from '../components/BottomModal'
+import OptionCard from '../components/Map/OptionCard'
+import { optionData } from '../components/Map/StoreMarkerData'
+import { useRouter } from 'next/router'
+import useRequest from '../hooks/useRequest'
+import cs from 'classnames'
+import { Image } from '@chakra-ui/react'
+import { useLanguage } from '../hooks/useLanguage'
+import { Button } from '@beckn-ui/molecules'
+import MapSearch from '../components/Map/MapSearch'
+import { isEmpty } from 'lodash'
+
+const tagValuetoApiMap: { [key: string]: string } = {
+ Books: 'books',
+ restaurant: 'bakery'
+}
+
+enum StoreType {
+ books = 'Books',
+ restaurant = 'restaurant'
+}
+
+type Coords = {
+ lat: number
+ long: number
+}
+type OptionType = {
+ tagName: string
+ tagValue: string
+ title?: string
+}
+
+const initialOption: OptionType = {
+ tagName: '',
+ tagValue: ''
+}
+
+const duration = 300
+
+const defaultStyle = {
+ transition: `height ${duration}ms ease-in-out`,
+ height: '4rem'
+}
+
+const transitionStyles = {
+ entering: { height: '12rem' },
+ entered: { height: '12rem' },
+ exiting: { height: '3.8rem' },
+ exited: { height: '3.8rem' }
+}
+
+const getProperImages = (selectedStore: any) => {
+ if (selectedStore && selectedStore.tags) {
+ if (selectedStore.tags.image) return selectedStore.tags.image
+ else return selectedStore.tags.images
+ } else return ''
+}
+
+const staticTagsList = ['inStoreShopping', 'delivery', 'clickAndCollect']
+
+const getStaticTags = (tag: string) => {
+ if (tag === StoreType.books) return ['inStoreShopping', 'delivery', 'clickAndCollect']
+ else return ['dineIn', 'takeAway', 'delivery']
+}
+
+const Homepage = () => {
+ const MapWithNoSSR = dynamic(() => import('../components/Map'), {
+ ssr: false
+ })
+
+ const nodeRef = useRef(null)
+ const [showSuggestions, setShowSuggestions] = useState(false)
+
+ const { t, locale } = useLanguage()
+
+ // create a state value called query in typescript
+ const [query, setQuery] = useState('')
+ // const [coords, setCoords] = useState({
+ // lat: 48.719242,
+ // long: 2.346078,
+ // });
+ const [coords, setCoords] = useState({
+ lat: 48.800345,
+ long: 2.346078
+ })
+
+ const [isOptionModalOpen, setIsOptionModalOpen] = useState(true)
+ const [isOptionDetailOpen, setIsOptionDetailOpen] = useState(false)
+ const [isMenuModalOpen, setIsMenuModalOpen] = useState(true)
+ const [option, setOption] = useState(initialOption)
+
+ //TODO local store and coords states can be removed in further iterations
+ const [stores, setStores] = useState([])
+ // const [selectedStore, setSelectedStore] = useState(null);
+ const [selectedStore, setSelectedStore] = useState(null)
+
+ const { data: searchedLocationData, loading, error, fetchData } = useRequest()
+ const { data: locationData, loading: loadingLocation, error: locationError, fetchData: fetchLocation } = useRequest()
+ const { data: storesByLocation, loading: loadingStores, error: errorStores, fetchData: fetchStores } = useRequest()
+ const router = useRouter()
+
+ useEffect(() => {
+ setOption(JSON.parse(localStorage.getItem('selectedOption') as string))
+ }, [])
+
+ useEffect(() => {
+ localStorage.setItem('selectedOption', JSON.stringify(option))
+ }, [option])
+
+ const handleModalOpen = () => {
+ setIsOptionModalOpen(prevState => !prevState)
+ }
+
+ const handleModalClose = () => {
+ setIsOptionModalOpen(false)
+ }
+
+ const handleOptionDetailOpen = () => {
+ setIsOptionDetailOpen(prevState => !prevState)
+ }
+
+ const handleOptionDetailClose = () => {
+ setIsOptionDetailOpen(false)
+ setSelectedStore(null)
+ }
+
+ const handleLocationClick = (lat: number, long: number) => {
+ setCoords({ lat, long })
+ }
+
+ const fetchLocationByQuery = (query: string) => {
+ const url = `${process.env.NEXT_PUBLIC_NOMINATIM_URL}/search?format=jsonv2&q=${query}`
+
+ fetchData(url, 'GET')
+ }
+
+ const fetchLocationNameByCoords = (lat: number, long: number) => {
+ const url = `${process.env.NEXT_PUBLIC_NOMINATIM_URL}/reverse?format=jsonv2&lat=${lat}&lon=${long}`
+
+ fetchLocation(url, 'GET')
+ }
+
+ const fetchStoresByLocation = (lat: number, long: number, tagValue: string, tagName: string) => {
+ // static tagName and tagValue for now
+ const url = `${process.env.NEXT_PUBLIC_BECKN_API_URL}/stores?tagName=becknified&tagValue=true&latitude=${lat}&longitude=${long}&filter=${tagValuetoApiMap[tagValue]}`
+
+ // Only fetch when Books are selected for now
+ fetchStores(url, 'GET')
+ }
+
+ useEffect(() => {
+ // Not refilling stores if option is empty
+ if (storesByLocation && !isEmpty(option.tagValue)) {
+ setStores(storesByLocation)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [storesByLocation])
+
+ useEffect(() => {
+ if (isEmpty(query) && !isEmpty(coords)) {
+ fetchLocationNameByCoords(coords.lat, coords.long)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [coords])
+
+ useEffect(() => {
+ if (
+ !isEmpty(coords) &&
+ !isEmpty(option?.tagValue) &&
+ (option?.tagValue === StoreType.books || option?.tagValue === StoreType.restaurant)
+ ) {
+ fetchStoresByLocation(coords.lat, coords.long, option?.tagValue, option?.tagName)
+ }
+ if (option?.tagValue !== StoreType.books) {
+ setStores([])
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [coords, option])
+
+ //resetting option state and stores when location changes
+ useEffect(() => {
+ // setOption(initialOption);
+ setStores([])
+ }, [coords])
+
+ return (
+
+
+ {!showSuggestions && (
+ <>
+
+
+
+
+
+
+ {state => (
+
+
setIsMenuModalOpen(prev => !prev)}>
+
+
{t.explorePlaces}
+
+
+ {optionData.map((currentOption, index) => {
+ const isSelected = option ? option.tagValue === currentOption.tagValue : false
+ const optionMeta = {
+ tagName: currentOption.tagName,
+ tagValue: currentOption.tagValue,
+ title: currentOption.title
+ }
+ const optionIcons = {
+ iconUrl: currentOption.iconUrl,
+ iconUrlLight: currentOption.iconUrl_light
+ }
+ return (
+
+ )
+ })}
+
+
+ )}
+
+
+
+
+
+
+ {t[option?.tagValue === StoreType.books ? 'localStores' : 'restaurants']}{' '}
+ {query ? query : locationData?.name} {' '}
+
+
+
+ {selectedStore?.tags.name} -{' '}
+ {option?.tagValue === StoreType.books ? t.bookstore : t.optionRestaurant}
+
+
+
+ {getProperImages(selectedStore)
+ .split(',')
+ .map((singleImage: string, i: number) => {
+ return (
+
+ )
+ })}
+
+
+ {selectedStore?.tags['addr:full'] || selectedStore?.tags['addr:street']}
+
+
+ {getStaticTags(option?.tagValue).map((tag, i) => {
+ return (
+
+ )
+ })}
+
+
{
+ router.push('/search')
+ localStorage.setItem('optionTags', JSON.stringify(selectedStore?.tags))
+ }}
+ className="px-[47px] mt-1 py-[12px] bg-palette-primary border_radius_all text-white"
+ >
+ {t['shopButton']}
+
+
+
+ >
+ )}
+
+ )
+}
+
+export default Homepage
diff --git a/apps/mobility-bap/pages/orderConfirmation.tsx b/apps/mobility-bap/pages/orderConfirmation.tsx
new file mode 100644
index 000000000..9a7a8f736
--- /dev/null
+++ b/apps/mobility-bap/pages/orderConfirmation.tsx
@@ -0,0 +1,99 @@
+import React, { useEffect } from 'react'
+import { useRouter } from 'next/router'
+import { Box, Image, Stack, Text } from '@chakra-ui/react'
+import { useSelector } from 'react-redux'
+import orderConfirmmark from '../public/images/orderConfirmmark.svg'
+import { useLanguage } from '../hooks/useLanguage'
+import useRequest from '../hooks/useRequest'
+import { getInitMetaDataPerBpp, getPayloadForConfirmRequest } from '../utilities/confirm-utils'
+import Loader from '../components/loader/Loader'
+import { TransactionIdRootState } from '../lib/types/cart'
+
+const OrderConfirmation = () => {
+ const { t } = useLanguage()
+ const confirmRequest = useRequest()
+ const router = useRouter()
+ const initResponse = useSelector((state: any) => state.initResponse.initResponse)
+
+ const transactionId = useSelector((state: { transactionId: TransactionIdRootState }) => state.transactionId)
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+
+ useEffect(() => {
+ if (initResponse) {
+ const initMetaDataPerBpp = getInitMetaDataPerBpp(initResponse)
+
+ const payLoadForConfirmRequest = getPayloadForConfirmRequest(
+ initMetaDataPerBpp,
+ transactionId,
+ localStorage.getItem('userPhone') as string
+ )
+ confirmRequest.fetchData(`${apiUrl}/client/v2/confirm`, 'POST', payLoadForConfirmRequest)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ useEffect(() => {
+ if (!initResponse && localStorage && localStorage.getItem('initResult')) {
+ const parsedInitResult = JSON.parse(localStorage.getItem('initResult') as string)
+ const initMetaDataPerBpp = getInitMetaDataPerBpp(parsedInitResult)
+
+ const payLoadForConfirmRequest = getPayloadForConfirmRequest(
+ initMetaDataPerBpp,
+ transactionId,
+ localStorage.getItem('userPhone') as string
+ )
+ confirmRequest.fetchData(`${apiUrl}/client/v2/confirm`, 'POST', payLoadForConfirmRequest)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ useEffect(() => {
+ if (confirmRequest.data) {
+ localStorage.setItem('confirmData', JSON.stringify(confirmRequest.data))
+ const timeout = setTimeout(() => {
+ router.push('/orderDetails')
+ }, 3000)
+
+ // Clean up the timeout on component unmount
+ return () => {
+ clearTimeout(timeout)
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [confirmRequest.data])
+
+ if (confirmRequest.loading) {
+ return
+ }
+
+ return (
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.orderPlaced}
+
+
+
+ {t.confirmMessage1}
+ {t.confirmMessage2}
+
+
+
+ )
+}
+
+export default OrderConfirmation
diff --git a/apps/mobility-bap/pages/paymentMode.tsx b/apps/mobility-bap/pages/paymentMode.tsx
new file mode 100644
index 000000000..8b8bb35b8
--- /dev/null
+++ b/apps/mobility-bap/pages/paymentMode.tsx
@@ -0,0 +1,81 @@
+import React, { useState } from 'react'
+import { Box, Flex, Text, Image, Card, CardBody } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import { useDispatch } from 'react-redux'
+import Button from '../components/button/Button'
+import CardWithCheckBox from '../components/card/Card'
+import { useLanguage } from '../hooks/useLanguage'
+import creditCardImg from '../public/images/creditCardImg.svg'
+import { cartActions } from '../store/cart-slice'
+
+function PaymentMode() {
+ const [checked, setChecked] = useState(false)
+
+ const { t } = useLanguage()
+ const router = useRouter()
+ const dispatch = useDispatch()
+
+ return (
+ <>
+
+ {/* */}
+
+
+ {t.cards}
+
+ {t.addCard}
+
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+
+
+
+ Other
+
+
+
+
+ {
+ dispatch(cartActions.clearCart())
+ router.push('/orderConfirmation')
+ }}
+ />
+
+ >
+ )
+}
+
+export default PaymentMode
diff --git a/apps/mobility-bap/pages/search.tsx b/apps/mobility-bap/pages/search.tsx
new file mode 100644
index 000000000..c23a2ee42
--- /dev/null
+++ b/apps/mobility-bap/pages/search.tsx
@@ -0,0 +1,166 @@
+import { useEffect, useState } from 'react'
+import { useDispatch } from 'react-redux'
+import { Box } from '@chakra-ui/react'
+import SearchBar from '../components/header/SearchBar'
+import ProductList from '../components/productList/ProductList'
+import useRequest from '../hooks/useRequest'
+import { responseDataActions } from '../store/responseData-slice'
+import { RetailItem } from '../lib/types/products'
+import Loader from '../components/loader/Loader'
+import { useLanguage } from '../hooks/useLanguage'
+
+//Mock data for testing search API. Will remove after the resolution of CORS issue
+
+const Search = () => {
+ const [items, setItems] = useState([])
+ const dispatch = useDispatch()
+ const [providerId, setProviderId] = useState('')
+ const { t, locale } = useLanguage()
+ const [tagValue, setTagValue] = useState('')
+ const [searchString, setSearchString] = useState('')
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+
+ const { data, loading, error, fetchData } = useRequest()
+
+ const categoryMap = {
+ Books: { en: 'BookEnglish', fa: 'BookFrench' },
+ restaurant: { en: 'FoodEnglish', fa: 'FoodFrench' }
+ }
+
+ useEffect(() => {
+ if (localStorage) {
+ const stringifiedOptiontags = localStorage.getItem('optionTags')
+ const stringifiedSelectedOption = localStorage.getItem('selectedOption')
+ if (stringifiedOptiontags) {
+ const providerId = JSON.parse(stringifiedOptiontags).providerId
+ setProviderId(providerId)
+ }
+ if (stringifiedSelectedOption) {
+ setTagValue(JSON.parse(stringifiedSelectedOption).tagValue)
+ }
+ }
+ }, [])
+
+ const categoryName = () => {
+ if (tagValue && categoryMap[tagValue]) {
+ return categoryMap[tagValue][locale] || categoryMap[tagValue]['en']
+ }
+ }
+
+ const searchPayload = {
+ context: {
+ domain: 'retail'
+ },
+ message: {
+ criteria: {
+ dropLocation: '48.85041854,2.343660801',
+ categoryName: categoryName(),
+ providerId: providerId
+ }
+ }
+ }
+
+ const fetchDataForSearch = (searchString: string) =>
+ fetchData(`${apiUrl}/client/v2/search`, 'POST', {
+ ...searchPayload,
+ message: {
+ ...searchPayload.message,
+ criteria: {
+ ...searchPayload.message.criteria,
+ searchString: searchString
+ }
+ }
+ })
+
+ useEffect(() => {
+ if (localStorage && !localStorage.getItem('searchItems')) {
+ if (providerId) {
+ fetchData(`${apiUrl}/client/v2/search`, 'POST', searchPayload)
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [providerId])
+
+ useEffect(() => {
+ if (localStorage) {
+ const cachedSearchResults = localStorage.getItem('searchItems')
+ if (cachedSearchResults) {
+ const parsedCachedResults = JSON.parse(cachedSearchResults)
+ setItems(parsedCachedResults)
+ }
+ }
+ }, [])
+
+ useEffect(() => {
+ if (data) {
+ dispatch(responseDataActions.addTransactionId(data.context.transaction_id))
+ const allItems = data.message.catalogs.flatMap((catalog: any) => {
+ if (catalog.message && catalog.message.catalog && catalog.message.catalog['bpp/providers'].length > 0) {
+ const providers = catalog.message.catalog['bpp/providers']
+ return providers.flatMap((provider: any) => {
+ if (provider.items && provider.items.length > 0) {
+ return provider.items.map((item: RetailItem) => {
+ return {
+ bpp_id: catalog.context.bpp_id,
+ bpp_uri: catalog.context.bpp_uri,
+ ...item,
+ providerId: provider.id,
+ locations: provider.locations,
+ bppName: catalog.message.catalog['bpp/descriptor'].name
+ }
+ })
+ }
+ return []
+ })
+ }
+ return []
+ })
+ localStorage.setItem('searchItems', JSON.stringify(allItems))
+ setItems(allItems)
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [data])
+
+ return (
+ <>
+
+ {
+ localStorage.removeItem('searchItems')
+ setSearchString(text)
+ fetchDataForSearch(text)
+ }}
+ />
+
+
+ {loading ? (
+
+
+
+ ) : (
+
+ )}
+
+ >
+ )
+}
+
+export default Search
diff --git a/apps/mobility-bap/pages/trackOrder.tsx b/apps/mobility-bap/pages/trackOrder.tsx
new file mode 100644
index 000000000..1ef510f4d
--- /dev/null
+++ b/apps/mobility-bap/pages/trackOrder.tsx
@@ -0,0 +1,266 @@
+import { Text, Stack, Image, Divider, Flex, Box } from '@chakra-ui/react'
+import React, { useEffect, useState } from 'react'
+import { useRouter } from 'next/router'
+import { AppHeader } from '../components/appHeader/AppHeader'
+import { useLanguage } from '../hooks/useLanguage'
+import trackOrderMap from '../public/images/trackOrderMap.svg'
+import orderConfirmed from '../public/images/orderConfirmed.svg'
+import deliveryAgentBlack from '../public/images/deliveryAgentBlack.svg'
+import deliveryAgentRed from '../public/images/deliveryAgentRed.svg'
+import ofdRed from '../public/images/ofdRed.svg'
+import ofdBlack from '../public/images/ofdBlack.svg'
+import orderDeliveredRed from '../public/images/orderDeliveredRed.svg'
+import orderDeliveredBlack from '../public/images/orderDeliveredBlack.svg'
+import lineRed from '../public/images/lineRed.svg'
+import lineBlack from '../public/images/lineBlack.svg'
+
+const TrackOrder = () => {
+ const [activeSteps, setActiveSteps] = useState([true, false, false, false])
+ const { t } = useLanguage()
+ const router = useRouter()
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setActiveSteps(prevSteps => {
+ const updatedSteps = [...prevSteps]
+ const nextActiveIndex = prevSteps.findIndex(isActive => !isActive)
+ if (nextActiveIndex !== -1) {
+ updatedSteps[nextActiveIndex] = true
+ }
+ return updatedSteps
+ })
+ }, 3000)
+
+ return () => {
+ clearInterval(interval)
+ }
+ }, [])
+
+ const getStepColor = (stepIndex: number) => {
+ return activeSteps[stepIndex] ? 'rgba(var(--color-primary))' : '#000000'
+ }
+
+ const getStepImage = (stepIndex: number) => {
+ switch (stepIndex) {
+ case 0:
+ return orderConfirmed
+ case 1:
+ return activeSteps[1] ? deliveryAgentRed : deliveryAgentBlack
+ case 2:
+ return activeSteps[2] ? ofdRed : ofdBlack
+ case 3:
+ return activeSteps[3] ? orderDeliveredRed : orderDeliveredBlack
+ case 4:
+ return router.push('/feedback')
+ default:
+ return null
+ }
+ }
+
+ const getStepLineImage = (stepIndex: number) => {
+ return activeSteps[stepIndex] ? lineRed : lineBlack
+ }
+
+ useEffect(() => {
+ const isAllStepsCompleted = activeSteps.every(isActive => isActive)
+
+ if (isAllStepsCompleted) {
+ router.push('/feedback')
+ }
+ }, [activeSteps, router])
+
+ return (
+ <>
+ {/* */}
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+
+
+ {t.orderId}
+
+ 456789120
+
+
+ {t.estimatedDelivery} 21st Jun 2021, 12:21pm
+
+
+
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.orderConfirmed}
+
+
+
+ {t.orderConfirmedTime}
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.orderConfirmedMssg}
+
+
+
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.agentAssigned}
+
+
+
+ {activeSteps[1] ? t.agentAssignedTime : null}
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {activeSteps[1] ? t.agentAssignedMssg : '--'}
+
+
+
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.OFD}
+
+
+
+ {activeSteps[2] ? t.OFDTime : null}
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {activeSteps[2] ? t.OFDMssg : '--'}
+
+
+
+
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+ {t.orderDelivered}
+
+
+
+ {activeSteps[3] ? t.orderDeliveredTime : null}
+
+
+
+
+
+ {activeSteps[3] ? t.orderDeliveredMssg : '--'}
+
+
+
+
+ >
+ )
+}
+
+export default TrackOrder
diff --git a/apps/mobility-bap/postcss.config.js b/apps/mobility-bap/postcss.config.js
new file mode 100644
index 000000000..ab57af99b
--- /dev/null
+++ b/apps/mobility-bap/postcss.config.js
@@ -0,0 +1,7 @@
+module.exports = {
+ plugins: {
+ 'postcss-import': {},
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+}
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebblack.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebblack.ttf
new file mode 100644
index 000000000..580c70004
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebblack.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebbold.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebbold.ttf
new file mode 100644
index 000000000..1c6bbd43b
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebbold.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrablack.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrablack.ttf
new file mode 100644
index 000000000..b85362bce
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrablack.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrabold.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrabold.ttf
new file mode 100644
index 000000000..b3e78a7bc
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebextrabold.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanweblight.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanweblight.ttf
new file mode 100644
index 000000000..9e81193e3
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanweblight.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebmedium.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebmedium.ttf
new file mode 100644
index 000000000..4dc2ad776
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebmedium.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebregular.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebregular.ttf
new file mode 100644
index 000000000..fc0ba6806
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebregular.ttf differ
diff --git a/apps/mobility-bap/public/fonts/ttf/iranyekanwebthin.ttf b/apps/mobility-bap/public/fonts/ttf/iranyekanwebthin.ttf
new file mode 100644
index 000000000..e2bc63773
Binary files /dev/null and b/apps/mobility-bap/public/fonts/ttf/iranyekanwebthin.ttf differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebblack.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebblack.woff
new file mode 100644
index 000000000..7deeec932
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebblack.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebbold.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebbold.woff
new file mode 100644
index 000000000..7707c6f1c
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebbold.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebextrablack.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebextrablack.woff
new file mode 100644
index 000000000..bbd1827a4
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebextrablack.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebextrabold.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebextrabold.woff
new file mode 100644
index 000000000..bc49fb0a7
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebextrabold.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanweblight.woff b/apps/mobility-bap/public/fonts/woff/iranyekanweblight.woff
new file mode 100644
index 000000000..af6daaa1b
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanweblight.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebmedium.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebmedium.woff
new file mode 100644
index 000000000..84896bbf8
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebmedium.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebregular.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebregular.woff
new file mode 100644
index 000000000..bfbe54766
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebregular.woff differ
diff --git a/apps/mobility-bap/public/fonts/woff/iranyekanwebthin.woff b/apps/mobility-bap/public/fonts/woff/iranyekanwebthin.woff
new file mode 100644
index 000000000..c5c9ae117
Binary files /dev/null and b/apps/mobility-bap/public/fonts/woff/iranyekanwebthin.woff differ
diff --git a/apps/mobility-bap/public/robots.txt b/apps/mobility-bap/public/robots.txt
new file mode 100644
index 000000000..8f081968b
--- /dev/null
+++ b/apps/mobility-bap/public/robots.txt
@@ -0,0 +1,9 @@
+# *
+User-agent: *
+Allow: /
+
+# Host
+Host: undefined
+
+# Sitemaps
+Sitemap: undefined/sitemap.xml
diff --git a/apps/mobility-bap/public/sitemap-0.xml b/apps/mobility-bap/public/sitemap-0.xml
new file mode 100644
index 000000000..befe7bd34
--- /dev/null
+++ b/apps/mobility-bap/public/sitemap-0.xml
@@ -0,0 +1,24 @@
+
+
+undefined 2023-08-28T16:44:22.269Z daily 0.7
+undefined/about 2023-08-28T16:44:22.269Z daily 0.7
+undefined/blank 2023-08-28T16:44:22.269Z daily 0.7
+undefined/cart 2023-08-28T16:44:22.269Z daily 0.7
+undefined/checkoutPage 2023-08-28T16:44:22.269Z daily 0.7
+undefined/favorite 2023-08-28T16:44:22.269Z daily 0.7
+undefined/feedback 2023-08-28T16:44:22.269Z daily 0.7
+undefined/homePage 2023-08-28T16:44:22.269Z daily 0.7
+undefined/login 2023-08-28T16:44:22.269Z daily 0.7
+undefined/mobileOtp 2023-08-28T16:44:22.269Z daily 0.7
+undefined/newestProducts 2023-08-28T16:44:22.269Z daily 0.7
+undefined/offers 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderConfirmation 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderDetails 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderHistory 2023-08-28T16:44:22.269Z daily 0.7
+undefined/paymentMode 2023-08-28T16:44:22.269Z daily 0.7
+undefined/product 2023-08-28T16:44:22.269Z daily 0.7
+undefined/search 2023-08-28T16:44:22.269Z daily 0.7
+undefined/signUp 2023-08-28T16:44:22.269Z daily 0.7
+undefined/trackOrder 2023-08-28T16:44:22.269Z daily 0.7
+undefined/fa/offers 2023-08-28T16:44:22.269Z daily 0.7
+
\ No newline at end of file
diff --git a/apps/mobility-bap/public/sitemap.xml b/apps/mobility-bap/public/sitemap.xml
new file mode 100644
index 000000000..cdcce6fe3
--- /dev/null
+++ b/apps/mobility-bap/public/sitemap.xml
@@ -0,0 +1,4 @@
+
+
+undefined/sitemap-0.xml
+
\ No newline at end of file
diff --git a/apps/dsep/store/activeMenuItem-slice.ts b/apps/mobility-bap/store/activeMenuItem-slice.ts
similarity index 100%
rename from apps/dsep/store/activeMenuItem-slice.ts
rename to apps/mobility-bap/store/activeMenuItem-slice.ts
diff --git a/apps/mobility-bap/store/cart-slice.ts b/apps/mobility-bap/store/cart-slice.ts
new file mode 100644
index 000000000..24084e40c
--- /dev/null
+++ b/apps/mobility-bap/store/cart-slice.ts
@@ -0,0 +1,75 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ICart } from '../lib/types/cart'
+import { RetailItem } from '../lib/types/products'
+import { calculateDiscountPercentage } from '../utilities/calculateDiscountPercentage'
+
+const initialState: ICart = {
+ items: [],
+ totalQuantity: 0,
+ totalAmount: 0
+}
+
+const cartSlice = createSlice({
+ name: 'cart',
+ initialState,
+ reducers: {
+ addItemToCart(
+ state: ICart,
+ action: PayloadAction<{
+ product: RetailItem
+ quantity: number
+ }>
+ ) {
+ const newItem = action.payload.product
+
+ const existingItem = state.items.find(item => item.id === newItem.id)
+
+ state.totalQuantity = state.totalQuantity + action.payload.quantity
+
+ state.totalAmount = state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.price.value)
+
+ if (!existingItem) {
+ const totalPrice = parseFloat(newItem.price.value) * action.payload.quantity
+
+ state.items.push({
+ ...newItem,
+ quantity: action.payload.quantity,
+ totalPrice
+ })
+ } else {
+ const totalPrice =
+ parseFloat(existingItem.price.value) + parseFloat(existingItem.price.value) * action.payload.quantity
+
+ existingItem.quantity += action.payload.quantity
+ existingItem.totalPrice = totalPrice
+ }
+ },
+
+ removeItemFromCart(
+ state: ICart,
+ action: PayloadAction //slug.current as payload
+ ) {
+ const productSlug = action.payload
+ const existingItem = state.items.find(item => item.id === productSlug)
+
+ state.totalQuantity--
+
+ state.totalAmount = state.totalAmount - parseFloat(existingItem?.price.value!)
+
+ if (existingItem?.quantity === 1) {
+ state.items = state.items.filter(item => item.id !== productSlug)
+ } else {
+ existingItem!.quantity--
+ existingItem!.totalPrice = existingItem!.totalPrice - parseFloat(existingItem?.price.value!)
+ }
+ },
+
+ clearCart(state: ICart) {
+ return { ...initialState }
+ }
+ }
+})
+
+export const cartActions = cartSlice.actions
+
+export default cartSlice.reducer
diff --git a/apps/mobility-bap/store/cartUI-slice.ts b/apps/mobility-bap/store/cartUI-slice.ts
new file mode 100644
index 000000000..52ba16626
--- /dev/null
+++ b/apps/mobility-bap/store/cartUI-slice.ts
@@ -0,0 +1,20 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ICartUI } from '../lib/types/cart'
+
+const initialState: ICartUI = {
+ cartBoxIsVisible: false
+}
+
+const cartUiSlice = createSlice({
+ name: 'cartUi',
+ initialState,
+ reducers: {
+ toggleCartBox(state, action: PayloadAction) {
+ state.cartBoxIsVisible = action.payload
+ }
+ }
+})
+
+export const cartUiActions = cartUiSlice.actions
+
+export default cartUiSlice.reducer
diff --git a/apps/mobility-bap/store/favorite-slice.ts b/apps/mobility-bap/store/favorite-slice.ts
new file mode 100644
index 000000000..6ecb362b1
--- /dev/null
+++ b/apps/mobility-bap/store/favorite-slice.ts
@@ -0,0 +1,30 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IFavorite } from '../lib/types/favorite'
+import { RetailItem } from '../lib/types/products'
+
+const initialState: IFavorite = {
+ items: []
+}
+
+const favoriteSlice = createSlice({
+ name: 'favorite',
+ initialState,
+ reducers: {
+ addToFavorite(state, action: PayloadAction) {
+ state.items.push({
+ ...action.payload
+ })
+ },
+ removeFromFavorite(state, action: PayloadAction) {
+ const productSlug = action.payload
+ state.items = state.items.filter(item => item.id !== productSlug)
+ },
+ clearCart(state) {
+ state = initialState
+ }
+ }
+})
+
+export const favoriteActions = favoriteSlice.actions
+
+export default favoriteSlice.reducer
diff --git a/apps/mobility-bap/store/index.ts b/apps/mobility-bap/store/index.ts
new file mode 100644
index 000000000..4487f48cc
--- /dev/null
+++ b/apps/mobility-bap/store/index.ts
@@ -0,0 +1,39 @@
+import { configureStore } from '@reduxjs/toolkit'
+import specialOfferProductsReducer from './specialOfferProducts-slice'
+import newestProductReducer from './newestProduct-slice'
+import SortedProductsListReducer from './sortedProductList-slice'
+import cartUiReducer from './cartUI-slice'
+import cartSliceReducer from './cart-slice'
+import userInfoReducer from './user-slice'
+import sideNavBarReducer from './sideNavBar-slice'
+import megaMenuReducer from './megaMenu-slice'
+import activeMenuItemReducer from './activeMenuItem-slice'
+import settingBoxReducer from './settingBox-slice'
+import favoriteReducer from './favorite-slice'
+import responseDataReducer from './responseData-slice'
+
+const store = configureStore({
+ reducer: {
+ specialOfferProductsList: specialOfferProductsReducer,
+ newestProductsList: newestProductReducer,
+ sortedProductsList: SortedProductsListReducer,
+ cartUi: cartUiReducer,
+ cart: cartSliceReducer,
+ userInfo: userInfoReducer,
+ sideNavBar: sideNavBarReducer,
+ megaMenu: megaMenuReducer,
+ activeMenuItem: activeMenuItemReducer,
+ settingBox: settingBoxReducer,
+ favorite: favoriteReducer,
+ transactionId: responseDataReducer,
+ quoteResponse: responseDataReducer,
+ customerDetails: responseDataReducer,
+ initResponse: responseDataReducer
+ },
+ middleware: getDefaultMiddleware =>
+ getDefaultMiddleware({
+ serializableCheck: false
+ })
+})
+
+export default store
diff --git a/apps/mobility-bap/store/megaMenu-slice.ts b/apps/mobility-bap/store/megaMenu-slice.ts
new file mode 100644
index 000000000..9e7b0bfb8
--- /dev/null
+++ b/apps/mobility-bap/store/megaMenu-slice.ts
@@ -0,0 +1,23 @@
+import { createSlice } from '@reduxjs/toolkit'
+import { IMegaMenuShow } from '../lib/types/megaMenu'
+
+const initialState: IMegaMenuShow = {
+ isMegaMenuOpen: false
+}
+
+const megaMenuSlice = createSlice({
+ name: 'megaMenu',
+ initialState,
+ reducers: {
+ openMegaMenu(state) {
+ state.isMegaMenuOpen = true
+ },
+ closeMegaMenu(state) {
+ state.isMegaMenuOpen = false
+ }
+ }
+})
+
+export const megaMenuActions = megaMenuSlice.actions
+
+export default megaMenuSlice.reducer
diff --git a/apps/mobility-bap/store/newestProduct-slice.ts b/apps/mobility-bap/store/newestProduct-slice.ts
new file mode 100644
index 000000000..829e9bfcf
--- /dev/null
+++ b/apps/mobility-bap/store/newestProduct-slice.ts
@@ -0,0 +1,22 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { RetailItem } from '../lib/types/products'
+import { IProductList } from '../lib/types/productList'
+
+const initialState: IProductList = {
+ productsList: []
+}
+
+const newestProductsSlice = createSlice({
+ name: 'newestProducts',
+ initialState,
+ reducers: {
+ addProducts(state, action: PayloadAction) {
+ state.productsList = action.payload
+ }
+ }
+})
+
+export const newestProductsActions = newestProductsSlice.actions
+
+export default newestProductsSlice.reducer
diff --git a/apps/mobility-bap/store/responseData-slice.ts b/apps/mobility-bap/store/responseData-slice.ts
new file mode 100644
index 000000000..2ffb14c3c
--- /dev/null
+++ b/apps/mobility-bap/store/responseData-slice.ts
@@ -0,0 +1,33 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ResponseModel } from '../lib/types/responseModel'
+import { ShippingFormData } from '../pages/checkoutPage'
+
+const initialState = {
+ transactionId: '',
+ quoteResponse: null as (ResponseModel & ResponseModel[]) | null,
+ customerDetails: null as ShippingFormData | null,
+ initResponse: null as (ResponseModel & ResponseModel[]) | null
+}
+
+const responseDataSlice = createSlice({
+ name: 'responseData',
+ initialState,
+ reducers: {
+ addTransactionId(state, action: PayloadAction) {
+ state.transactionId = action.payload
+ },
+ addQuoteResponse(state, action: PayloadAction<(ResponseModel & ResponseModel[]) | null>) {
+ state.quoteResponse = action.payload
+ },
+ addCustomerDetails(state, action: PayloadAction) {
+ state.customerDetails = action.payload
+ },
+ addInitResponse(state, action: PayloadAction<(ResponseModel & ResponseModel[]) | null>) {
+ state.initResponse = action.payload
+ }
+ }
+})
+
+export const responseDataActions = responseDataSlice.actions
+
+export default responseDataSlice.reducer
diff --git a/apps/mobility-bap/store/settingBox-slice.ts b/apps/mobility-bap/store/settingBox-slice.ts
new file mode 100644
index 000000000..77f71a767
--- /dev/null
+++ b/apps/mobility-bap/store/settingBox-slice.ts
@@ -0,0 +1,26 @@
+import { createSlice } from '@reduxjs/toolkit'
+import { ISettingBox } from '../lib/types/settingBox'
+
+const initialState: ISettingBox = {
+ isOpen: false
+}
+
+const settingBoxSlice = createSlice({
+ name: 'settingBox',
+ initialState,
+ reducers: {
+ openSettingBox(state) {
+ state.isOpen = true
+ },
+ closeSettingBox(state) {
+ state.isOpen = false
+ },
+ toggleSettingBox(state) {
+ state.isOpen = !state.isOpen
+ }
+ }
+})
+
+export const settingBoxActions = settingBoxSlice.actions
+
+export default settingBoxSlice.reducer
diff --git a/apps/mobility-bap/store/sideNavBar-slice.ts b/apps/mobility-bap/store/sideNavBar-slice.ts
new file mode 100644
index 000000000..0ba7dff09
--- /dev/null
+++ b/apps/mobility-bap/store/sideNavBar-slice.ts
@@ -0,0 +1,40 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IDropDown } from '../lib/types/dropDown'
+import { ISideNavBar } from '../lib/types/sidebar'
+
+const initialState: ISideNavBar = {
+ isSidebarOpen: false,
+ isNavbarOpen: false,
+ dropDownList: []
+}
+
+const sideNavBarSlice = createSlice({
+ name: 'sideNavBar',
+ initialState,
+ reducers: {
+ openSidebar(state) {
+ state.isSidebarOpen = true
+ },
+
+ openNavbar(state) {
+ state.isNavbarOpen = true
+ },
+
+ closeSidebar(state) {
+ state.isSidebarOpen = false
+ },
+
+ closeNavbar(state) {
+ state.isSidebarOpen = false
+ state.isNavbarOpen = false
+ },
+
+ setSidebarEntries(state, action: PayloadAction) {
+ state.dropDownList = action.payload
+ }
+ }
+})
+
+export const sideNavBarActions = sideNavBarSlice.actions
+
+export default sideNavBarSlice.reducer
diff --git a/apps/mobility-bap/store/sortedProductList-slice.ts b/apps/mobility-bap/store/sortedProductList-slice.ts
new file mode 100644
index 000000000..b5c8e0d75
--- /dev/null
+++ b/apps/mobility-bap/store/sortedProductList-slice.ts
@@ -0,0 +1,40 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { IProductList } from '../lib/types/productList'
+import { RetailItem } from '../lib/types/products'
+import { sortByCheapest, sortByExpensive } from '../utilities/sortByCost'
+
+const initialState: IProductList = {
+ productsList: []
+}
+
+const SortedProductsListSlice = createSlice({
+ name: 'sortedProductsList',
+ initialState,
+ reducers: {
+ sortProductsList(
+ state,
+ action: PayloadAction<{
+ productsList: RetailItem[]
+ sortBasedOn: string
+ }>
+ ) {
+ switch (action.payload.sortBasedOn) {
+ case 'all':
+ state.productsList = action.payload.productsList
+ break
+ case 'cheapest': {
+ state.productsList = state.productsList.sort(sortByCheapest)
+ break
+ }
+ case 'expensive': {
+ state.productsList = state.productsList.sort(sortByExpensive)
+ break
+ }
+ }
+ }
+ }
+})
+export const SortedProductsListActions = SortedProductsListSlice.actions
+
+export default SortedProductsListSlice.reducer
diff --git a/apps/mobility-bap/store/specialOfferProducts-slice.ts b/apps/mobility-bap/store/specialOfferProducts-slice.ts
new file mode 100644
index 000000000..67a432fa4
--- /dev/null
+++ b/apps/mobility-bap/store/specialOfferProducts-slice.ts
@@ -0,0 +1,22 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { IProduct } from '../lib/types/products'
+import { IOfferProducts } from '../lib/types/offerProductsState'
+
+const initialState: IOfferProducts = {
+ specialOfferProducts: []
+}
+
+const specialOfferProductsSlice = createSlice({
+ name: 'specialOfferProducts',
+ initialState,
+ reducers: {
+ addProducts(state, action: PayloadAction) {
+ state.specialOfferProducts = action.payload
+ }
+ }
+})
+
+export const specialOfferProductsActions = specialOfferProductsSlice.actions
+
+export default specialOfferProductsSlice.reducer
diff --git a/apps/mobility-bap/store/user-slice.ts b/apps/mobility-bap/store/user-slice.ts
new file mode 100644
index 000000000..a4f8c8c61
--- /dev/null
+++ b/apps/mobility-bap/store/user-slice.ts
@@ -0,0 +1,23 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import Cookies from 'js-cookie'
+import { IUser, IUserInfo } from '../lib/types/user'
+
+const initialState: IUserInfo = {
+ userInformation: Cookies.get('userInfo') ? JSON.parse(Cookies.get('userInfo')!) : null
+}
+
+const userInfoSlice = createSlice({
+ name: 'userInfo',
+ initialState,
+ reducers: {
+ userLogin(state, action: PayloadAction) {
+ state.userInformation = action.payload
+ },
+ userLogout(state) {
+ state.userInformation = null
+ }
+ }
+})
+export const userInfoActions = userInfoSlice.actions
+
+export default userInfoSlice.reducer
diff --git a/apps/mobility-bap/styles/globals.css b/apps/mobility-bap/styles/globals.css
new file mode 100644
index 000000000..b87cc096a
--- /dev/null
+++ b/apps/mobility-bap/styles/globals.css
@@ -0,0 +1,271 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --color-primary: 167, 27, 74; /* #A71B4A*/
+ --color-secondary: 74, 76, 90; /* #4a4c5a*/
+
+ --color-bg: 243, 244, 245; /* #f3f4f5*/
+ --color-bg-side: 252, 251, 255; /* #fcfdff*/
+ --color-bg-black: 0, 0, 0;
+ --digital-category-bgc: #ade8f4;
+ --fashion-category-bgc: #ffddd2;
+ --beauty-category-bgc: #ddd92a;
+ --sport-category-bgc: #ffd60a;
+ --house-category-bgc: #ccd5ae;
+ --toy-category-bgc: #cce3de;
+ --stationery-category-bgc: #fbb13c;
+ --disabled-btn-color: 234, 207, 219; /*"#EACFDB"*/
+
+ --color-text-base: 66, 71, 80; /* #424750*/
+ --color-text-muted: 107, 114, 128; /*#6b7280*/
+ --color-text-side: 255, 231, 231; /*#fff*/
+ --text-color: 255, 255, 255; /* #fff added for white color */
+ --pending-status-color: 189, 148, 43, 1; /*#BD942B*/
+ --delivered-status-color: 80, 201, 23, 1; /*#50C917*/
+ --font-family: iranyekan, 'IRANSans', 'Tahoma';
+ }
+
+ .dark {
+ --color-bg: 15, 23, 42; /* #0f172a*/
+ --color-bg-side: 30, 41, 59; /* #1e293b*/
+ --digital-category-bgc: #0d4c76;
+ --fashion-category-bgc: #892a19;
+ --beauty-category-bgc: #6d305f;
+ --sport-category-bgc: #650606;
+ --house-category-bgc: #164c4b;
+ --toy-category-bgc: #6d3d4b;
+ --stationery-category-bgc: #6a4202;
+
+ --color-text-base: 226, 232, 240; /*#e2e8f0*/
+ --color-text-muted: 140, 154, 175; /*#8c9aaf*/
+ --color-text-side: 255, 231, 231; /*#fff*/
+ }
+
+ html[dir='ltr'] {
+ --font-family: 'Poppins', 'Roboto', 'sans-serif';
+ }
+}
+
+html,
+body {
+ margin: 0;
+ padding: 0;
+ font-family: var(--font-family);
+ background-color: rgb(var(--color-bg));
+ color: rgb(var(--color-text-base));
+}
+
+ul {
+ list-style: unset !important;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: bold;
+ src: url('/fonts/woff/iranyekanwebbold.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebbold.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 100;
+ src: url('/fonts/woff/iranyekanwebthin.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebthin.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 300;
+ src: url('/fonts/woff/iranyekanweblight.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanweblight.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: normal;
+ src: url('/fonts/woff/iranyekanwebregular.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebregular.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 500;
+ src: url('/fonts/woff/iranyekanwebmedium.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebmedium.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 800;
+ src: url('/fonts/woff/iranyekanwebextrabold.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebextrabold.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 850;
+ src: url('/fonts/woff/iranyekanwebblack.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebblack.ttf') format('truetype');
+ font-display: swap;
+}
+
+@font-face {
+ font-family: iranyekan;
+ font-style: normal;
+ font-weight: 900;
+ src: url('/fonts/woff/iranyekanwebextrablack.woff') format('woff'),
+ /* FF3.6+, IE9, Chrome6+, Saf5.1+*/
+ url('/fonts/ttf/iranyekanwebextrablack.ttf') format('truetype');
+ font-display: swap;
+}
+
+.slick-dots li button::before {
+ font-size: 12px !important;
+}
+.image_section > span {
+ width: 220px !important;
+ height: 240px !important;
+}
+
+.slick-prev.slick-disabled:before,
+.slick-next.slick-disabled:before {
+ opacity: 0.45 !important;
+}
+
+.slick-prev:before,
+.slick-next:before {
+ opacity: 9 !important;
+ content: '' !important;
+}
+
+@media (min-width: 1024px) {
+ .slick-dots li button:before {
+ font-size: 12px;
+ }
+ .slick-dots {
+ padding-bottom: 40px !important;
+ }
+}
+
+::-webkit-scrollbar {
+ width: 0.5rem;
+ height: 0.5rem;
+}
+
+::-webkit-scrollbar-track {
+ background-color: rgb(var(--color-bg));
+}
+
+::-webkit-scrollbar-thumb {
+ /* background-color: #a71b4a; */
+ border-radius: 100vw;
+}
+
+/* input */
+
+input,
+select {
+ font-family: inherit;
+ color: inherit;
+ font-size: inherit;
+}
+
+input:focus,
+select:focus {
+ background-color: transparent;
+}
+
+input:-webkit-autofill,
+input:-webkit-autofill:hover,
+input:-webkit-autofill:focus,
+textarea:-webkit-autofill,
+textarea:-webkit-autofill:hover,
+textarea:-webkit-autofill:focus,
+select:-webkit-autofill,
+select:-webkit-autofill:hover,
+select:-webkit-autofill:focus {
+ -webkit-box-shadow: 0 0 0px 1000px transparent inset;
+ box-shadow: 0 0 0px 1000px transparent inset;
+ transition: background-color 5000s ease-in-out 0s;
+}
+
+::placeholder {
+ color: #b9b9b9;
+ font-size: 14px;
+}
+/* .chakra-accordion__icon {
+ height: 24px !important;
+ width: 24px !important;
+ position: absolute;
+ right: 15px;
+ top: 15px;
+} */
+
+.object-contain {
+ object-fit: unset !important;
+}
+
+.app_header_b {
+ /* margin-left: -20px; */
+ /* margin-right: -20px; */
+ padding: 0px 20px;
+ box-shadow: 0px 4px 30px rgba(0, 0, 0, 0.1) !important;
+}
+.border_radius_all {
+ border-radius: 12px !important;
+}
+.css-690el4[aria-checked='true'],
+.css-690el4[data-checked] {
+ background-color: #a71b4a !important;
+ border-color: #a71b4a !important;
+}
+.css-690el4 {
+ border: 1px solid !important;
+ border-color: #a71b4a !important;
+}
+.product_description_text p {
+ font-size: 15px;
+}
+.product_description_text p:first-child {
+ padding-bottom: 10px;
+ padding-top: 10px;
+}
+.product_description_text ul li {
+ padding-bottom: 5px;
+
+ /* list-style-position: inside; */
+
+ margin-left: 16px;
+}
diff --git a/apps/mobility-bap/tailwind.config.js b/apps/mobility-bap/tailwind.config.js
new file mode 100644
index 000000000..5a80527b1
--- /dev/null
+++ b/apps/mobility-bap/tailwind.config.js
@@ -0,0 +1,100 @@
+/** @type {import('tailwindcss').Config} */
+function withOpacity(variableName) {
+ return ({ opacityValue }) => {
+ if (opacityValue !== undefined) {
+ return `rgba(var(${variableName}), ${opacityValue})`
+ }
+ return `rgba(var(${variableName}))`
+ }
+}
+
+module.exports = {
+ darkMode: 'class',
+ mode: 'jit',
+ content: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ colors: {
+ palette: {
+ primary: withOpacity('--color-primary'),
+ secondary: withOpacity('--color-secondary')
+ }
+ },
+ textColor: {
+ palette: {
+ base: withOpacity('--color-text-base'),
+ mute: withOpacity('--color-text-muted'),
+ side: withOpacity('--color-text-side')
+ }
+ },
+ backgroundColor: {
+ palette: {
+ fill: withOpacity('--color-bg'),
+ card: withOpacity('--color-bg-side'),
+ dark: withOpacity('--color-bg-dark'),
+ digitalCategory: 'var(--digital-category-bgc)',
+ fashionCategory: 'var(--fashion-category-bgc)',
+ beautyCategory: 'var( --beauty-category-bgc)',
+ sportCategory: 'var(--sport-category-bgc)',
+ houseCategory: 'var(--house-category-bgc)',
+ toyCategory: 'var(--toy-category-bgc)',
+ stationeryCategory: 'var(--stationery-category-bgc)'
+ }
+ },
+ fontFamily: {
+ farsi: "'iranyekan', 'IRANSans', 'Tahoma'",
+ english: "'Poppins', 'Roboto', 'sans-serif'"
+ },
+ keyframes: {
+ sidenavLTR: {
+ '0%': {
+ transform: 'translateX(-100%)'
+ },
+ '100%': {
+ transform: 'translateX(0px)'
+ }
+ },
+ sidenavRTL: {
+ '0%': {
+ transform: 'translateX(100%)'
+ },
+ '100%': {
+ transform: 'translateX(0px)'
+ }
+ },
+ fade: {
+ '0%': {
+ opacity: 0
+ },
+ '100%': {
+ opacity: 1
+ }
+ },
+ dropDown: {
+ '0%': {
+ opacity: 0,
+ transform: 'scaleY(0)'
+ },
+ '100%': {
+ opacity: 1,
+ transform: 'scaleY(1)'
+ }
+ }
+ },
+ animation: {
+ sidenavLTREntering: 'sidenavLTR 0.3s ease-in-out forwards',
+ sidenavRTLEntering: 'sidenavRTL 0.3s ease-in-out forwards',
+ sidenavLTRExit: 'sidenavLTR 0.3s ease-in-out reverse forwards',
+ sidenavRTLExit: 'sidenavRTL 0.3s ease-in-out reverse forwards',
+ fadeEntering: 'fade 0.3s forwards',
+ fadeExit: 'fade 0.3s reverse forwards',
+ dropDown: 'dropDown 0.3s forwards',
+ dropDownExit: 'dropDown 0.3s reverse forwards'
+ },
+ backgroundImage: {
+ offersBG: "url('/images/carouselBox-bg/offersbg.webp')"
+ }
+ }
+ },
+ plugins: []
+}
diff --git a/apps/mobility-bap/tsconfig.json b/apps/mobility-bap/tsconfig.json
new file mode 100644
index 000000000..54652790b
--- /dev/null
+++ b/apps/mobility-bap/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "types": ["node"],
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/components/*": ["components/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/apps/mobility-bap/utilities/auth.ts b/apps/mobility-bap/utilities/auth.ts
new file mode 100644
index 000000000..297ebe0ea
--- /dev/null
+++ b/apps/mobility-bap/utilities/auth.ts
@@ -0,0 +1,8 @@
+import jwt from 'jsonwebtoken'
+import { IUser } from '../lib/types/user'
+
+export const signToken = (user: IUser) => {
+ return jwt.sign(user, process.env.JWT_SECRET as string, {
+ expiresIn: '30d'
+ })
+}
diff --git a/apps/mobility-bap/utilities/common-utils.ts b/apps/mobility-bap/utilities/common-utils.ts
new file mode 100644
index 000000000..0ca62856b
--- /dev/null
+++ b/apps/mobility-bap/utilities/common-utils.ts
@@ -0,0 +1,40 @@
+export const toBinary = (objectString: string) => {
+ const codeUnits = Uint16Array.from({ length: objectString.length }, (element, index) =>
+ objectString.charCodeAt(index)
+ )
+ const charCodes = new Uint8Array(codeUnits.buffer)
+
+ let result = ''
+ charCodes.forEach(char => {
+ result += String.fromCharCode(char)
+ })
+ return result
+}
+
+export const fromBinary = (binary: string) => {
+ const bytes = Uint8Array.from({ length: binary.length }, (element, index) => binary.charCodeAt(index))
+ const charCodes = new Uint16Array(bytes.buffer)
+
+ let result = ''
+ charCodes.forEach(char => {
+ result += String.fromCharCode(char)
+ })
+ return result
+}
+
+export const areObjectPropertiesEqual = (obj1: any, obj2: any) => {
+ const keys1 = Object.keys(obj1)
+ const keys2 = Object.keys(obj2)
+
+ if (keys1.length !== keys2.length) {
+ return false
+ }
+
+ for (let key of keys1) {
+ if (obj1[key] !== obj2[key]) {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/apps/mobility-bap/utilities/confirm-utils.ts b/apps/mobility-bap/utilities/confirm-utils.ts
new file mode 100644
index 000000000..bf4b0541a
--- /dev/null
+++ b/apps/mobility-bap/utilities/confirm-utils.ts
@@ -0,0 +1,162 @@
+import { ResponseModel } from '../lib/types/responseModel'
+
+export const getInitMetaDataPerBpp = (initRes: ResponseModel[]) => {
+ const itemsPerBpp = {}
+ initRes.forEach(res => {
+ const bppId = res.context.bpp_id
+ const bpp_uri = res.context.bpp_uri
+
+ itemsPerBpp[bppId] = {
+ ...res.message.catalogs.responses[0].message.order,
+ bpp_uri
+ }
+ })
+
+ return itemsPerBpp
+}
+
+export const getConfirmMetaDataForBpp = (initRes: ResponseModel[]) => {
+ const itemsPerBpp = {}
+ initRes.forEach(res => {
+ const bppId = res.context.bpp_id
+ const bpp_uri = res.context.bpp_uri
+
+ itemsPerBpp[bppId] = {
+ ...res.message.responses[0].message.order,
+ bpp_uri
+ }
+ })
+
+ return itemsPerBpp
+}
+
+export const getPayloadForConfirmRequest = (
+ initMetaDataPerBpp: any,
+ transactionId: { transactionId: string },
+ userId: string
+) => {
+ const payload: any = {
+ confirmRequestDto: [],
+ userId: userId
+ }
+
+ Object.keys(initMetaDataPerBpp).forEach(bppId => {
+ const confirmItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: initMetaDataPerBpp[bppId].bpp_uri,
+ domain: 'retail'
+ },
+
+ message: {
+ order: {
+ provider: {
+ id: initMetaDataPerBpp[bppId].provider.id
+ },
+ addOns: [],
+ offers: [],
+ billing: initMetaDataPerBpp[bppId].billing,
+ fulfillment: {
+ type: initMetaDataPerBpp[bppId].fulfillment.type,
+ end: {
+ location: {
+ gps: initMetaDataPerBpp[bppId].fulfillment.end.location.gps,
+ address: initMetaDataPerBpp[bppId].billing.address
+ },
+ contact: {
+ phone: initMetaDataPerBpp[bppId].billing.phone,
+ email: 'testemail1@mailinator.com'
+ }
+ },
+ customer: {
+ person: {
+ name: initMetaDataPerBpp[bppId].billing.name
+ }
+ },
+ id: initMetaDataPerBpp[bppId].fulfillment.id
+ },
+ payment: initMetaDataPerBpp[bppId].payment,
+ items: []
+ }
+ }
+ }
+
+ initMetaDataPerBpp[bppId].items.forEach((item: any) => {
+ const itemObject = {
+ quantity: item.quantity,
+ id: item.id
+ }
+ confirmItem.message.order.items.push(itemObject)
+ })
+
+ payload.confirmRequestDto.push(confirmItem)
+ })
+
+ return payload
+}
+
+export const getPayloadForStatusRequest = (
+ confirmOrderMetaDataPerBpp: any,
+ transactionId: { transactionId: string }
+) => {
+ const payload: any = {
+ statusRequestDto: []
+ }
+
+ Object.keys(confirmOrderMetaDataPerBpp).forEach(bppId => {
+ const statusItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: confirmOrderMetaDataPerBpp[bppId].bpp_uri,
+ domain: 'retail'
+ },
+
+ message: {
+ order_id: confirmOrderMetaDataPerBpp[bppId].id
+ }
+ }
+
+ payload.statusRequestDto.push(statusItem)
+ })
+
+ return payload
+}
+
+export const getPayloadForTrackRequest = (
+ confirmOrderMetaDataPerBpp: any,
+ transactionId: { transactionId: string }
+) => {
+ const payload: any = {
+ trackRequestDto: []
+ }
+
+ Object.keys(confirmOrderMetaDataPerBpp).forEach(bppId => {
+ const statusItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: confirmOrderMetaDataPerBpp[bppId].bpp_uri,
+ domain: 'retail'
+ },
+
+ message: {
+ order_id: confirmOrderMetaDataPerBpp[bppId].id
+ }
+ }
+
+ payload.trackRequestDto.push(statusItem)
+ })
+
+ return payload
+}
+
+export const getOrderPlacementTimeline = (timeStamp: string) => {
+ const localDateAndTime = new Date(timeStamp)
+ const localTime = localDateAndTime.toLocaleTimeString()
+ const localDate = localDateAndTime.toDateString()
+ const localDateWithoutDay = localDate.split(' ').slice(1).join(' ')
+
+ return `${localDateWithoutDay}, ${localTime}`
+}
diff --git a/apps/mobility-bap/utilities/currencyFormat.ts b/apps/mobility-bap/utilities/currencyFormat.ts
new file mode 100644
index 000000000..00012cd95
--- /dev/null
+++ b/apps/mobility-bap/utilities/currencyFormat.ts
@@ -0,0 +1,9 @@
+// Rial currency format
+export const irrCurrencyFormat = (price: number | undefined) => {
+ return price ? new Intl.NumberFormat('fa-IR').format(price) : null
+}
+
+//pound currency format
+export const gbpCurrencyFormat = (price: number | undefined) => {
+ return price ? new Intl.NumberFormat('en-GB').format(price) : null
+}
diff --git a/apps/mobility-bap/utilities/detailsForm-utils.ts b/apps/mobility-bap/utilities/detailsForm-utils.ts
new file mode 100644
index 000000000..551ab3088
--- /dev/null
+++ b/apps/mobility-bap/utilities/detailsForm-utils.ts
@@ -0,0 +1,41 @@
+import { ShippingFormData } from '../pages/checkoutPage'
+
+export interface FormErrors {
+ name?: string
+ mobileNumber?: string
+ email?: string
+ address?: string
+ zipCode?: string
+}
+
+export const validateForm = (formData: ShippingFormData): FormErrors => {
+ const errors: FormErrors = {}
+
+ if (formData.name.trim() === '') {
+ errors.name = 'errorName'
+ }
+
+ if (formData.mobileNumber.trim() === '') {
+ errors.mobileNumber = 'errorNumber'
+ } else if (!/^\d{10}$/.test(formData.mobileNumber)) {
+ errors.mobileNumber = 'errorNumber2'
+ }
+
+ if (formData.email.trim() === '') {
+ errors.email = 'errorEmail'
+ } else if (!/^\S+@\S+\.\S+$/.test(formData.email)) {
+ errors.email = 'errorEmail2'
+ }
+
+ if (formData.address.trim() === '') {
+ errors.address = 'errorAddress'
+ }
+
+ if (formData.zipCode.trim() === '') {
+ errors.zipCode = 'errorZipcode'
+ } else if (!/^\d{5}$/.test(formData.zipCode)) {
+ errors.zipCode = 'errorZipcode2'
+ }
+
+ return errors
+}
diff --git a/apps/mobility-bap/utilities/error.ts b/apps/mobility-bap/utilities/error.ts
new file mode 100644
index 000000000..1f5b60102
--- /dev/null
+++ b/apps/mobility-bap/utilities/error.ts
@@ -0,0 +1,4 @@
+const getError = (err: any) =>
+ err.response && err.response.data && err.response.data.message ? err.response.data.message : err.message
+
+export { getError }
diff --git a/apps/mobility-bap/utilities/sortByCost.ts b/apps/mobility-bap/utilities/sortByCost.ts
new file mode 100644
index 000000000..ea06410d1
--- /dev/null
+++ b/apps/mobility-bap/utilities/sortByCost.ts
@@ -0,0 +1,9 @@
+import { RetailItem } from '../lib/types/products'
+
+export const sortByExpensive = (product1: RetailItem, product2: RetailItem): number => {
+ return parseFloat(product2.price.value) - parseFloat(product1.price.value)
+}
+
+export const sortByCheapest = (product1: RetailItem, product2: RetailItem): number => {
+ return parseFloat(product1.price.value) - parseFloat(product2.price.value)
+}
diff --git a/apps/mobility-bap/utilities/sortByPopularity.ts b/apps/mobility-bap/utilities/sortByPopularity.ts
new file mode 100644
index 000000000..f6753420d
--- /dev/null
+++ b/apps/mobility-bap/utilities/sortByPopularity.ts
@@ -0,0 +1,10 @@
+// import { IProduct, RetailItem } from "../lib/types/products";
+
+// export const sortByPoPularity = (
+// product1: RetailItem,
+// product2: RetailItem
+// ): number => {
+// return product2.starRating - product1.starRating;
+// };
+
+export {}
diff --git a/apps/mobility-bap/utilities/sortByTimeStamp.ts b/apps/mobility-bap/utilities/sortByTimeStamp.ts
new file mode 100644
index 000000000..ddfd6137d
--- /dev/null
+++ b/apps/mobility-bap/utilities/sortByTimeStamp.ts
@@ -0,0 +1,28 @@
+// import { IProduct, RetailItem } from "../lib/types/products";
+
+// export function getTimeStamp(date: string) {
+// const creationProductDate = new Date(date);
+// return creationProductDate.getTime();
+// }
+
+// export const sortByTimeStamp = (
+// product1: IProduct,
+// product2: IProduct
+// ): number => {
+// if (product2?.timeStamp && product1?.timeStamp) {
+// return product2?.timeStamp - product1?.timeStamp;
+// }
+// return 0;
+// };
+
+// export const newestProductsFn = (products: RetailItem[]) => {
+// const productsWithTimeStamp = products.map((product) => {
+// return {
+// ...product,
+// timeStamp: getTimeStamp(product.registerDate!),
+// };
+// });
+// return productsWithTimeStamp.sort(sortByTimeStamp);
+// };
+
+export {}
diff --git a/apps/retail/components/cart/cart.types.ts b/apps/retail/components/cart/cart.types.ts
new file mode 100644
index 000000000..80fdc8a1b
--- /dev/null
+++ b/apps/retail/components/cart/cart.types.ts
@@ -0,0 +1,28 @@
+export type SelectItem = {
+ id: string
+ selected: { quantity: { count: number } }
+}
+
+export type SelectItems = SelectItem[]
+
+export type SelectFulfillments = { id: string }[]
+
+export type SelectOrder = {
+ items: SelectItems
+ provider: { id: string }
+ fulfillments: SelectFulfillments
+}
+
+export type SelectContext = {
+ transaction_id: string
+ bpp_id: string
+ bpp_uri: string
+ domain: string
+}
+
+export type SelectSingleData = {
+ context: SelectContext
+ message: { orders: SelectOrder[] }
+}
+
+export type SelectData = SelectSingleData[]
diff --git a/apps/retail/components/cart/cart.utils.tsx b/apps/retail/components/cart/cart.utils.tsx
new file mode 100644
index 000000000..f8e239c41
--- /dev/null
+++ b/apps/retail/components/cart/cart.utils.tsx
@@ -0,0 +1,73 @@
+import { SelectData } from './cart.types'
+
+export const getSelectPayload = (inputData: any, transactionId: string, domain = 'retail'): { data: SelectData } => {
+ const transaction_id = transactionId
+
+ const resultData = []
+
+ const bppGroups = inputData.reduce((acc, item) => {
+ if (!acc[item.bpp_id]) {
+ acc[item.bpp_id] = []
+ }
+ acc[item.bpp_id].push(item)
+ return acc
+ }, {})
+
+ Object.entries(bppGroups).forEach(([bpp_id, items]) => {
+ console.log('Dank', bpp_id)
+ const context = {
+ transaction_id,
+ bpp_id,
+ bpp_uri: items[0].bpp_uri,
+ domain
+ }
+
+ const orders = []
+
+ const providerGroups = items.reduce((acc, item) => {
+ const providerKey = `${item.providerId}`
+ if (!acc[providerKey]) {
+ acc[providerKey] = []
+ }
+ acc[providerKey].push(item)
+ return acc
+ }, {})
+
+ Object.values(providerGroups).forEach(group => {
+ group.forEach(item => {
+ const orderIndex = orders.findIndex(order => order.provider.id === item.providerId)
+ const newItem = {
+ id: item.id,
+ quantity: {
+ selected: {
+ count: item.quantity
+ }
+ }
+ }
+
+ if (orderIndex > -1) {
+ orders[orderIndex].items.push(newItem)
+ } else {
+ orders.push({
+ items: [newItem],
+ provider: {
+ id: item.providerId
+ },
+ fulfillments:
+ item.fulfillments &&
+ item.fulfillments.map(fulfillment => ({
+ id: fulfillment.id
+ }))
+ })
+ }
+ })
+ })
+
+ resultData.push({
+ context,
+ message: { orders }
+ })
+ })
+
+ return { data: resultData }
+}
diff --git a/apps/retail/components/cart/index.tsx b/apps/retail/components/cart/index.tsx
new file mode 100644
index 000000000..25eb7e79a
--- /dev/null
+++ b/apps/retail/components/cart/index.tsx
@@ -0,0 +1,3 @@
+import Cart from './cart'
+
+export default Cart
diff --git a/apps/retail/components/checkout/checkout.utils.tsx b/apps/retail/components/checkout/checkout.utils.tsx
new file mode 100644
index 000000000..087d490db
--- /dev/null
+++ b/apps/retail/components/checkout/checkout.utils.tsx
@@ -0,0 +1,286 @@
+import { CartRetailItem, DataPerBpp } from '@lib/types/cart'
+import { ResponseModel } from '@lib/types/responseModel'
+import { ShippingFormData } from '../checkout'
+import { areObjectPropertiesEqual } from '@utils/common-utils'
+import { ShippingFormInitialValuesType } from '@beckn-ui/becknified-components'
+
+export const getPayloadForInitRequest = (
+ cartItemsPerBppPerProvider: DataPerBpp,
+ transactionId: { transactionId: string },
+ customerAddress: ShippingFormInitialValuesType,
+ billingFormData: ShippingFormInitialValuesType
+) => {
+ const payload: any = {
+ initRequestDto: []
+ }
+
+ Object.keys(cartItemsPerBppPerProvider).forEach(bppId => {
+ const cartItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: cartItemsPerBppPerProvider[bppId][0].bpp_uri,
+ domain: 'retail'
+ },
+ message: {
+ order: {
+ items: [],
+ provider: {
+ id: cartItemsPerBppPerProvider[bppId][0].providerId,
+ locations: [
+ {
+ id: cartItemsPerBppPerProvider[bppId][0].location_id
+ }
+ ]
+ },
+ addOns: [],
+ offers: [],
+ billing: {
+ name: customerAddress.name,
+ phone: customerAddress.mobileNumber,
+ address: {
+ door: '',
+ building: customerAddress.address,
+ city: customerAddress.address,
+ state: customerAddress.address,
+ country: 'IND',
+ area_code: customerAddress.pinCode
+ },
+ email: 'testemail1@mailinator.com'
+ },
+ fulfillment: {
+ type: 'HOME-DELIVERY',
+ end: {
+ location: {
+ gps: cartItemsPerBppPerProvider[bppId][0].locations[0].gps,
+ address: {
+ door: '',
+ building: customerAddress.address,
+ street: customerAddress.address,
+ city: customerAddress.address,
+ state: customerAddress.address,
+ country: 'IND',
+ area_code: '560076'
+ }
+ },
+ contact: {
+ phone: '9191223433',
+ email: 'testemail1@mailinator.com'
+ }
+ },
+ customer: {
+ person: {
+ name: customerAddress.name
+ }
+ },
+ id: cartItemsPerBppPerProvider[bppId][0].providerId
+ }
+ }
+ }
+ }
+ cartItemsPerBppPerProvider[bppId].forEach((item: any) => {
+ if (item.bpp_id === bppId) {
+ const itemObject = {
+ quantity: {
+ count: item.quantity
+ },
+ id: item.id
+ }
+ cartItem.message.order.items.push(itemObject)
+ }
+ })
+ payload.initRequestDto.push(cartItem)
+ })
+ return payload
+}
+
+export const getSubTotalAndDeliveryCharges = (initData: any) => {
+ let subTotal = 0
+ let totalDeliveryCharge = 0
+ let currencySymbol
+
+ if (initData && initData.length > 0) {
+ initData.forEach(data => {
+ const deliveryAmount = parseFloat(data.message.order.quote.breakup[1].price.value).toFixed(2)
+ totalDeliveryCharge += parseFloat(deliveryAmount)
+
+ const subTotalAmount = parseFloat(data.message.order.quote.breakup[0].price.value).toFixed(2)
+
+ currencySymbol = data.message.order.quote.price.currency
+
+ subTotal += parseFloat(parseFloat(subTotalAmount).toFixed(2))
+ })
+ }
+
+ return { subTotal, totalDeliveryCharge, currencySymbol }
+}
+
+export const getTotalCartItems = (cartItems: CartRetailItem[]) => {
+ let quantity = 0
+
+ cartItems.forEach(item => {
+ quantity += item.quantity
+ })
+
+ return quantity
+}
+
+export const areShippingAndBillingDetailsSame = (
+ isBillingAddressComplete: boolean,
+ formData: ShippingFormData,
+ billingFormData: ShippingFormData
+) => {
+ if (isBillingAddressComplete) {
+ return areObjectPropertiesEqual(formData, billingFormData)
+ }
+ return !isBillingAddressComplete
+}
+
+const extractAddressComponents = (result: any) => {
+ let country = null,
+ state = null,
+ city = null
+
+ for (const component of result.address_components) {
+ if (component.types.includes('country')) {
+ country = component.long_name
+ } else if (component.types.includes('administrative_area_level_1')) {
+ state = component.long_name
+ } else if (component.types.includes('locality')) {
+ city = component.long_name
+ }
+ }
+ return { country, state, city }
+}
+
+const geocodeFromPincode = async (pincode: any) => {
+ const geocoder = new window.google.maps.Geocoder()
+ try {
+ const response = await geocoder.geocode({ address: pincode })
+ console.log('Dank', response)
+ if (response.results.length > 0) {
+ const { country, state, city } = extractAddressComponents(response.results[0])
+ const lat = response.results[0].geometry.location.lat()
+ const lng = response.results[0].geometry.location.lng()
+ return { country, state, city, lat, lng }
+ } else {
+ console.log('No results found')
+ }
+ } catch (error) {
+ console.error(error)
+ }
+}
+
+export const getInitPayload = async (
+ deliveryAddress: any,
+ billingAddress: any,
+ cartItems: any,
+ transaction_id: string,
+ domain: string = 'retail:1.1.0'
+) => {
+ const cityData = await geocodeFromPincode(deliveryAddress.pinCode)
+
+ const bppGroups = cartItems.reduce((acc, item) => {
+ if (!acc[item.bpp_id]) {
+ acc[item.bpp_id] = []
+ }
+ acc[item.bpp_id].push(item)
+ return acc
+ }, {})
+
+ const data = Object.entries(bppGroups).map(([bpp_id, items]) => {
+ return {
+ context: {
+ transaction_id: transaction_id,
+ bpp_id: bpp_id,
+ bpp_uri: items[0].bpp_uri,
+ domain: domain
+ },
+ message: {
+ orders: transformOrdersByProvider(items)
+ }
+ }
+ })
+
+ function transformOrdersByProvider(items) {
+ const providerGroups = items.reduce((acc, item) => {
+ const providerKey = `${item.bpp_id}_${item.providerId}`
+ if (!acc[providerKey]) {
+ acc[providerKey] = []
+ }
+ acc[providerKey].push(item)
+ return acc
+ }, {})
+
+ return Object.values(providerGroups).map(group => {
+ const providerId = group[0].providerId
+ const items = group.map(item => ({
+ id: item.id,
+ quantity: {
+ selected: {
+ count: item.quantity
+ }
+ }
+ }))
+
+ const fulfillments = [
+ {
+ id: '3',
+ type: 'standard-shipping',
+ stops: [
+ {
+ location: {
+ gps: `${cityData.lat},${cityData.lng}`,
+ address: deliveryAddress.address,
+ city: {
+ name: cityData?.city
+ },
+ state: {
+ name: cityData?.state
+ },
+ country: {
+ code: 'IND'
+ },
+ area_code: deliveryAddress.pinCode
+ },
+ contact: {
+ phone: deliveryAddress.mobileNumber,
+ email: deliveryAddress.email
+ }
+ }
+ ]
+ }
+ ]
+
+ return {
+ provider: {
+ id: providerId
+ },
+ items,
+ fulfillments,
+ customer: {
+ person: {
+ name: deliveryAddress.name
+ },
+ contact: {
+ phone: deliveryAddress.mobileNumber
+ }
+ },
+ billing: {
+ name: billingAddress.name,
+ phone: billingAddress.mobileNumber,
+ address: billingAddress.address,
+ email: billingAddress.email,
+ city: {
+ name: cityData?.city
+ },
+ state: {
+ name: cityData?.state
+ }
+ }
+ }
+ })
+ }
+
+ return { data }
+}
diff --git a/apps/retail/components/checkout/index.tsx b/apps/retail/components/checkout/index.tsx
new file mode 100644
index 000000000..eb9a164a4
--- /dev/null
+++ b/apps/retail/components/checkout/index.tsx
@@ -0,0 +1,3 @@
+import checkout from '../checkout'
+
+export default checkout
diff --git a/apps/retail/components/filter/Filter.tsx b/apps/retail/components/filter/Filter.tsx
index 8a3f91a19..4673c62d3 100644
--- a/apps/retail/components/filter/Filter.tsx
+++ b/apps/retail/components/filter/Filter.tsx
@@ -56,21 +56,27 @@ export const theme = extendTheme({
}
})
-const Filter = () => {
+const Filter = ({ handleApplyFilter, handleResetFilter }) => {
const [formData, setFormData] = useState({})
+ const [sortBy, setSortBy] = useState('')
const handleChange = (name: string, value: string) => {
+ setSortBy(value)
setFormData(prevData => ({
...prevData,
[name]: value
}))
}
-
+ const resetFilter = () => {
+ setSortBy('')
+ setFormData({})
+ handleResetFilter()
+ }
return (
<>
{
Reset
@@ -93,32 +101,8 @@ const Filter = () => {
handleChange('searchBy1', e.target.value)}
- value={formData.searchBy1 || ''}
- fontSize="15px"
- height={'30px'}
- border={'unset'}
- borderRadius="unset"
- borderBottom={'1px solid'}
- paddingBottom={'2px'}
- >
- Search by
- Relevance1
- Relevance2
-
-
- Search by
-
-
-
-
-
- handleChange('searchBy2', e.target.value)}
- value={formData.searchBy2 || ''}
+ onChange={e => handleChange('searchByPrice', e.target.value)}
+ value={formData.searchByPrice || ''}
fontSize="15px"
height={'30px'}
border={'unset'}
@@ -126,23 +110,24 @@ const Filter = () => {
borderBottom={'1px solid'}
paddingBottom={'2px'}
>
- Service Type
- Relevance1
- Relevance2
+ Price
+ Price -- Low to High
+ Price -- High to Low
- Service Type
+ Sort By Price
+
handleChange('searchBy3', e.target.value)}
- value={formData.searchBy3 || ''}
+ onChange={e => handleChange('searchByRating', e.target.value)}
+ value={formData.searchByRating || ''}
fontSize="15px"
height={'30px'}
border={'unset'}
@@ -151,51 +136,25 @@ const Filter = () => {
paddingBottom={'2px'}
>
Rating
- 1+
- 2+
-
-
- Rating
-
-
-
-
-
- handleChange('searchBy4', e.target.value)}
- value={formData.searchBy4 || ''}
- fontSize="15px"
- height={'30px'}
- border={'unset'}
- borderRadius="unset"
- borderBottom={'1px solid'}
- paddingBottom={'2px'}
- >
- Deals & Discounts
- Relevance1
- Relevance2
+ Rating -- Low to High
+ Rating -- High to Low
- Deals & Discounts
+ Filter By Rating
- {/* */}
{
+ handleApplyFilter(sortBy)
+ }}
/>
diff --git a/apps/retail/components/header/CartIcon.tsx b/apps/retail/components/header/CartIcon.tsx
new file mode 100644
index 000000000..ba89dd4cc
--- /dev/null
+++ b/apps/retail/components/header/CartIcon.tsx
@@ -0,0 +1,44 @@
+import React from 'react'
+import { MouseEventHandler } from 'react'
+import { Box, Flex, Text, Image } from '@chakra-ui/react'
+
+function CartIconWithCount({
+ itemCount = 2,
+ handleClick
+}: {
+ itemCount: number
+ handleClick?: MouseEventHandler
+}) {
+ return (
+
+
+
+ {itemCount}
+
+
+ )
+}
+
+export default CartIconWithCount
diff --git a/apps/retail/components/header/index.tsx b/apps/retail/components/header/index.tsx
index 413dc70c1..49aa7ef4e 100644
--- a/apps/retail/components/header/index.tsx
+++ b/apps/retail/components/header/index.tsx
@@ -1,15 +1,18 @@
import React, { useEffect, useState } from 'react'
import { BottomModal } from '@beckn-ui/molecules'
-import { Box, Divider, Flex, HStack, Image, Text } from '@chakra-ui/react'
-import { useRouter } from 'next/router'
+import { useTheme, Box, Divider, Flex, HStack, Image, Text } from '@chakra-ui/react'
+import { Router, useRouter } from 'next/router'
import styles from './header.module.css'
+import { useSelector, useDispatch } from 'react-redux'
+import { logout } from '@store/authSlice'
import { useLanguage } from '../../hooks/useLanguage'
import Qrcode from '@components/qrCode/Qrcode'
-import BottomModalScan from '@components/BottomModal/BottomModalScan'
import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import CartIconWithCount from './CartIcon'
import TopSheet from '@components/topSheet/TopSheet'
+import { ICartRootState } from '@lib/types'
type PathnameObjectType = { [key: string]: string }
@@ -19,27 +22,26 @@ const cartIconBlackList: string[] = [
'/trackOrder',
'/feedback',
'/orderHistory',
- '/',
+ '/signin',
'/mobileOtp',
- '/cart',
'/checkoutPage',
'/paymentMode',
- '/search',
- '/product',
'/signUp',
- '/invoiceDetails'
+ '/invoiceDetails',
+ '/',
+ '/cart'
]
-const backIconList = ['/', '/homePage']
+const backIconList = ['/', '/signin']
-const homeIconBlackList = ['/', '/homePage', '/mobileOtp', '/paymentMode', '/signUp']
+const homeIconBlackList = ['/', '/signin', '/mobileOtp', '/paymentMode', '/signUp']
const storeHeaderBlackList = [
'/checkoutPage',
'/orderHistory',
'/orderDetails',
'/cart',
- '/homePage',
+ '/',
'/orderConfirmation',
'feedback',
'/',
@@ -50,14 +52,16 @@ const storeHeaderBlackList = [
'/assemblyDetails',
'/updateShippingDetails',
'/orderCancellation',
- '/profile'
+ '/profile',
+ '/search',
+ '/checkout'
]
const headerValues: PathnameObjectType = {
'/checkoutPage': 'Review Purchase Order',
- '/orderHistory': 'Order History',
+ '/orderHistory': 'My Orders',
'/orderDetails': 'Order Details',
'/invoiceDetails': 'Invoice Details',
- '/': 'Sign In',
+ '/signin': 'Sign In',
'/signUp': 'Sign Up',
'/cart': 'Cart',
'/paymentMode': 'Select Payment Method',
@@ -65,8 +69,9 @@ const headerValues: PathnameObjectType = {
'/updateShippingDetails': 'Shipping Details',
'/orderCancellation': 'Order Cancel',
'/feedback': '',
- '/profile': 'Profile'
- // '/search':'Search results'
+ '/profile': 'Profile',
+ '/search': 'Search results',
+ '/checkout': 'Billing & Shipping'
}
const headerValuesFrench: PathnameObjectType = {
@@ -84,10 +89,10 @@ const topHeaderBlackList: string[] = []
const bottomHeaderBlackList = ['/orderConfirmation']
-const menuIconWhiteList = ['/homePage', '/search', '/profile']
+const menuIconWhiteList = ['/', '/search', '/profile']
const orderIconList = ['/orderDetails']
const invoiceDownloadIcon = ['/invoiceDetails']
-const currentLocation = ['/homePage']
+const currentLocation = ['/']
const getHeaderTitleForPage = (name: string, logo: string, pathName: string, locale: string | undefined) => {
const values = locale === 'en' ? headerValues : headerValuesFrench
@@ -109,6 +114,7 @@ export interface TopHeaderProps {
const TopHeader: React.FC = ({ handleMenuClick }) => {
const [isMenuModalOpen, setMenuModalOpen] = useState(false)
+ const dispatch = useDispatch()
const { t, locale } = useLanguage()
const router = useRouter()
@@ -125,10 +131,10 @@ const TopHeader: React.FC = ({ handleMenuClick }) => {
>
- {/* */}
+ />
{!homeIconBlackList.includes(router.pathname) && (
@@ -140,7 +146,7 @@ const TopHeader: React.FC = ({ handleMenuClick }) => {
const user = localStorage.getItem('userPhone') as string
localStorage.clear()
localStorage.setItem('userPhone', user)
- router.push(`/homePage`)
+ router.push(`/`)
}}
src="/images/Home_icon.svg"
alt="home Icon"
@@ -162,33 +168,73 @@ const TopHeader: React.FC = ({ handleMenuClick }) => {
{/* Menu Modal */}
- {
- router.push('/orderHistory')
- setMenuModalOpen(false)
- }}
- className={styles.top_header_modal}
- >
-
- {t['orderHistory']}
-
+
+ {
+ router.push('/profile')
+ setMenuModalOpen(false)
+ }}
+ className={styles.top_header_modal}
+ >
+
+ {t['profileIcon']}
+
+ {
+ router.push('/orderHistory')
+ setMenuModalOpen(false)
+ }}
+ className={styles.top_header_modal}
+ >
+
+ {t['orderHistoryIcon']}
+
+ {
+ dispatch(logout())
+ router.push('/signin')
+ setMenuModalOpen(false)
+ }}
+ className={styles.top_header_modal}
+ >
+
+ {t['logoutIcon']}
+
+
>
)
}
+const getLocalStorage = (item: string) => {
+ if (typeof window !== 'undefined' && window.localStorage) {
+ return localStorage.getItem(item)
+ } else {
+ return ''
+ }
+}
const BottomHeader = () => {
const [optionTags, setOptionTags] = useState()
const { t, locale } = useLanguage()
const [isOrderModalOpen, setOrderModalOpen] = useState(false)
const [isInvoiceModalOpen, setInvoiceModalOpen] = useState(false)
+ const cartItems = useSelector((state: ICartRootState) => state.cart.items)
+ const theme = useTheme()
+ const storedHeaderText = getLocalStorage('selectCardHeaderText')
const [currentAddress, setCurrentAddress] = useState('')
const [loadingForCurrentAddress, setLoadingForCurrentAddress] = useState(true)
@@ -289,25 +335,26 @@ const BottomHeader = () => {
/>
)}
- {getHeaderTitleForPage(optionTags?.name, optionTags?.logo, router.pathname, locale)}
+ {getHeaderTitleForPage(
+ // optionTags?.name,
+ storedHeaderText as string,
+ optionTags?.logo,
+ router.pathname,
+ locale
+ )}
{!cartIconBlackList.includes(router.pathname) && (
- router.push('/cart')}
- cursor="pointer"
- >
-
-
+ router.push('/cart')}
+ />
)}
{orderIconList.includes(router.pathname) && (
setOrderModalOpen(true)}
- src="/images/orderDetailsIcon.svg"
+ src="/images/downloadInvoice.svg"
alt="order icon"
mr={'20px'}
/>
@@ -327,6 +374,7 @@ const BottomHeader = () => {
title=""
isOpen={isOrderModalOpen}
onClose={handleOrderModalClose}
+ responsive={true}
>
{
@@ -342,10 +390,10 @@ const BottomHeader = () => {
{t['invoiceDetails']}
-
{
-
+
)
}
diff --git a/apps/retail/components/layout/Layout.tsx b/apps/retail/components/layout/Layout.tsx
index 9c4e07f49..7a1b4f6b4 100644
--- a/apps/retail/components/layout/Layout.tsx
+++ b/apps/retail/components/layout/Layout.tsx
@@ -25,8 +25,8 @@ const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
})
return (
- //
-
+ //
+
Kuza One
@@ -57,8 +57,8 @@ const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
rtl={locale === 'en' ? false : true}
position={locale === 'en' ? 'top-right' : 'top-left'}
/>
-
- //
+
+ //
)
}
diff --git a/apps/retail/components/orderDetailComponents/Shipping.tsx b/apps/retail/components/orderDetailComponents/Shipping.tsx
new file mode 100644
index 000000000..d42c4e4aa
--- /dev/null
+++ b/apps/retail/components/orderDetailComponents/Shipping.tsx
@@ -0,0 +1,85 @@
+import React from 'react'
+import {Typography} from '@beckn-ui/molecules'
+import {Box,Stack,StackDivider,Flex,Image} from '@chakra-ui/react'
+
+export interface ShippingBlockProps {
+ title?:string
+ name:{
+ icon:any,
+ text:string
+ }
+ address:{
+ icon:any,
+ text:string
+ }
+ mobile:{
+ icon:any,
+ text:string
+ },
+ responsive?:boolean
+
+}
+
+ const ShippingBlock:React.FC = ({
+ title,name,address,mobile,responsive
+ })=> {
+ return (
+
+ {title &&
+
+ }
+
+ }
+ spacing="4"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ShippingBlock
\ No newline at end of file
diff --git a/apps/retail/components/orderDetailComponents/ViewMoreOrder.tsx b/apps/retail/components/orderDetailComponents/ViewMoreOrder.tsx
new file mode 100644
index 000000000..3685a328a
--- /dev/null
+++ b/apps/retail/components/orderDetailComponents/ViewMoreOrder.tsx
@@ -0,0 +1,103 @@
+import {
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ Flex,
+ ModalCloseButton,
+ Divider,
+ ModalBody,
+ Box,
+ Text,
+ Image
+} from '@chakra-ui/react'
+import React from 'react'
+import { Button, Typography } from '@beckn-ui/molecules'
+import ButtonComp from '../button/Button'
+import crossIcon from '../../public/images/crossIcon.svg'
+import { useLanguage } from '../../hooks/useLanguage'
+import { currencyMap } from '@lib/config'
+
+export interface ViewMoreOrderModalProps {
+ isOpen: boolean
+ onOpen: () => void
+ onClose: () => void
+ items: any
+ orderId: string
+}
+
+const ViewMoreOrderModal: React.FC = props => {
+ const { t } = useLanguage()
+ console.log('Dank view', props.items)
+ return (
+ <>
+
+
+
+
+
+ {t.orderId}: {props.orderId}
+
+
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+
+
+
+
+
+
+ {props.items.map((item: any) => {
+ return (
+
+
+ {item.name}
+
+ x {item.quantity.selected.count}
+
+
+
+
+ )
+ })}
+
+
+
+
+
+ >
+ )
+}
+
+export default ViewMoreOrderModal
diff --git a/apps/retail/components/signIn/SignIn.tsx b/apps/retail/components/signIn/SignIn.tsx
index 88d7296e2..e5c62ac08 100644
--- a/apps/retail/components/signIn/SignIn.tsx
+++ b/apps/retail/components/signIn/SignIn.tsx
@@ -1,18 +1,17 @@
-import React, { useState } from 'react'
+import React, { useEffect, useState } from 'react'
import Logo from '../../public/images/Logo.svg'
import AlternateLogo from '../../public/images/KuzaLogo.svg'
import { useLanguage } from '@hooks/useLanguage'
import { SignInPropsModel } from './SignIn.types'
import { FormErrors, signInValidateForm } from '@utils/form-utils'
-import { useBreakpoint } from '@chakra-ui/react'
+import { useDispatch } from 'react-redux'
+import { useLoginMutation } from '@services/Users'
import { BecknAuth } from '@beckn-ui/becknified-components'
-import api from '../../services/Users'
import { FaGoogle } from 'react-icons/fa'
import Router from 'next/router'
-import { Box, useToast, Text } from '@chakra-ui/react'
-import Cookies from 'js-cookie'
+import { Box, useToast, Text, useBreakpoint } from '@chakra-ui/react'
const SignIn = () => {
const { t } = useLanguage()
@@ -20,13 +19,12 @@ const SignIn = () => {
const [formData, setFormData] = useState({ email: '', password: '' })
const [formErrors, setFormErrors] = useState({ email: '', password: '' })
const [isFormFilled, setIsFormFilled] = useState(false)
- const toast = useToast()
const breakpoint = useBreakpoint()
- // const [updatePost, result] = useSignInMutation()
const mobileBreakpoints = ['base', 'sm', 'md', 'lg']
const currentLogo = mobileBreakpoints.includes(breakpoint) ? Logo : AlternateLogo
+ const [login, { isLoading }] = useLoginMutation()
- const baseUrl = process.env.NEXT_PUBLIC_STRAPI_URL
+ const toast = useToast()
const handleInputChange = (e: React.ChangeEvent) => {
const { name, value } = e.target
@@ -56,37 +54,20 @@ const SignIn = () => {
}
try {
- const response = await fetch(`${baseUrl}/auth/local`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(signInData)
- })
-
- if (response.ok) {
- const data = await response.json()
- const token = data.jwt
-
- Cookies.set('authToken', token)
- Router.push('/homePage')
- } else {
- const errorData = await response.json()
- toast({
- render: () => (
-
- ),
- position: 'top',
- duration: 2000,
- isClosable: true
- })
- console.error('Registration failed')
- }
+ login(signInData).unwrap()
} catch (error) {
console.error('An error occurred:', error)
+ toast({
+ render: () => (
+
+ ),
+ position: 'top',
+ duration: 2000,
+ isClosable: true
+ })
}
}
@@ -103,7 +84,8 @@ const SignIn = () => {
handleClick: handleSignIn,
disabled: !isFormFilled,
variant: 'solid',
- colorScheme: 'primary'
+ colorScheme: 'primary',
+ isLoading: isLoading
},
{
text: t.signUp,
@@ -112,7 +94,8 @@ const SignIn = () => {
},
disabled: false,
variant: 'outline',
- colorScheme: 'primary'
+ colorScheme: 'primary',
+ isLoading: isLoading
}
],
socialButtons: [
diff --git a/apps/retail/hooks/useRequest.tsx b/apps/retail/hooks/useRequest.tsx
new file mode 100644
index 000000000..29ec9c534
--- /dev/null
+++ b/apps/retail/hooks/useRequest.tsx
@@ -0,0 +1,29 @@
+import { useState } from 'react'
+import axios from 'axios'
+import { ResponseModel } from '../lib/types/responseModel'
+
+const useRequest = () => {
+ const [data, setData] = useState<(ResponseModel & ResponseModel[]) | null>(null)
+ const [loading, setLoading] = useState(false)
+ const [error, setError] = useState('')
+
+ const fetchData = async (url: string, method = 'POST', payLoad: any = null) => {
+ try {
+ setLoading(true)
+ const response = await axios.request({
+ url,
+ method,
+ data: payLoad
+ })
+ setData(response.data)
+ } catch (error: any) {
+ setError(error.message)
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ return { data, loading, error, fetchData }
+}
+
+export default useRequest
diff --git a/apps/retail/lib/config.ts b/apps/retail/lib/config.ts
new file mode 100644
index 000000000..ce27ad1ae
--- /dev/null
+++ b/apps/retail/lib/config.ts
@@ -0,0 +1,6 @@
+export const DOMAIN = 'retail:1.1.0'
+
+export const currencyMap = {
+ EUR: '€',
+ INR: '₹'
+}
diff --git a/apps/retail/lib/types/beckn/index.ts b/apps/retail/lib/types/beckn/index.ts
new file mode 100644
index 000000000..74b6aa9b0
--- /dev/null
+++ b/apps/retail/lib/types/beckn/index.ts
@@ -0,0 +1 @@
+export * from './search'
diff --git a/apps/retail/lib/types/beckn/search.ts b/apps/retail/lib/types/beckn/search.ts
new file mode 100644
index 000000000..4f2994b7b
--- /dev/null
+++ b/apps/retail/lib/types/beckn/search.ts
@@ -0,0 +1,113 @@
+import { Coordinate } from '@utils/homePage.utils'
+
+interface Location {
+ id: string
+ city: {
+ code: string
+ name: string
+ }
+ gps: string
+}
+
+interface Price {
+ value: string
+ currency: string
+}
+
+interface Tag {
+ code: string
+ name: string
+ display: boolean
+ list?: Array<{
+ name: string
+ value: string
+ }>
+}
+
+interface Fulfillment {
+ id: string
+ type: string
+ tracking: boolean
+ tags: Tag[]
+}
+
+interface Image {
+ url: string
+ size_type: string
+}
+
+export interface Item {
+ rating: number
+ long_desc: string
+ short_desc: string
+ id: string
+ name: string
+ price: Price
+ locations: Location[]
+ fulfillments: Fulfillment[]
+ images: Image[]
+ tags: Tag[]
+ rating?: string
+}
+
+interface LocationProvider {
+ id: string
+ name: string
+ rating: string
+ locations: Location[]
+ items: Item[]
+ images: Image[]
+}
+
+interface Message {
+ name: string
+ providers: LocationProvider[]
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+export interface SearchResponseModel {
+ context: Context
+ message: Message
+}
+
+export interface ParsedItemModel {
+ id: string
+ bppId: string
+ bppUri: string
+ domain: string
+ transactionId: string
+ providerId: string
+ providerName: string
+ item: Item
+ providerCoordinates: Coordinate
+}
+
+export interface AssemblyData {
+ type: string
+ colour: string
+ shape: string
+ length: string
+ width: string
+ quantity?: number
+ weight: string
+}
diff --git a/apps/retail/lib/types/beckn/select.ts b/apps/retail/lib/types/beckn/select.ts
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/retail/lib/types/cart.ts b/apps/retail/lib/types/cart.ts
new file mode 100644
index 000000000..056665113
--- /dev/null
+++ b/apps/retail/lib/types/cart.ts
@@ -0,0 +1,71 @@
+import { IProductDetails, RetailItem, TSlug } from './products'
+import { Item } from '@lib/types'
+
+export interface ICartProduct {
+ image: any
+ id?: string
+ name: string
+ slug: TSlug
+ price: number
+ discount?: number
+ brand: string
+ category: string[]
+ starRating: number
+ isOffer?: boolean
+ details?: IProductDetails[]
+ registerDate?: string
+ quantity: number
+ totalPrice: number
+}
+
+export interface CartRetailItem extends Item {
+ quantity: number
+ totalPrice: number
+}
+
+export interface CartItemForRequest extends CartRetailItem {
+ currency: any
+ bpp_id: string
+ bpp_uri: string
+ providerId: string
+ locations: any
+}
+
+// export interface
+
+export interface ICartUI {
+ cartBoxIsVisible: boolean
+}
+
+export interface ICart {
+ items: CartItemForRequest[]
+ totalQuantity: number
+ totalAmount: number
+}
+
+export type ItemPerBpp = Record
+
+//RootState interface => use for state type in useSelector hook
+
+export interface ICartUiRootState {
+ cartUi: ICartUI
+}
+
+export interface ICartRootState {
+ cart: ICart
+}
+
+export interface TransactionIdRootState {
+ transactionId: string
+}
+
+export interface DataPerBpp {
+ [key: string]: CartItemForRequest[]
+}
+
+export type LocalStorageCartItem = {
+ product: ICartProduct
+ quantity: number
+}
+
+export type LocalStorageCart = LocalStorageCartItem[]
diff --git a/apps/retail/lib/types/discovery.ts b/apps/retail/lib/types/discovery.ts
new file mode 100644
index 000000000..c79a71249
--- /dev/null
+++ b/apps/retail/lib/types/discovery.ts
@@ -0,0 +1,3 @@
+export interface DiscoveryRootState {
+ transactionId: string
+}
diff --git a/apps/retail/lib/types/index.ts b/apps/retail/lib/types/index.ts
new file mode 100644
index 000000000..87035b7e9
--- /dev/null
+++ b/apps/retail/lib/types/index.ts
@@ -0,0 +1,6 @@
+import { LocalStorage } from './localstorage'
+export * from './cart'
+export * from './discovery'
+export * from './beckn'
+
+export { LocalStorage }
diff --git a/apps/retail/lib/types/localstorage.ts b/apps/retail/lib/types/localstorage.ts
new file mode 100644
index 000000000..dcd73e222
--- /dev/null
+++ b/apps/retail/lib/types/localstorage.ts
@@ -0,0 +1,4 @@
+export enum LocalStorage {
+ Product = 'productDetails',
+ Cart = 'cart'
+}
diff --git a/apps/retail/locales/en.ts b/apps/retail/locales/en.ts
index b6bd745cd..6be5d7041 100644
--- a/apps/retail/locales/en.ts
+++ b/apps/retail/locales/en.ts
@@ -105,6 +105,12 @@ const en: { [key: string]: string } = {
enterCity: 'Enter City /Town',
enterPincode: 'Enter Pincode',
enterState: 'Enter State / Province',
- enterCountry: 'Enter Country'
+ enterCountry: 'Enter Country',
+ // New Translations
+ orderHistoryIcon: 'My Orders',
+ profileIcon: 'My Profile',
+ logoutIcon: 'Logout',
+ placedAt: 'Placed at',
+ ordersFulfilled: 'Orders Fulfilled'
}
export default en
diff --git a/apps/retail/middleware.ts b/apps/retail/middleware.ts
new file mode 100644
index 000000000..c78d317bb
--- /dev/null
+++ b/apps/retail/middleware.ts
@@ -0,0 +1,28 @@
+// middleware.ts
+
+import { NextRequest, NextResponse } from 'next/server'
+
+export default function middleware(req: NextRequest) {
+ // TypeScript will correctly understand the type of `loggedin`
+ const loggedin = req.cookies.get('authToken')
+ const { pathname } = req.nextUrl
+ console.log('Dank', pathname, loggedin)
+
+ if (loggedin && (pathname === '/signin' || pathname === '/signUp')) {
+ // Correctly redirect to the home page if the user is already logged in
+ return NextResponse.redirect(new URL('/', req.url))
+ }
+
+ if (!loggedin && pathname !== '/signin') {
+ // Redirect to the signin page if the user is not logged in
+ return NextResponse.redirect(new URL('/signin', req.url))
+ }
+
+ // It's important to return a response for all paths, you might want to return `undefined` or `NextResponse.next()`
+ // for other cases to let the request continue.
+ return NextResponse.next()
+}
+
+export const config = {
+ matcher: ['/', '/((?!api|static|.*\\..*|_next).*)']
+}
diff --git a/apps/retail/package.json b/apps/retail/package.json
index a74b2f707..37e5e1cdf 100644
--- a/apps/retail/package.json
+++ b/apps/retail/package.json
@@ -58,6 +58,7 @@
"react-star-rating-component": "^1.4.1",
"react-toastify": "^9.0.7",
"react-transition-group": "^4.4.5",
+ "redux-persist": "^6.0.0",
"slick-carousel": "^1.8.1",
"stripe": "^9.1.0",
"url-loader": "^4.1.1"
@@ -75,5 +76,8 @@
"prettier": "^3.0.3",
"tailwindcss": "^3.1.4",
"typescript": "4.6.4"
+ },
+ "resolutions": {
+ "@types/react": "^17.0.39"
}
}
diff --git a/apps/retail/pages/_app.tsx b/apps/retail/pages/_app.tsx
index c87af32f5..fb758c468 100644
--- a/apps/retail/pages/_app.tsx
+++ b/apps/retail/pages/_app.tsx
@@ -11,8 +11,9 @@ import 'react-toastify/dist/ReactToastify.css'
import '../styles/globals.css'
import { Provider } from 'react-redux'
-import store from '@store/index'
+import store, { persistor } from '@store/index'
import { Garuda } from 'garudaa'
+import { PersistGate } from 'redux-persist/integration/react'
Garuda.init({
projectId: '65c0d663cbe90cafae9185f6',
@@ -24,16 +25,21 @@ function MyApp({ Component, pageProps }: AppProps) {
theme={{
color: {
primary: '#F6D046',
- secondary: '#84B3F9',
+ secondary: '#53A052',
textPrimary: '#1A202C',
textSecondary: '#6B7280'
}
}}
>
-
-
-
+
+
+
+
+
)
diff --git a/apps/retail/pages/_document.tsx b/apps/retail/pages/_document.tsx
index faade8d93..85d992e58 100644
--- a/apps/retail/pages/_document.tsx
+++ b/apps/retail/pages/_document.tsx
@@ -22,7 +22,7 @@ export default function Document() {
/>
diff --git a/apps/retail/pages/cart.tsx b/apps/retail/pages/cart.tsx
index 20e161a5a..2c0fd3f3f 100644
--- a/apps/retail/pages/cart.tsx
+++ b/apps/retail/pages/cart.tsx
@@ -1,8 +1,78 @@
-import EmptyCart from '@components/emptyCart/EmptyCart'
+import { useRouter } from 'next/router'
+
import React from 'react'
+import { useEffect, useState } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { useLanguage } from '@hooks/useLanguage'
+import { Cart as BecknCart } from '@beckn-ui/becknified-components'
+import { useSelectMutation } from '@services/select'
+import { getSelectPayload } from '@components/cart/cart.utils'
+import { cartActions } from '@store/cart-slice'
+import { DOMAIN } from '@lib/config'
+
+import { ICartRootState } from '@lib/types'
+import { DiscoveryRootState } from '@store/discovery-slice'
+
+const Cart = () => {
+ const [fetchQuotes, { isLoading }] = useSelectMutation()
+ const dispatch = useDispatch()
+
+ const router = useRouter()
+ const { t } = useLanguage()
+
+ const { items, totalQuantity } = useSelector((state: ICartRootState) => state.cart)
+ const totalAmount = useSelector((state: ICartRootState) => state.cart.totalAmount)
+ const { transactionId, productList } = useSelector((state: DiscoveryRootState) => state.discovery)
+
+ useEffect(() => {
+ fetchQuotes(getSelectPayload(items, transactionId, DOMAIN))
+ }, [totalQuantity])
+
+ const onOrderClick = () => {
+ router.push('/checkout')
+ }
-const cart = () => {
- return
+ return (
+
+ ({
+ id: singleItem.id,
+ quantity: singleItem.quantity,
+ name: singleItem.name,
+ image: singleItem.images[0].url,
+ price: Number(singleItem.price.value),
+ symbol: singleItem.price.currency,
+ handleIncrement: id => {
+ const selectedItem = productList.find(singleItem => singleItem.id === id)
+ if (selectedItem) {
+ dispatch(cartActions.addItemToCart({ product: selectedItem, quantity: 1 }))
+ }
+ },
+ handleDecrement: id => {
+ dispatch(cartActions.removeItemFromCart(id))
+ }
+ })),
+ loader: { text: 'Loading cart' },
+ orderSummary: {
+ totalAmount: {
+ price: totalAmount,
+ currencyType: items[0].price.currency
+ },
+ totalQuantity: {
+ text: totalQuantity.toString(),
+ variant: 'subTitleSemibold'
+ },
+ pageCTA: {
+ text: 'Proceed to checkout',
+ handleClick: onOrderClick
+ }
+ }
+ }}
+ />
+
+ )
}
-export default cart
+export default Cart
diff --git a/apps/retail/pages/checkout.tsx b/apps/retail/pages/checkout.tsx
new file mode 100644
index 000000000..7cacefa1f
--- /dev/null
+++ b/apps/retail/pages/checkout.tsx
@@ -0,0 +1,249 @@
+import React, { useEffect, useState } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { Box, Flex, Text, Stack, Checkbox } from '@chakra-ui/react'
+import { DOMAIN } from '@lib/config'
+import { useLanguage } from '../hooks/useLanguage'
+
+import { CartItemForRequest, DataPerBpp, ICartRootState, TransactionIdRootState } from '@lib/types/cart'
+import {
+ getInitPayload,
+ areShippingAndBillingDetailsSame,
+ getPayloadForInitRequest,
+ getSubTotalAndDeliveryCharges
+} from '@components/checkout/checkout.utils'
+import useRequest from '../hooks/useRequest'
+import { useInitMutation } from '@services/init'
+import { responseDataActions } from '../store/responseData-slice'
+
+import { Checkout } from '@beckn-ui/becknified-components'
+
+import { Router, useRouter } from 'next/router'
+import { ShippingFormInitialValuesType } from '@beckn-ui/becknified-components'
+import { CheckoutRootState, checkoutActions } from '@store/checkout-slice'
+import { cartActions } from '@store/cart-slice'
+
+export type ShippingFormData = {
+ name: string
+ mobileNumber: string
+ email: string
+ address: string
+ zipCode: string
+}
+
+export const currencyMap = {
+ EUR: '€',
+ INR: '₹'
+}
+
+const CheckoutPage = () => {
+ const [formData, setFormData] = useState({
+ name: 'Antoine Dubois',
+ mobileNumber: '0612345678',
+ email: 'antoine.dubois@gmail.com',
+ address: '15 Rue du Soleil, Paris, France',
+ pinCode: '201002'
+ })
+
+ const [submittedDetails, setSubmittedDetails] = useState({
+ name: 'Antoine Dubois',
+ mobileNumber: '0612345678',
+ email: 'antoine.dubois@gmail.com',
+ address: '15 Rue du Soleil, Paris, France',
+ pinCode: '201002'
+ })
+
+ const [isBillingAddressSameAsShippingAddress, setIsBillingAddressSameAsShippingAddress] = useState(true)
+
+ const [billingFormData, setBillingFormData] = useState({
+ name: 'Antoine Dubois',
+ mobileNumber: '0612345678',
+ email: 'antoine.dubois@gmail.com',
+ address: '15 Rue du Soleil, Paris, France',
+ pinCode: '75001'
+ })
+
+ const [isBillingSame, setIsBillingSame] = useState(true)
+
+ const router = useRouter()
+ const initRequest = useRequest()
+ const dispatch = useDispatch()
+ const [initialize, { isLoading }] = useInitMutation()
+ const { t, locale } = useLanguage()
+ const cartItems = useSelector((state: ICartRootState) => state.cart.items)
+ const initResponse = useSelector((state: CheckoutRootState) => state.checkout.initResponse)
+ const isBillingSameRedux = useSelector((state: CheckoutRootState) => state.checkout.isBillingSame)
+ const { transactionId, productList } = useSelector((state: DiscoveryRootState) => state.discovery)
+ useEffect(() => {
+ if (localStorage) {
+ if (localStorage.getItem('userPhone')) {
+ const copiedFormData = structuredClone(formData)
+ const copiedBillingFormData = structuredClone(billingFormData)
+
+ copiedFormData.mobileNumber = localStorage.getItem('userPhone') as string
+ copiedBillingFormData.mobileNumber = localStorage.getItem('userPhone') as string
+
+ setFormData(copiedFormData)
+ setBillingFormData(copiedBillingFormData)
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ useEffect(() => {
+ if (typeof window !== 'undefined') {
+ if (localStorage.getItem('shippingAdress')) {
+ setFormData(JSON.parse(localStorage.getItem('shippingAdress') as string))
+ }
+ if (localStorage.getItem('billingAddress')) {
+ setBillingFormData(JSON.parse(localStorage.getItem('billingAddress') as string))
+ }
+ }
+ }, [])
+
+ useEffect(() => {
+ const shippingAddressComplete = Object.values(formData).every(value => value.length > 0)
+ if (shippingAddressComplete && typeof window !== 'undefined') {
+ localStorage.setItem('shippingAdress', JSON.stringify(formData))
+ }
+ }, [formData])
+
+ useEffect(() => {
+ const isBillingAddressComplete = Object.values(billingFormData).every(value => value.length > 0)
+
+ if (isBillingAddressComplete && typeof window !== 'undefined') {
+ localStorage.setItem('billingAddress', JSON.stringify(billingFormData))
+ }
+ setIsBillingAddressSameAsShippingAddress(
+ areShippingAndBillingDetailsSame(isBillingAddressComplete, formData, billingFormData)
+ )
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [billingFormData])
+
+ // useEffect(()=>{
+ // setIsBillingSame(isBillingSameRedux)
+ // },[])
+
+ const formSubmitHandler = (data: any) => {
+ if (data) {
+ getInitPayload(data, billingFormData, cartItems, transactionId, DOMAIN)
+ .then(res => {
+ console.log('Dank checkout', res)
+ return initialize(res)
+ })
+ .then(response => {
+ console.log('Dank', response)
+ })
+ // TODO :_ To check this again
+
+ // if (isBillingAddressSameAsShippingAddress) {
+ // const copiedFormData = structuredClone(data);
+ // setBillingFormData(copiedFormData);
+ // }
+
+ // const cartItemsPerBppPerProvider: DataPerBpp = getCartItemsPerBpp(cartItems as CartItemForRequest[])
+
+ // const payLoadForInitRequest = getPayloadForInitRequest(
+ // cartItemsPerBppPerProvider,
+ // transactionId,
+ // data,
+ // billingFormData
+ // )
+ // initRequest.fetchData(`${apiUrl}/client/v2/initialize_order`, 'POST', payLoadForInitRequest)
+ }
+ }
+
+ const isInitResultPresent = () => {
+ return !!initResponse && initResponse.length > 0
+ }
+
+ return (
+ <>
+ {/* start Item Details */}
+ ({
+ title: singleItem.name,
+ description: singleItem.short_desc,
+ quantity: singleItem.quantity,
+ price: singleItem.price.value,
+ currency: singleItem.price.currency,
+ image: singleItem.images[0].url
+ }))
+ },
+ shipping: {
+ showDetails: isInitResultPresent(),
+ shippingDetails: {
+ name: submittedDetails.name,
+ location: submittedDetails.address,
+ number: submittedDetails.mobileNumber,
+ title: 'Shipping'
+ },
+ shippingForm: {
+ onSubmit: formSubmitHandler,
+ submitButton: { text: 'Save Shipping Details' },
+ values: formData,
+ onChange: data => setSubmittedDetails(data)
+ }
+ },
+ billing: {
+ sectionSubtitle: 'Add Billing Details',
+ sectionTitle: 'Billing',
+ formTitle: 'Add Billing Details',
+ isBilling: true,
+ isChecked: isBillingSameRedux,
+ onCheckChange: () => {
+ // setIsBillingSame(!isBillingSame)
+ dispatch(checkoutActions.setIsBillingSame({ isBillingSame: !isBillingSameRedux }))
+ },
+ showDetails: isInitResultPresent(),
+ shippingDetails: {
+ name: submittedDetails.name,
+ location: submittedDetails.address,
+ number: submittedDetails.mobileNumber,
+ title: 'Billing'
+ },
+ shippingForm: {
+ onSubmit: formSubmitHandler,
+ submitButton: { text: 'Save Shipping Details' },
+ values: formData,
+ onChange: data => setSubmittedDetails(data)
+ }
+ },
+ payment: {
+ title: 'Payment',
+ paymentDetails: {
+ hasBoxShadow: false,
+ paymentBreakDown: {
+ ['Tax & Delivery']: `${currencyMap[getSubTotalAndDeliveryCharges(initResponse).currencySymbol as string]} ${
+ getSubTotalAndDeliveryCharges(initResponse).totalDeliveryCharge
+ }`,
+ Subtotal: `${currencyMap[getSubTotalAndDeliveryCharges(initResponse).currencySymbol as string]} ${getSubTotalAndDeliveryCharges(initResponse).subTotal}`
+ },
+
+ totalText: 'Total',
+ totalValueWithSymbol: `${currencyMap[getSubTotalAndDeliveryCharges(initResponse).currencySymbol as string]}${
+ getSubTotalAndDeliveryCharges(initResponse).subTotal +
+ getSubTotalAndDeliveryCharges(initResponse).totalDeliveryCharge
+ }`
+ }
+ },
+ loader: {
+ text: 'Initializing your request'
+ },
+ pageCTA: {
+ text: 'Proceed to Checkout',
+ handleClick: () => {
+ dispatch(cartActions.clearCart())
+ router.push('/paymentMode')
+ }
+ }
+ }}
+ isLoading={isLoading}
+ hasInitResult={isInitResultPresent()}
+ />
+ >
+ )
+}
+export default CheckoutPage
diff --git a/apps/retail/pages/index.tsx b/apps/retail/pages/index.tsx
index 95e917a51..b0ce5f525 100644
--- a/apps/retail/pages/index.tsx
+++ b/apps/retail/pages/index.tsx
@@ -1,17 +1,89 @@
-import { Box } from '@chakra-ui/react'
-import React, { useEffect } from 'react'
-import Signin from '@components/signIn/SignIn'
+/* eslint-disable react-hooks/rules-of-hooks */
+import { Box, Flex, Image, Text, useBreakpoint } from '@chakra-ui/react'
+import axios from 'axios'
+import { useRouter } from 'next/router'
+import React, { useEffect, useState } from 'react'
+import KuzaLogo from '@public/images/Kuza-mini.svg'
+import AlternateLogo from '@public/images/KuzaLogo.svg'
+import TopSheet from '@components/topSheet/TopSheet'
+import { useLanguage } from '@hooks/useLanguage'
+import beckenFooter from '../public/images/footer.svg'
+import SearchInput from '@beckn-ui/becknified-components/src/components/search-input'
+
+const HomePage = () => {
+ const [searchTerm, setSearchTerm] = useState('')
+ const breakpoint = useBreakpoint()
+ const mobileBreakpoints = ['base', 'sm', 'md', 'lg']
+ const currentLogo = mobileBreakpoints.includes(breakpoint) ? KuzaLogo : AlternateLogo
+ const { t } = useLanguage()
+
+ const router = useRouter()
-const MobileLogin = () => {
useEffect(() => {
- localStorage.clear()
+ if (localStorage) {
+ localStorage.clear()
+ }
}, [])
+ const navigateToSearchResults = () => {
+ localStorage.setItem('optionTags', JSON.stringify({ name: searchTerm }))
+ router.push(`/search?searchTerm=${searchTerm}`)
+ }
+
+ const searchIconClickHandler = (e: any) => {
+ if (searchTerm) {
+ navigateToSearchResults()
+ }
+ e.preventDefault()
+ }
+
return (
-
-
-
+ <>
+
+
+ setSearchTerm(e.target.value)}
+ searchIcon={'/images/search.svg'}
+ searchIconClickHandler={searchIconClickHandler}
+ onEnterHandler={(e: { key: string }) => e.key === 'Enter' && navigateToSearchResults()}
+ placeHolder="Search for anything"
+ />
+
+
+
+ {t.footerText}
+
+
+
+
+ >
)
}
-export default MobileLogin
+export default HomePage
diff --git a/apps/retail/pages/invoiceDetails.tsx b/apps/retail/pages/invoiceDetails.tsx
index 9109e7d12..bb9416523 100644
--- a/apps/retail/pages/invoiceDetails.tsx
+++ b/apps/retail/pages/invoiceDetails.tsx
@@ -1,6 +1,7 @@
import DetailsCard from '@beckn-ui/becknified-components/src/components/checkout/details-card'
import React, { useEffect, useState } from 'react'
import PaymentDetails from '@beckn-ui/becknified-components/src/components/checkout/payment-details'
+import {DetailCard} from '@beckn-ui/becknified-components'
import Accordion from '@beckn-ui/molecules/src/components/accordion/Accordion'
import Typography from '@beckn-ui/molecules/src/components/typography/typography'
import { Box, Flex, HStack, Stack } from '@chakra-ui/react'
@@ -8,6 +9,7 @@ import Qrcode from '@components/qrCode/Qrcode'
import { useLanguage } from '@hooks/useLanguage'
import { getPaymentBreakDown } from '@utils/checkout-utils'
import { StatusResponseModel } from '../types/status.types'
+import { formatTimestamp } from '@utils/confirm-utils'
const invoiceDetails = () => {
const [statusData, setStatusData] = useState([])
@@ -31,11 +33,17 @@ const invoiceDetails = () => {
},
items
}
- }
+ },
+ context:{timestamp}
} = statusData[0]
const { name } = items
+ const filteredOrder = statusData.filter(res => {
+ const {state} = res.message.order.fulfillments[0]
+ state && res.message.order.fulfillments[0].state.descriptor.short_desc === 'Delivered'
+ })
+
const { t } = useLanguage()
return (
{
maxH={'calc(100vh - 100px)'}
overflowY="scroll"
>
-
-
-
-
+
-
-
-
+
+
+
+
+
+
-
-
+
+
{
totalText="Total"
totalValueWithSymbol={getPaymentBreakDown(statusData).totalPricewithCurrent}
/>
-
+
{
const { t } = useLanguage()
const router = useRouter()
- const [isLoading, setIsLoading] = useState(true)
const [confirmData, setConfirmData] = useState([])
+ const [confirm, { isLoading, data }] = useConfirmMutation()
+ const dispatch = useDispatch()
+ const initResponse = useSelector((state: CheckoutRootState) => state.checkout.initResponse)
+ const confirmResponse = useSelector((state: CheckoutRootState) => state.checkout.confirmResponse)
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
@@ -29,29 +37,15 @@ const OrderConfirmation = () => {
}
useEffect(() => {
- if (localStorage && localStorage.getItem('initResult')) {
- const parsedInitResult: InitResponseModel[] = JSON.parse(localStorage.getItem('initResult') as string)
- const payLoad = getPayloadForConfirm(parsedInitResult)
- setIsLoading(true)
- axios
- .post(`${apiUrl}/confirm`, payLoad)
- .then(res => {
- const responseData: ConfirmResponseModel[] = res.data.data
- setConfirmData(responseData)
- localStorage.setItem('confirmResponse', JSON.stringify(responseData))
-
- setIsLoading(false)
- })
- .catch(err => {
- setIsLoading(false)
- console.error(err)
- })
+ if (initResponse && initResponse.length > 0) {
+ const payLoad = getPayloadForConfirm(initResponse)
+ confirm(payLoad)
}
}, [])
useEffect(() => {
- if (confirmData.length > 0) {
- const ordersPayload = getPayloadForOrderHistoryPost(confirmData)
+ if (confirmResponse && confirmResponse.length > 0) {
+ const ordersPayload = getPayloadForOrderHistoryPost(confirmResponse)
axios
.post(`${strapiUrl}/orders`, ordersPayload, axiosConfig)
.then(res => {
@@ -59,7 +53,7 @@ const OrderConfirmation = () => {
})
.catch(err => console.error(err))
}
- }, [confirmData])
+ }, [confirmResponse])
if (isLoading) {
return (
@@ -77,33 +71,53 @@ const OrderConfirmation = () => {
}
return (
- {
- router.push('/orderDetails')
- },
- disabled: false,
- variant: 'solid',
- colorScheme: 'primary'
- },
- {
- text: 'Go Back Home',
- handleClick: () => {
- router.push('/homePage')
+
+ 0 && confirmResponse[0].message.orderId.slice(0, 8)}...`,
+ trackOrderMessage: `You can track your order in "My Order" section`,
+
+ buttons: [
+ {
+ text: 'View Details',
+ handleClick: () => {
+ const orderId = confirmResponse[0].message.orderId
+ const bppId = confirmResponse[0].context.bppId
+ const bppUri = confirmResponse[0].context.bppUri
+
+ dispatch(orderActions.addSelectedOrder({ orderDetails: { orderId, bppId, bppUri } }))
+ const orderObjectForStatusCall = {
+ bppId: bppId,
+ bppUri: bppUri,
+ orderId: orderId
+ }
+ localStorage.setItem('selectedOrder', JSON.stringify(orderObjectForStatusCall))
+ dispatch(checkoutActions.clearState())
+ router.push('/orderDetails')
+ },
+ disabled: false,
+ variant: 'solid',
+ colorScheme: 'primary'
},
- disabled: false,
- variant: 'outline',
- colorScheme: 'primary'
- }
- ]
- }}
- />
+ {
+ text: 'Go Back Home',
+ handleClick: () => {
+ router.push('/')
+ dispatch(checkoutActions.clearState())
+ },
+ disabled: false,
+ variant: 'outline',
+ colorScheme: 'primary'
+ }
+ ]
+ }}
+ />
+
)
}
diff --git a/apps/retail/pages/orderDetails.tsx b/apps/retail/pages/orderDetails.tsx
index d2e18aef5..014bf42f0 100644
--- a/apps/retail/pages/orderDetails.tsx
+++ b/apps/retail/pages/orderDetails.tsx
@@ -1,10 +1,28 @@
import React, { useEffect, useState } from 'react'
import axios from 'axios'
import Router, { useRouter } from 'next/router'
-import { Box, Card, CardBody, Divider, Flex, Image, Radio, RadioGroup, Stack, Text, Textarea } from '@chakra-ui/react'
-import { BottomModal, Typography } from '@beckn-ui/molecules'
+import {
+ Box,
+ Card,
+ CardBody,
+ Divider,
+ Flex,
+ Image,
+ Radio,
+ RadioGroup,
+ Stack,
+ StackDivider,
+ Text,
+ Textarea,
+ useDisclosure
+} from '@chakra-ui/react'
+import { Accordion, BottomModal, Typography } from '@beckn-ui/molecules'
+import { useDispatch, useSelector } from 'react-redux'
+import ViewMoreOrderModal from '@components/orderDetailComponents/ViewMoreOrder'
+import { discoveryActions, DiscoveryRootState } from '@store/discovery-slice'
import { DetailCard, OrderStatusProgress, OrderStatusProgressProps } from '@beckn-ui/becknified-components'
import { StatusResponseModel, SupportModel } from '../types/status.types'
+import useResponsive from '@beckn-ui/becknified-components/src/hooks/useResponsive'
import { useLanguage } from '@hooks/useLanguage'
import { formatTimestamp, getPayloadForOrderStatus } from '@utils/confirm-utils'
import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
@@ -12,6 +30,14 @@ import BottomModalScan from '@components/BottomModal/BottomModalScan'
import { ConfirmResponseModel } from '../types/confirm.types'
import LoaderWithMessage from '@components/loader/LoaderWithMessage'
import { UIState, DataState, ProcessState } from '../types/order-details.types'
+import CallphoneIcon from '../public/images/CallphoneIcon.svg'
+import locationIcon from '../public/images/locationIcon.svg'
+import nameIcon from '../public/images/nameIcon.svg'
+import { OrdersRootState } from '@store/order-slice'
+import ShippingBlock from '@components/orderDetailComponents/Shipping'
+import { DOMAIN } from '@lib/config'
+import PaymentDetails from '@beckn-ui/becknified-components/src/components/checkout/payment-details'
+import { getPaymentBreakDown } from '@utils/checkout-utils'
const OrderDetails = () => {
const [uiState, setUiState] = useState({
@@ -36,9 +62,14 @@ const OrderDetails = () => {
radioValue: ''
})
const router = useRouter()
+ console.log('Dank', router.query)
const { t } = useLanguage()
const apiUrl = process.env.NEXT_PUBLIC_API_URL
+ const { isOpen, onOpen, onClose } = useDisclosure()
const [orderStatusMap, setOrderStatusMap] = useState([])
+ const { isDesktop } = useResponsive()
+ const { transactionId } = useSelector((state: DiscoveryRootState) => state.discovery)
+ const orderMetaData = useSelector((state: OrdersRootState) => state.orders.selectedOrderDetails)
const [currentStatusLabel, setCurrentStatusLabel] = useState('')
useEffect(() => {
@@ -183,14 +214,15 @@ const OrderDetails = () => {
if (localStorage && localStorage.getItem('selectedOrder')) {
const selectedOrderData = JSON.parse(localStorage.getItem('selectedOrder') as string)
const { bppId, bppUri, orderId } = selectedOrderData
+ //DANKTODO
const statusPayload = {
data: [
{
context: {
- transaction_id: '',
+ transaction_id: transactionId,
bpp_id: bppId,
bpp_uri: bppUri,
- domain: 'supply-chain-services:assembly'
+ domain: DOMAIN
},
message: {
order_id: orderId
@@ -521,11 +553,41 @@ const OrderDetails = () => {
}
}
+ const ordersLength = data.statusData.length
+ const { timestamp } = data.statusData[0].context
+ const productName = data.statusData[0].message.order.items.name
+ const { order } = data.statusData[0].message
+ const {
+ billing,
+ fulfillments,
+ quote: { breakup, price }
+ } = order
+ const { address, name, phone } = billing
+ const {
+ customer: {
+ contact: { phone: shippingPhone },
+ person: { name: shippingName }
+ },
+ stops
+ } = fulfillments[0]
+ const {
+ location: { address: shipmentAddress }
+ } = stops[0]
+
+ const filteredOrder = data.statusData.filter(res => {
+ const { state } = res.message.order.fulfillments[0]
+ state && res.message.order.fulfillments[0].state.descriptor.short_desc === 'Delivered'
+ })
+
return (
{processState.allOrderDelivered && (
{
)}
- {/* Display progress summary */}
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
- {/* Display order status details */}
-
-
- <>
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
- >
-
+
+
- {/* Display order status progress */}
-
- {orderStatusMap.map((status: OrderStatusProgressProps, index: number) => (
-
- ))}
-
-
-
-
- {/* Display main bottom modal */}
-
- {uiState.isLoadingForTrackAndSupport ? (
-
-
-
- ) : (
-
- {menuItems(data.trackUrl as string).map((menuItem, index) => (
+ {/* DANKTODO */}
+ {/* Display order status details */}
+
+
+ <>
-
+
- ))}
-
- {callMenuItem(data.supportData as SupportModel).map((menuItem, index) => (
+
-
+
+
+ {data.statusData[0]?.message?.order?.items[0]?.name}
+
+
+ +{data.statusData[0].message.order.items.length - 1}
+
+
+
+ fontSize={'15px'}
+ fontWeight={'600'}
+ >
+ pending
+
- ))}
-
- )}
-
+ >
+
+
- {/* Display cancellation bottom modal */}
-
+ {orderStatusMap.map((status: OrderStatusProgressProps, index: number) => (
+
+ ))}
+
+
+
+
+
+ {/* shipping and billing address */}
+
+
- {uiState.isLoadingForCancel ? (
-
- ) : (
- <>
-
+
- {
- setProcessState(prevValue => ({
- ...prevValue,
- radioValue: value
- }))
- setUiState(prevValue => ({
- ...prevValue,
- isProceedDisabled: false
- }))
- }}
- value={processState.radioValue}
- pl="20px"
+
+ )}
+
+ {isDesktop && (
+
+ )}
+ {!isDesktop && (
+
+
+
+ )}
+
+ {isDesktop && (
+
+
+
+ )}
+
+ {!isDesktop && (
+
+
- {orderCancelReason.map(reasonObj => (
-
+
+
+ )}
+
+ {/* Display main bottom modal */}
+
+ {uiState.isLoadingForTrackAndSupport ? (
+
+
+
+ ) : (
+
+ {menuItems(data.trackUrl as string).map((menuItem, index) => (
+
+
+
+
+ ))}
+
+ {callMenuItem(data.supportData as SupportModel).map((menuItem, index) => (
+
- {reasonObj.reason}
-
+
+
+
))}
-
-
)
}
diff --git a/apps/retail/pages/orderHistory.tsx b/apps/retail/pages/orderHistory.tsx
index 38779257d..f95ebc9ab 100644
--- a/apps/retail/pages/orderHistory.tsx
+++ b/apps/retail/pages/orderHistory.tsx
@@ -5,6 +5,8 @@ import { Box, Text, Flex, Image } from '@chakra-ui/react'
import React, { useEffect, useState } from 'react'
import pendingIcon from '../public/images/pendingStatus.svg'
import { orderHistoryData } from '../types/order-history.types'
+import { orderActions } from '@store/order-slice'
+import { useDispatch } from 'react-redux'
import { formatTimestamp } from '@utils/confirm-utils'
import { useRouter } from 'next/router'
import EmptyOrder from '@components/orderHistory/emptyOrder'
@@ -17,21 +19,22 @@ const OrderHistory = () => {
const [orderHistoryList, setOrderHistoryList] = useState([])
const [isLoading, setIsLoading] = useState(true)
const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
+ const dispatch = useDispatch()
const [error, setError] = useState('')
const bearerToken = Cookies.get('authToken')
const router = useRouter()
useEffect(() => {
- let myHeaders = new Headers()
+ const myHeaders = new Headers()
myHeaders.append('Authorization', `Bearer ${bearerToken}`)
- let requestOptions: RequestInit = {
+ const requestOptions: RequestInit = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
}
- fetch(`${strapiUrl}/orders?filters[category]=5`, requestOptions)
+ fetch(`${strapiUrl}/orders?filters[category]=6`, requestOptions)
.then(response => response.json())
.then(result => {
console.log('resluttt', result)
@@ -77,11 +80,15 @@ const OrderHistory = () => {
)
}
+ console.log('orderHistory:List', orderHistoryList)
+
return (
{!orderHistoryList.length ? (
@@ -98,6 +105,7 @@ const OrderHistory = () => {
orderId: order.attributes.order_id
}
localStorage.setItem('selectedOrder', JSON.stringify(orderObjectForStatusCall))
+ dispatch(orderActions.addSelectedOrder({ orderDetails: orderObjectForStatusCall }))
router.push('/orderDetails')
}}
gap={'5px'}
diff --git a/apps/retail/pages/paymentMode.tsx b/apps/retail/pages/paymentMode.tsx
index 63d390a1d..0b6df1c3d 100644
--- a/apps/retail/pages/paymentMode.tsx
+++ b/apps/retail/pages/paymentMode.tsx
@@ -19,10 +19,12 @@ function PaymentMode() {
const router = useRouter()
return (
- <>
+
+
+
+ router.push('/orderConfirmation')}
+ disabled={!checked}
+ />
+
-
- router.push('/orderConfirmation')}
- disabled={!checked}
- />
-
- >
+
)
}
diff --git a/apps/retail/pages/product.tsx b/apps/retail/pages/product.tsx
index b9854dd43..c8de40be8 100644
--- a/apps/retail/pages/product.tsx
+++ b/apps/retail/pages/product.tsx
@@ -1,39 +1,157 @@
import Router from 'next/router'
import React, { useEffect, useState } from 'react'
-import { ProductDetailPage } from '@beckn-ui/becknified-components'
+import { ProductDetailPage, ProductPrice } from '@beckn-ui/becknified-components'
import { RetailItem } from '@lib/products'
+import { ProductCard } from '@beckn-ui/becknified-components'
+import { LocalStorage, ICartProduct, ICart, LocalStorageCart, LocalStorageCartItem } from '@lib/types'
+import { cartActions } from '@store/cart-slice'
+import { useDispatch, useSelector } from 'react-redux'
+import useResponsive from '@beckn-ui/becknified-components/src/hooks/useResponsive'
+import { toast } from 'react-toastify'
+import { setLocalStorage, getLocalStorage, addLocalStorage } from '@utils/localstorage'
import { fromBinary } from '@utils/common-utils'
+import { useRouter } from 'next/router'
+import { DiscoveryRootState } from '@store/discovery-slice'
+import { Box, Flex, useTheme } from '@chakra-ui/react'
+import { Button, CustomThemeType, Input, Typography } from '@beckn-ui/molecules'
const Product = () => {
- const [product, setProduct] = useState(null)
+ const theme = useTheme()
+ const selectedProduct = useSelector((state: DiscoveryRootState) => state.discovery.selectedProduct)
+ const productList = useSelector((state: DiscoveryRootState) => state.discovery.productList)
+ const { isMobile, isTablet, isDesktop } = useResponsive()
+ const dispatch = useDispatch()
+ const [counter, setCounter] = useState(1)
+ const [totalPrice, setTotalPrice] = useState(selectedProduct.item.price.value)
- console.log('Dank', product)
+ const increment = () => {
+ const newCounter = counter + 1
+ const newTotalPrice = newCounter * selectedProduct.item.price.value
+ setCounter(newCounter)
+ setTotalPrice(newTotalPrice)
+ }
- useEffect(() => {
- const { productDetails } = Router.query
- if (productDetails) {
- setProduct(JSON.parse(fromBinary(window.atob(productDetails as string))))
+ const decrement = () => {
+ if (counter > 1) {
+ const newCounter = counter - 1
+ const newTotalPrice = newCounter * selectedProduct.item.price.value
+ setCounter(newCounter)
+ setTotalPrice(newTotalPrice)
}
- }, [])
+ }
+ const router = useRouter()
- if (!product) {
+ if (!selectedProduct) {
return <>>
}
-
return (
-
+ <>
+ {},
+ starCount: 5
+ },
+ productCta: {
+ currency: selectedProduct.item.price.currency,
+ totalPrice: selectedProduct.item.price.value,
+ handleIncrement: increment,
+ handleDecrement: decrement,
+ counter: counter,
+ cta: {
+ text: 'Add To Cart',
+ color: 'black',
+ handleClick: () => {
+ dispatch(
+ cartActions.addItemToCart({
+ product: selectedProduct,
+ quantity: counter
+ })
+ )
+ toast.success('Product added to cart')
+ }
+ }
+ }
+ }
+ }}
+ />
+ {/*
+
+
+
+
+
+
+
+
+ +
+
+
+ {counter}
+
+
+ -
+
+
+ {
+ dispatch(
+ cartActions.addItemToCart({
+ product: selectedProduct,
+ quantity: counter
+ })
+ )
+ toast.success('Product added to cart')
+ }}
+ />
+ */}
+ >
)
}
diff --git a/apps/retail/pages/search.tsx b/apps/retail/pages/search.tsx
index aa5451ebf..5560fe315 100644
--- a/apps/retail/pages/search.tsx
+++ b/apps/retail/pages/search.tsx
@@ -7,21 +7,22 @@ import { toBinary } from '@utils/common-utils'
import { parsedSearchlist } from '@utils/search-results.utils'
import { ProductCard } from '@beckn-ui/becknified-components'
import { BottomModal } from '@beckn-ui/molecules'
+import { discoveryActions } from '@store/discovery-slice'
import { useBreakpoint } from '@chakra-ui/react'
-import ProductCardRenderer from '@components/productCard/product-card-renderer'
import SearchBar from '../components/header/SearchBar'
import { useLanguage } from '../hooks/useLanguage'
-import { ParsedItemModel } from '../types/search.types'
-import TopSheet from '@components/topSheet/TopSheet'
+import { ParsedItemModel } from '@lib/types/beckn/search'
+import { DOMAIN } from '@lib/config'
import LoaderWithMessage from '@components/loader/LoaderWithMessage'
import Filter from '../components/filter/Filter'
-import FilterIcon from '../public/images/filter-icon.svg'
-import { BsFilterSquare } from 'react-icons/bs'
+import { LocalStorage } from '@lib/types'
//Mock data for testing search API. Will remove after the resolution of CORS issue
const Search = () => {
- const [items, setItems] = useState([])
+ const [items, setItems] = useState([])
+ const [originalItems, setOriginalItems] = useState([])
+ const [sortBy, setSortBy] = useState('')
const router = useRouter()
const [searchKeyword, setSearchKeyword] = useState(router.query?.searchTerm || '')
const [isLoading, setIsLoading] = useState(false)
@@ -37,53 +38,33 @@ const Search = () => {
const { t } = useLanguage()
const apiUrl = process.env.NEXT_PUBLIC_API_URL
+
const searchPayload = {
context: {
- domain: 'retail'
+ domain: DOMAIN
},
- message: {
- criteria: {
- dropLocation: '12.9715987,77.5945627',
- categoryName: 'Retail',
- searchString: searchKeyword
- }
+ searchString: searchKeyword,
+ fulfillment: {
+ type: 'Delivery',
+ stops: [
+ {
+ location: '28.4594965,77.0266383'
+ }
+ ]
}
}
- const transformData = data => {
- const allItems = data.message.catalogs.flatMap((catalog: any) => {
- if (catalog.message && catalog.message.catalog && catalog.message.catalog['bpp/providers'].length > 0) {
- const providers = catalog.message.catalog['bpp/providers']
- return providers.flatMap((provider: any) => {
- if (provider.items && provider.items.length > 0) {
- return provider.items.map((item: RetailItem) => {
- return {
- bpp_id: catalog.context.bpp_id,
- bpp_uri: catalog.context.bpp_uri,
- ...item,
- providerId: provider.id,
- locations: provider.locations,
- bppName: catalog.message.catalog['bpp/descriptor'].name
- }
- })
- }
- return []
- })
- }
- return []
- })
-
- return allItems
- }
-
const fetchDataForSearch = () => {
+ if (!searchKeyword) return
setIsLoading(true)
axios
- .post(`${apiUrl}/client/v2/search`, searchPayload)
+ .post(`${apiUrl}/search`, searchPayload)
.then(res => {
- const parsedSearchItems = transformData(res.data)
- localStorage.setItem('searchItems', JSON.stringify(parsedSearchItems))
+ dispatch(discoveryActions.addTransactionId({ transactionId: res.data.data[0].context.transaction_id }))
+ const parsedSearchItems = parsedSearchlist(res.data.data)
+ dispatch(discoveryActions.addProducts({ products: parsedSearchItems }))
setItems(parsedSearchItems)
+ setOriginalItems(parsedSearchItems)
setIsLoading(false)
})
.catch(e => {
@@ -114,11 +95,39 @@ const Search = () => {
const handleImageClick = () => {
setIsFilterOpen(!isFilterOpen)
}
+ const handleApplyFilter = (sortBy: string) => {
+ setSortBy(sortBy)
+
+ let sortedItemsCopy = [...originalItems]
+
+ if (sortBy === 'LowtoHigh') {
+ sortedItemsCopy.sort((a, b) => parseFloat(a.item.price.value) - parseFloat(b.item.price.value))
+ } else if (sortBy === 'HightoLow') {
+ sortedItemsCopy.sort((a, b) => parseFloat(b.item.price.value) - parseFloat(a.item.price.value))
+ } else if (sortBy === 'RatingLowtoHigh') {
+ sortedItemsCopy.sort((a, b) => parseFloat(a.item.rating) - parseFloat(b.item.rating))
+ } else if (sortBy === 'RatingHightoLow') {
+ sortedItemsCopy.sort((a, b) => parseFloat(b.item.rating) - parseFloat(a.item.rating))
+ }
+
+ setItems(sortedItemsCopy)
+ setIsFilterOpen(false)
+ }
+
+ const handleResetFilter = () => {
+ setItems(originalItems)
+ setIsFilterOpen(false)
+ }
return (
<>
- {!isSmallScreen && !isMediumScreen && }
+ {!isSmallScreen && !isMediumScreen && (
+
+ )}
{
isOpen={isFilterOpen}
onClose={handleFilterClose}
>
-
+
)}
{isMediumScreen && isFilterOpen && (
@@ -166,7 +178,10 @@ const Search = () => {
backgroundColor={'#fff'}
left="28%"
>
-
+
)}
@@ -188,38 +203,33 @@ const Search = () => {
w={['100%', '100%', '51%', '100%']}
margin="0 auto"
>
- {items.map((item, idx) => {
+ {items.map((singleItem, idx) => {
+ const { item } = singleItem
const product = {
id: item.id,
- images: item.descriptor.images,
- name: item.descriptor.name,
+ images: item.images.map(singleImage => singleImage.url),
+ name: item.name,
price: item.price.value,
- rating: '4'
+ rating: item.rating,
+ shortDesc: item.short_desc
}
return (
{
e.preventDefault()
- if (typeof window !== 'undefined') {
- const encodedProduct = window.btoa(toBinary(JSON.stringify(item)))
- localStorage.setItem(
- 'productDetails',
- JSON.stringify({
- encodedProduct: encodedProduct,
- product: product
- })
- )
-
- router.push({
- pathname: '/product',
- query: {
- productDetails: encodedProduct
- }
- })
- }
+ dispatch(discoveryActions.addSingleProduct({ product: singleItem }))
+ router.push({
+ pathname: '/product',
+ query: {
+ id: item.id,
+ search: searchKeyword
+ }
+ })
+ localStorage.setItem('selectCardHeaderText', product.name)
}}
product={product}
+ currency={item.price.currency}
/>
)
})}
diff --git a/apps/retail/pages/signUp.tsx b/apps/retail/pages/signUp.tsx
index b0e34030d..3b8ecb4ad 100644
--- a/apps/retail/pages/signUp.tsx
+++ b/apps/retail/pages/signUp.tsx
@@ -6,7 +6,8 @@ import { FormErrors, signUpValidateForm } from '@utils/form-utils'
import { BecknAuth } from '@beckn-ui/becknified-components'
import Router from 'next/router'
import Cookies from 'js-cookie'
-import { Box, useBreakpoint, useToast } from '@chakra-ui/react'
+import { Box, useBreakpoint, useToast, Text } from '@chakra-ui/react'
+import { useRegisterMutation } from '@services/Users'
import { CustomToast } from '@components/signIn/SignIn'
import Logo from '@public/images/Logo.svg'
@@ -19,6 +20,7 @@ const SignUp = () => {
const breakpoint = useBreakpoint()
const mobileBreakpoints = ['base', 'sm', 'md', 'lg']
const currentLogo = mobileBreakpoints.includes(breakpoint) ? Logo : AlternateLogo
+ const [register, { isLoading }] = useRegisterMutation()
const baseUrl = process.env.NEXT_PUBLIC_STRAPI_URL
@@ -53,45 +55,26 @@ const SignUp = () => {
const isFormValid = Object.values(errors).every(error => error === '')
if (isFormValid) {
- const registrationData = {
- username: formData.name,
- email: formData.email,
- password: formData.password,
- mobile: formData.mobileNumber
- }
-
try {
- const response = await fetch(`${baseUrl}/auth/local/register`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(registrationData)
+ register({
+ username: formData.name,
+ email: formData.email,
+ password: formData.password,
+ mobile: formData.mobileNumber
})
-
- if (response.ok) {
- const data = await response.json()
- const token = data.jwt
-
- Cookies.set('authToken', token)
- Router.push('/homePage')
- } else {
- const errorData = await response.json()
- toast({
- render: () => (
-
- ),
- position: 'top',
- duration: 2000,
- isClosable: true
- })
- console.error('Registration failed')
- }
} catch (error) {
console.error('An error occurred:', error)
+ toast({
+ render: () => (
+
+ ),
+ position: 'top',
+ duration: 2000,
+ isClosable: true
+ })
}
} else {
setFormErrors({
@@ -115,7 +98,8 @@ const SignUp = () => {
handleClick: handleSignUp,
disabled: !isFormFilled,
variant: 'solid',
- colorScheme: 'primary'
+ colorScheme: 'primary',
+ isLoading: isLoading
},
{
text: t.signIn,
@@ -124,7 +108,8 @@ const SignUp = () => {
},
disabled: false,
variant: 'outline',
- colorScheme: 'primary'
+ colorScheme: 'primary',
+ isLoading: isLoading
}
],
inputs: [
diff --git a/apps/retail/pages/signin.tsx b/apps/retail/pages/signin.tsx
new file mode 100644
index 000000000..95e917a51
--- /dev/null
+++ b/apps/retail/pages/signin.tsx
@@ -0,0 +1,17 @@
+import { Box } from '@chakra-ui/react'
+import React, { useEffect } from 'react'
+import Signin from '@components/signIn/SignIn'
+
+const MobileLogin = () => {
+ useEffect(() => {
+ localStorage.clear()
+ }, [])
+
+ return (
+
+
+
+ )
+}
+
+export default MobileLogin
diff --git a/apps/retail/public/images/downloadInvoice.svg b/apps/retail/public/images/downloadInvoice.svg
index 991879465..cdcdac761 100644
--- a/apps/retail/public/images/downloadInvoice.svg
+++ b/apps/retail/public/images/downloadInvoice.svg
@@ -1,5 +1,14 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/retail/public/images/headerLogo.svg b/apps/retail/public/images/headerLogo.svg
new file mode 100644
index 000000000..93173c344
--- /dev/null
+++ b/apps/retail/public/images/headerLogo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/retail/public/images/logOutIcon.svg b/apps/retail/public/images/logOutIcon.svg
new file mode 100755
index 000000000..dc0f1a26d
--- /dev/null
+++ b/apps/retail/public/images/logOutIcon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/retail/public/images/orderHistoryIcon.svg b/apps/retail/public/images/orderHistoryIcon.svg
new file mode 100644
index 000000000..745a21d08
--- /dev/null
+++ b/apps/retail/public/images/orderHistoryIcon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/retail/public/images/userProfile.svg b/apps/retail/public/images/userProfile.svg
new file mode 100755
index 000000000..55e94f9e6
--- /dev/null
+++ b/apps/retail/public/images/userProfile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/retail/services/Users.ts b/apps/retail/services/Users.ts
index c1ae53fb4..e2bb4989f 100644
--- a/apps/retail/services/Users.ts
+++ b/apps/retail/services/Users.ts
@@ -1,36 +1,65 @@
-import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query'
-// Assuming User is a type representing the user object in your application
-import type { User } from './types'
+import { retry } from '@reduxjs/toolkit/query/react'
+import { api } from './api'
-const api = createApi({
- baseQuery: fetchBaseQuery({
- baseUrl: process.env.NEXT_PUBLIC_STRAPI_URL
- }),
- tagTypes: ['User'], // Changed from 'Post' to 'User'
+export interface User {
+ blocked: boolean
+ confirmed: boolean
+ createdAt: Date
+ email: string
+ id: number
+ provider: string
+ updatedAt: Date
+ username: string
+}
+
+export interface UserResponse {
+ user: User
+ jwt: string
+}
+
+export interface LoginRequest {
+ identifier: string
+ password: string
+}
+
+export interface SignupRequest {
+ email: string
+ mobile: string
+ password: string
+ username: string
+}
+
+export const authApi = api.injectEndpoints({
endpoints: build => ({
- // The mutation accepts login credentials and returns user data
- useSignInMutation: build.mutation({
- // The query that sends the login credentials to the backend
+ login: build.mutation({
query: credentials => ({
- url: `signin`, // Endpoint for the sign-in operation
- method: 'POST', // Changed from 'PATCH' to 'POST'
- body: credentials // Sends the email and password
+ url: '/auth/local',
+ method: 'POST',
+ body: credentials
}),
- // Transform the response to directly return the user data
- transformResponse: (response: { data: User }) => {
- console.log('Dank', response.data)
- },
- // Optional: Customize error handling if needed
- transformErrorResponse: (response: { status: string | number }) => response.status,
- // Invalidate user-related data as needed, or manage cache/tags based on your app's logic
- invalidatesTags: ['User'],
- // Optional: Implement onQueryStarted for optimistic updates or additional side effects
- async onQueryStarted(arg, { dispatch, queryFulfilled }) {
- // Example: Handle optimistic updates or trigger additional actions
+ extraOptions: {
+ backoff: () => {
+ retry.fail({ fake: 'error' })
+ }
+ }
+ }),
+ register: build.mutation({
+ query: credentials => ({
+ url: '/auth/local/register',
+ method: 'POST',
+ body: credentials
+ }),
+ extraOptions: {
+ backoff: () => {
+ retry.fail({ fake: 'error' })
+ }
}
- // Optional: Implement onCacheEntryAdded for cache-related side effects
})
})
})
-export default api
+export const { useLoginMutation, useRegisterMutation } = authApi
+
+export const {
+ endpoints: { login, register }
+} = authApi
diff --git a/apps/retail/services/api.ts b/apps/retail/services/api.ts
new file mode 100644
index 000000000..111ab16dc
--- /dev/null
+++ b/apps/retail/services/api.ts
@@ -0,0 +1,49 @@
+import { createApi, fetchBaseQuery, retry } from '@reduxjs/toolkit/query/react'
+import { RootState } from '../store'
+
+// Create our baseQuery instance
+const baseQuery = fetchBaseQuery({
+ baseUrl: process.env.NEXT_PUBLIC_STRAPI_URL,
+ prepareHeaders: (headers, { getState }) => {
+ // By default, if we have a token in the store, let's use that for authenticated requests
+ const token = (getState() as RootState).auth.token
+ if (token) {
+ headers.set('authentication', `Bearer ${token}`)
+ }
+ return headers
+ }
+})
+
+const baseQueryWithRetry = retry(baseQuery, { maxRetries: 6 })
+
+/**
+ * Create a base API to inject endpoints into elsewhere.
+ * Components using this API should import from the injected site,
+ * in order to get the appropriate types,
+ * and to ensure that the file injecting the endpoints is loaded
+ */
+export const api = createApi({
+ /**
+ * `reducerPath` is optional and will not be required by most users.
+ * This is useful if you have multiple API definitions,
+ * e.g. where each has a different domain, with no interaction between endpoints.
+ * Otherwise, a single API definition should be used in order to support tag invalidation,
+ * among other features
+ */
+ reducerPath: 'splitApi',
+ /**
+ * A bare bones base query would just be `baseQuery: fetchBaseQuery({ baseUrl: '/' })`
+ */
+ baseQuery: baseQueryWithRetry,
+ /**
+ * Tag types must be defined in the original API definition
+ * for any tags that would be provided by injected endpoints
+ */
+ tagTypes: ['Auth'],
+ /**
+ * This api has endpoints injected in adjacent files,
+ * which is why no endpoints are shown below.
+ * If you want all endpoints defined in the same file, they could be included here instead
+ */
+ endpoints: () => ({})
+})
diff --git a/apps/retail/services/becknApi.ts b/apps/retail/services/becknApi.ts
new file mode 100644
index 000000000..f0f747015
--- /dev/null
+++ b/apps/retail/services/becknApi.ts
@@ -0,0 +1,40 @@
+import { createApi, fetchBaseQuery, retry } from '@reduxjs/toolkit/query/react'
+
+// Create our baseQuery instance
+const baseQuery = fetchBaseQuery({
+ baseUrl: process.env.NEXT_PUBLIC_API_URL
+})
+
+const baseQueryWithRetry = retry(baseQuery, { maxRetries: 6 })
+
+/**
+ * Create a base API to inject endpoints into elsewhere.
+ * Components using this API should import from the injected site,
+ * in order to get the appropriate types,
+ * and to ensure that the file injecting the endpoints is loaded
+ */
+export const api = createApi({
+ /**
+ * `reducerPath` is optional and will not be required by most users.
+ * This is useful if you have multiple API definitions,
+ * e.g. where each has a different domain, with no interaction between endpoints.
+ * Otherwise, a single API definition should be used in order to support tag invalidation,
+ * among other features
+ */
+ reducerPath: 'splitApi',
+ /**
+ * A bare bones base query would just be `baseQuery: fetchBaseQuery({ baseUrl: '/' })`
+ */
+ baseQuery: baseQueryWithRetry,
+ /**
+ * Tag types must be defined in the original API definition
+ * for any tags that would be provided by injected endpoints
+ */
+ tagTypes: ['Search', 'Select'],
+ /**
+ * This api has endpoints injected in adjacent files,
+ * which is why no endpoints are shown below.
+ * If you want all endpoints defined in the same file, they could be included here instead
+ */
+ endpoints: () => ({})
+})
diff --git a/apps/retail/services/confirm.ts b/apps/retail/services/confirm.ts
new file mode 100644
index 000000000..d32904bb4
--- /dev/null
+++ b/apps/retail/services/confirm.ts
@@ -0,0 +1,25 @@
+import { retry } from '@reduxjs/toolkit/query/react'
+import { api } from './becknApi'
+
+export const confirmApi = api.injectEndpoints({
+ endpoints: build => ({
+ confirm: build.mutation({
+ query: credentials => ({
+ url: '/confirm',
+ method: 'POST',
+ body: credentials
+ }),
+ extraOptions: {
+ backoff: () => {
+ retry.fail({ fake: 'error' })
+ }
+ }
+ })
+ })
+})
+
+export const { useConfirmMutation } = confirmApi
+
+export const {
+ endpoints: { confirm }
+} = confirmApi
diff --git a/apps/retail/services/init.ts b/apps/retail/services/init.ts
new file mode 100644
index 000000000..037c21f5a
--- /dev/null
+++ b/apps/retail/services/init.ts
@@ -0,0 +1,25 @@
+import { retry } from '@reduxjs/toolkit/query/react'
+import { api } from './becknApi'
+
+export const initApi = api.injectEndpoints({
+ endpoints: build => ({
+ init: build.mutation({
+ query: credentials => ({
+ url: '/init',
+ method: 'POST',
+ body: credentials
+ }),
+ extraOptions: {
+ backoff: () => {
+ retry.fail({ fake: 'error' })
+ }
+ }
+ })
+ })
+})
+
+export const { useInitMutation } = initApi
+
+export const {
+ endpoints: { init }
+} = initApi
diff --git a/apps/retail/services/select.ts b/apps/retail/services/select.ts
new file mode 100644
index 000000000..ce258e67f
--- /dev/null
+++ b/apps/retail/services/select.ts
@@ -0,0 +1,25 @@
+import { retry } from '@reduxjs/toolkit/query/react'
+import { api } from './becknApi'
+
+export const selectApi = api.injectEndpoints({
+ endpoints: build => ({
+ select: build.mutation({
+ query: credentials => ({
+ url: '/select',
+ method: 'POST',
+ body: credentials
+ }),
+ extraOptions: {
+ backoff: () => {
+ retry.fail({ fake: 'error' })
+ }
+ }
+ })
+ })
+})
+
+export const { useSelectMutation } = selectApi
+
+export const {
+ endpoints: { select }
+} = selectApi
diff --git a/apps/retail/store/authslice.ts b/apps/retail/store/authslice.ts
new file mode 100644
index 000000000..20b06753c
--- /dev/null
+++ b/apps/retail/store/authslice.ts
@@ -0,0 +1,63 @@
+import { createSlice } from '@reduxjs/toolkit'
+import type { PayloadAction } from '@reduxjs/toolkit'
+import { authApi, User } from '@services/Users'
+import Router from 'next/router'
+import Cookies from 'js-cookie'
+
+const initialState = {
+ user: null,
+ jwt: null,
+ isAuthenticated: false
+} as { user: null | User; jwt: string | null; isAuthenticated: boolean }
+
+const slice = createSlice({
+ name: 'auth',
+ initialState,
+ reducers: {
+ logout: () => {
+ Cookies.remove('authToken')
+ localStorage.clear()
+ Router.push('/signin')
+ return initialState
+ },
+ setCredentials: (state, { payload: { user, jwt } }: PayloadAction<{ user: User; jwt: string }>) => {
+ state.user = user
+ state.jwt = jwt
+ }
+ },
+ extraReducers: builder => {
+ builder
+ .addMatcher(authApi.endpoints.login.matchPending, (state, action) => {
+ console.log('pending', action)
+ })
+ .addMatcher(authApi.endpoints.login.matchFulfilled, (state, action) => {
+ console.log('fulfilled', action)
+ state.user = action.payload.user
+ state.jwt = action.payload.jwt
+ state.isAuthenticated = true
+ Cookies.set('authToken', state.jwt)
+ Router.push('/')
+ })
+ .addMatcher(authApi.endpoints.login.matchRejected, (state, action) => {
+ console.log('rejected', action)
+ }),
+ builder
+ .addMatcher(authApi.endpoints.register.matchPending, (state, action) => {
+ console.log('pending', action)
+ })
+ .addMatcher(authApi.endpoints.register.matchFulfilled, (state, action) => {
+ console.log('fulfilled', action)
+ state.user = action.payload.user
+ state.jwt = action.payload.jwt
+ Cookies.set('authToken', state.jwt)
+ state.isAuthenticated = true
+ Router.push('/')
+ })
+ .addMatcher(authApi.endpoints.register.matchRejected, (state, action) => {
+ console.log('rejected', action)
+ })
+ }
+})
+
+export const { logout, setCredentials } = slice.actions
+export default slice.reducer
diff --git a/apps/retail/store/cart-slice.ts b/apps/retail/store/cart-slice.ts
index 24084e40c..511dce391 100644
--- a/apps/retail/store/cart-slice.ts
+++ b/apps/retail/store/cart-slice.ts
@@ -1,6 +1,7 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { ICart } from '../lib/types/cart'
import { RetailItem } from '../lib/types/products'
+import { Item, ParsedItemModel } from '@lib/types'
import { calculateDiscountPercentage } from '../utilities/calculateDiscountPercentage'
const initialState: ICart = {
@@ -16,25 +17,30 @@ const cartSlice = createSlice({
addItemToCart(
state: ICart,
action: PayloadAction<{
- product: RetailItem
+ product: ParsedItemModel
quantity: number
}>
) {
const newItem = action.payload.product
- const existingItem = state.items.find(item => item.id === newItem.id)
+ const existingItem = state.items.find(item => item.id === newItem.item.id)
state.totalQuantity = state.totalQuantity + action.payload.quantity
- state.totalAmount = state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.price.value)
+ state.totalAmount =
+ state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.item.price.value)
if (!existingItem) {
- const totalPrice = parseFloat(newItem.price.value) * action.payload.quantity
+ const totalPrice = parseFloat(newItem.item.price.value) * action.payload.quantity
state.items.push({
- ...newItem,
+ ...newItem.item,
quantity: action.payload.quantity,
- totalPrice
+ totalPrice,
+ bpp_id: newItem.bppId,
+ bpp_uri: newItem.bppUri,
+ providerId: newItem.providerId,
+ locations: newItem.providerCoordinates
})
} else {
const totalPrice =
diff --git a/apps/retail/store/checkout-slice.ts b/apps/retail/store/checkout-slice.ts
new file mode 100644
index 000000000..bc3eaf898
--- /dev/null
+++ b/apps/retail/store/checkout-slice.ts
@@ -0,0 +1,64 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { initApi } from '@services/init'
+import { confirmApi } from '@services/confirm'
+
+export interface CheckoutRootState {
+ checkout: Checkout
+}
+
+export interface Checkout {
+ initResponse: any
+ confirmResponse: any
+ isBillingSame: boolean
+}
+
+const initialState: Checkout = {
+ initResponse: {},
+ confirmResponse: {},
+ isBillingSame: true
+}
+
+const checkoutSlice = createSlice({
+ name: 'checkout',
+ initialState,
+ reducers: {
+ addInitResponse(state, action: PayloadAction<{ initResponse: any }>) {
+ state.initResponse = action.payload.initResponse
+ },
+ setIsBillingSame(state, action: PayloadAction<{ isBillingSame: boolean }>) {
+ state.isBillingSame = action.payload.isBillingSame
+ },
+ clearState(state){
+ state.initResponse = {}
+ state.confirmResponse = {}
+ }
+ },
+ extraReducers: builder => {
+ builder
+ .addMatcher(initApi.endpoints.init.matchPending, (state, action) => {
+ console.log('pending', action)
+ })
+ .addMatcher(initApi.endpoints.init.matchFulfilled, (state, action) => {
+ console.log('fulfilled', action)
+ state.initResponse = action.payload.data
+ })
+ .addMatcher(initApi.endpoints.init.matchRejected, (state, action) => {
+ console.log('rejected', action)
+ })
+ builder
+ .addMatcher(confirmApi.endpoints.confirm.matchPending, (state, action) => {
+ console.log('pending', action)
+ })
+ .addMatcher(confirmApi.endpoints.confirm.matchFulfilled, (state, action) => {
+ console.log('fulfilled', action)
+ state.confirmResponse = action.payload.data
+ })
+ .addMatcher(confirmApi.endpoints.confirm.matchRejected, (state, action) => {
+ console.log('rejected', action)
+ })
+ }
+})
+
+export const checkoutActions = checkoutSlice.actions
+
+export default checkoutSlice.reducer
diff --git a/apps/retail/store/discovery-slice.ts b/apps/retail/store/discovery-slice.ts
new file mode 100644
index 000000000..a1505c2eb
--- /dev/null
+++ b/apps/retail/store/discovery-slice.ts
@@ -0,0 +1,37 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ParsedItemModel } from '@lib/types'
+
+export interface Discovery {
+ transactionId: string
+ productList: ParsedItemModel[]
+ selectedProduct: ParsedItemModel
+}
+
+export interface DiscoveryRootState {
+ discovery: Discovery
+}
+
+const initialState: Discovery = {
+ transactionId: '',
+ productList: [],
+ selectedProduct: {} as ParsedItemModel
+}
+
+const discoverySlice = createSlice({
+ name: 'discovery',
+ initialState,
+ reducers: {
+ addTransactionId(state, action: PayloadAction<{ transactionId: string }>) {
+ state.transactionId = action.payload.transactionId
+ },
+ addProducts(state, action: PayloadAction<{ products: ParsedItemModel[] }>) {
+ state.productList = action.payload.products
+ },
+ addSingleProduct(state, action: PayloadAction<{ product: ParsedItemModel }>) {
+ state.selectedProduct = action.payload.product
+ }
+ }
+})
+export const discoveryActions = discoverySlice.actions
+
+export default discoverySlice.reducer
diff --git a/apps/retail/store/index.ts b/apps/retail/store/index.ts
index e5fa66036..3d2fa006a 100644
--- a/apps/retail/store/index.ts
+++ b/apps/retail/store/index.ts
@@ -1,41 +1,69 @@
-import { configureStore } from '@reduxjs/toolkit'
+import { combineReducers, configureStore } from '@reduxjs/toolkit'
+import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist'
+import storage from 'redux-persist/lib/storage'
import specialOfferProductsReducer from './specialOfferProducts-slice'
import newestProductReducer from './newestProduct-slice'
import SortedProductsListReducer from './sortedProductList-slice'
import cartUiReducer from './cartUI-slice'
import cartSliceReducer from './cart-slice'
+import checkoutReducer from './checkout-slice'
import userInfoReducer from './user-slice'
import sideNavBarReducer from './sideNavBar-slice'
+import DiscoveryReducer from './discovery-slice'
+import OrderReducer from './order-slice'
import megaMenuReducer from './megaMenu-slice'
import activeMenuItemReducer from './activeMenuItem-slice'
import settingBoxReducer from './settingBox-slice'
+import { api } from '@services/api'
import favoriteReducer from './favorite-slice'
import responseDataReducer from './responseData-slice'
import geoMapLocationSearchReducer from './geoMapLocationSearch-slice'
+import authReducer from './authslice'
+
+const persistConfig = {
+ key: 'root',
+ storage,
+ whitelist: ['cart', 'discovery', 'checkout', 'orders']
+}
+
+const rootReducer = combineReducers({
+ auth: authReducer,
+ [api.reducerPath]: api.reducer,
+ specialOfferProductsList: specialOfferProductsReducer,
+ newestProductsList: newestProductReducer,
+ sortedProductsList: SortedProductsListReducer,
+ cartUi: cartUiReducer,
+ cart: cartSliceReducer,
+ checkout: checkoutReducer,
+ discovery: DiscoveryReducer,
+ orders: OrderReducer,
+ userInfo: userInfoReducer,
+ sideNavBar: sideNavBarReducer,
+ megaMenu: megaMenuReducer,
+ activeMenuItem: activeMenuItemReducer,
+ settingBox: settingBoxReducer,
+ favorite: favoriteReducer,
+ transactionId: responseDataReducer,
+ quoteResponse: responseDataReducer,
+ customerDetails: responseDataReducer,
+ initResponse: responseDataReducer,
+ geoLocationSearchPageUI: geoMapLocationSearchReducer
+})
+
+const persistedReducer = persistReducer(persistConfig, rootReducer)
const store = configureStore({
- reducer: {
- specialOfferProductsList: specialOfferProductsReducer,
- newestProductsList: newestProductReducer,
- sortedProductsList: SortedProductsListReducer,
- cartUi: cartUiReducer,
- cart: cartSliceReducer,
- userInfo: userInfoReducer,
- sideNavBar: sideNavBarReducer,
- megaMenu: megaMenuReducer,
- activeMenuItem: activeMenuItemReducer,
- settingBox: settingBoxReducer,
- favorite: favoriteReducer,
- transactionId: responseDataReducer,
- quoteResponse: responseDataReducer,
- customerDetails: responseDataReducer,
- initResponse: responseDataReducer,
- geoLocationSearchPageUI: geoMapLocationSearchReducer
- },
+ reducer: persistedReducer,
middleware: getDefaultMiddleware =>
getDefaultMiddleware({
- serializableCheck: false
- })
+ serializableCheck: {
+ ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER]
+ }
+ }).concat(api.middleware)
})
+export const persistor = persistStore(store)
+
+export type RootState = ReturnType
+
export default store
diff --git a/apps/retail/store/order-slice.ts b/apps/retail/store/order-slice.ts
new file mode 100644
index 000000000..8e0577e85
--- /dev/null
+++ b/apps/retail/store/order-slice.ts
@@ -0,0 +1,44 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+type SelectedOrderDetailsType = {
+ orderIds: string[]
+ bppIds: string[]
+ bppUris: string[]
+}
+
+type SingleIdType = {
+ orderId: string
+ bppId: string
+ bppUri: string
+}
+
+export interface Orders {
+ selectedOrderDetails: SelectedOrderDetailsType
+}
+
+export interface OrdersRootState {
+ orders: Orders
+}
+
+const initialState: Orders = {
+ selectedOrderDetails: {
+ orderIds: [],
+ bppIds: [],
+ bppUris: []
+ }
+}
+
+const orderSlice = createSlice({
+ name: 'orders',
+ initialState,
+ reducers: {
+ addSelectedOrder(state, action: PayloadAction<{ orderDetails: SingleIdType }>) {
+ state.selectedOrderDetails.orderIds.push(action.payload.orderDetails.orderId)
+ state.selectedOrderDetails.bppIds.push(action.payload.orderDetails.bppId)
+ state.selectedOrderDetails.bppUris.push(action.payload.orderDetails.bppUri)
+ }
+ }
+})
+export const orderActions = orderSlice.actions
+
+export default orderSlice.reducer
diff --git a/apps/retail/store/responseData-slice.ts b/apps/retail/store/responseData-slice.ts
index 2ffb14c3c..8ce33fe89 100644
--- a/apps/retail/store/responseData-slice.ts
+++ b/apps/retail/store/responseData-slice.ts
@@ -1,6 +1,6 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { ResponseModel } from '../lib/types/responseModel'
-import { ShippingFormData } from '../pages/checkoutPage'
+import { ShippingFormData } from '../pages/checkout/checkout'
const initialState = {
transactionId: '',
diff --git a/apps/retail/styles/globals.css b/apps/retail/styles/globals.css
index 16e213107..5c96a361f 100644
--- a/apps/retail/styles/globals.css
+++ b/apps/retail/styles/globals.css
@@ -53,6 +53,7 @@ body {
background-color: rgb(var(--color-bg));
color: rgb(var(--color-text-base));
}
+
.hideScroll::-webkit-scrollbar {
display: none;
}
@@ -101,3 +102,6 @@ select.chakra-select {
display: flex;
flex-wrap: wrap;
}
+.hideScroll::-webkit-scrollbar {
+ display: none;
+}
diff --git a/apps/retail/tsconfig.json b/apps/retail/tsconfig.json
index ef38f2c3d..31f1f36bf 100644
--- a/apps/retail/tsconfig.json
+++ b/apps/retail/tsconfig.json
@@ -7,6 +7,7 @@
"@hooks/*": ["./hooks/*"],
"@services/*": ["./services/*"],
"@lib/*": ["./lib/*"],
+ "@types/*": ["./types/*"],
"@pages/*": ["./pages/*"],
"@store/*": ["./store/*"],
"@utils/*": ["./utilities/*"],
diff --git a/apps/retail/types/search.types.ts b/apps/retail/types/search.types.ts
index fb06d67fd..a6bad7e0a 100644
--- a/apps/retail/types/search.types.ts
+++ b/apps/retail/types/search.types.ts
@@ -37,6 +37,7 @@ interface Image {
}
interface Item {
+ rating: any
long_desc: string
short_desc: string
id: string
@@ -97,7 +98,7 @@ export interface ParsedItemModel {
providerId: string
providerName: string
item: Item
- rating: string
+ rating?: string
providerCoordinates: Coordinate
}
diff --git a/apps/retail/utilities/confirm-utils.ts b/apps/retail/utilities/confirm-utils.ts
index 15de52678..2f5b3045d 100644
--- a/apps/retail/utilities/confirm-utils.ts
+++ b/apps/retail/utilities/confirm-utils.ts
@@ -65,7 +65,17 @@ export const getPayloadForConfirm = (initResponse: InitResponseModel[]) => {
items: items,
fulfillments: fulfillments,
billing: billing,
- payments: payments
+ payments: [
+ {
+ id: payments[0].id,
+ params: {
+ amount: quote.price.value,
+ currency: quote.price.currency
+ },
+ status: 'PAID',
+ type: 'ON-FULFILLMENT'
+ }
+ ]
}
]
}
@@ -132,7 +142,7 @@ export const getPayloadForOrderHistoryPost = (confirmData: ConfirmResponseModel[
}
},
category: {
- set: [5]
+ set: [6]
}
}
@@ -189,7 +199,7 @@ export function formatTimestamp(timestamp: string) {
const ordinalSuffix = getOrdinalSuffix(day)
- const formattedDate = `${day}${ordinalSuffix} ${month} ${year}, ${hours}.${minutes}${period}`
+ const formattedDate = `${day}${ordinalSuffix} ${month} ${year}, ${hours}:${minutes}${period}`
return formattedDate
}
diff --git a/apps/retail/utilities/form-utils.ts b/apps/retail/utilities/form-utils.ts
index 0a71c41fc..b7f773e0d 100644
--- a/apps/retail/utilities/form-utils.ts
+++ b/apps/retail/utilities/form-utils.ts
@@ -1,5 +1,5 @@
import { SignInPropsModel, SignUpPropsModel } from '../components/signIn/SignIn.types'
-import { ShippingFormData } from '../pages/checkoutPage'
+import { ShippingFormData } from '../pages/checkout/checkout'
export interface FormErrors {
name?: string
diff --git a/apps/retail/utilities/index.ts b/apps/retail/utilities/index.ts
new file mode 100644
index 000000000..f07fe407a
--- /dev/null
+++ b/apps/retail/utilities/index.ts
@@ -0,0 +1,6 @@
+import { getLocalStorage, setLocalStorage } from './localstorage'
+
+export default {
+ getLocalStorage,
+ setLocalStorage
+}
diff --git a/apps/retail/utilities/localstorage.ts b/apps/retail/utilities/localstorage.ts
new file mode 100644
index 000000000..a2347e2de
--- /dev/null
+++ b/apps/retail/utilities/localstorage.ts
@@ -0,0 +1,35 @@
+// localStorageUtil.js
+
+// Setter function to save data to localStorage
+export const setLocalStorage = (key: string, value: any) => {
+ if (typeof window !== 'undefined') {
+ // Only try to set the localStorage item if window is defined
+ const valueToStore = JSON.stringify(value) // Convert value to a string
+ window.localStorage.setItem(key, valueToStore)
+ }
+}
+
+export const addLocalStorage = (key: string, value: any) => {
+ if (typeof window !== 'undefined') {
+ // Only try to set the localStorage item if window is defined
+ const currentList = window.localStorage.getItem(key)
+ let newList = []
+ if (!currentList) {
+ newList.push(value)
+ } else {
+ newList = [...JSON.parse(currentList), value]
+ }
+ const valueToStore = JSON.stringify(newList) // Convert value to a string
+ window.localStorage.setItem(key, valueToStore)
+ }
+}
+
+// Getter function to retrieve data from localStorage
+export const getLocalStorage = (key: string) => {
+ if (typeof window !== 'undefined') {
+ // Only try to get the localStorage item if window is defined
+ const item = window.localStorage.getItem(key)
+ return item ? JSON.parse(item) : null // Convert string back to original data type
+ }
+ return null // Return null if window is not defined
+}
diff --git a/apps/retail/utilities/payload-utils.ts b/apps/retail/utilities/payload-utils.ts
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/retail/utilities/search-results.utils.ts b/apps/retail/utilities/search-results.utils.ts
index ddf19e70e..05124b06a 100644
--- a/apps/retail/utilities/search-results.utils.ts
+++ b/apps/retail/utilities/search-results.utils.ts
@@ -1,5 +1,12 @@
import { ParsedItemModel, SearchResponseModel } from '../types/search.types'
+const dummyLocation = [
+ {
+ id: './retail.kirana/ind.blr/1@tourism-bpp-infra2.becknprotocol.io.provider_location',
+ gps: '12.909955,77.596316'
+ }
+]
+
export const parsedSearchlist = (data: SearchResponseModel[]) => {
const itemsarray: ParsedItemModel[] = []
data.forEach(entry => {
@@ -11,7 +18,7 @@ export const parsedSearchlist = (data: SearchResponseModel[]) => {
const bppUri = context.bpp_uri
message.providers.forEach(provider => {
- const stringifiedLatLong = provider.locations[0].gps
+ const stringifiedLatLong = provider.locations ? provider.locations[0].gps : dummyLocation[0].gps
const [stringifiedLatitude, stringifiedLongitude] = stringifiedLatLong.split(', ')
const latitude = parseFloat(stringifiedLatitude)
@@ -27,6 +34,7 @@ export const parsedSearchlist = (data: SearchResponseModel[]) => {
provider.items.forEach(item => {
itemsarray.push({
+ id: providerId,
bppId: bppId,
bppUri: bppUri,
domain,
@@ -34,7 +42,6 @@ export const parsedSearchlist = (data: SearchResponseModel[]) => {
providerId: providerId,
providerName: provider.name,
item,
- rating,
providerCoordinates
})
})
diff --git a/apps/tourism/.prettierignore b/apps/tourism/.prettierignore
new file mode 100644
index 000000000..a02ef09e5
--- /dev/null
+++ b/apps/tourism/.prettierignore
@@ -0,0 +1,4 @@
+/node_modules/
+/coverage/
+/.next/
+/public/
diff --git a/apps/tourism/Jenkinsfile b/apps/tourism/Jenkinsfile
new file mode 100644
index 000000000..65d08c9ab
--- /dev/null
+++ b/apps/tourism/Jenkinsfile
@@ -0,0 +1,29 @@
+pipeline {
+ agent any
+ stages {
+ stage('Executing Shell Script On Server') {
+ steps {
+ script {
+ sshagent(credentials: ['"${credentials}"']) {
+ sh '''
+ ssh -t -t ${userName}@${hostIP} -o StrictHostKeyChecking=no << EOF
+ ${listOfCommands}
+ logout
+ EOF
+ '''
+ }
+ }
+ }
+ }
+ }
+ post {
+ always {
+ cleanWs(cleanWhenNotBuilt: false,
+ deleteDirs: true,
+ disableDeferredWipeout: true,
+ notFailBuild: true,
+ patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
+ [pattern: '.propsfile', type: 'EXCLUDE']])
+ }
+ }
+}
diff --git a/apps/tourism/components/BottomModal/BottomModal.tsx b/apps/tourism/components/BottomModal/BottomModal.tsx
new file mode 100644
index 000000000..04f3c3e6c
--- /dev/null
+++ b/apps/tourism/components/BottomModal/BottomModal.tsx
@@ -0,0 +1,65 @@
+import React from 'react'
+import { Image, Box } from '@chakra-ui/react'
+import { Transition } from '@headlessui/react'
+
+interface ModalProps {
+ isOpen: boolean
+ onClose: () => void
+ children: React.ReactNode
+ partialClose?: boolean
+}
+
+const Modal: React.FC = ({ isOpen, onClose, children, partialClose }) => {
+ return (
+ onClose()}
+ >
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
+
+export default Modal
diff --git a/apps/tourism/components/BottomModal/BottomModalScan.tsx b/apps/tourism/components/BottomModal/BottomModalScan.tsx
new file mode 100644
index 000000000..d14e8edf9
--- /dev/null
+++ b/apps/tourism/components/BottomModal/BottomModalScan.tsx
@@ -0,0 +1,56 @@
+import React from 'react'
+import { Image, ModalOverlay, Modal, ModalContent, Box, ModalHeader, Divider, Flex } from '@chakra-ui/react'
+
+interface ModalProps {
+ isOpen: boolean
+ onClose: () => void
+ children: React.ReactNode
+ partialClose?: boolean
+ modalHeader?: string
+}
+
+const BottomModal: React.FC = ({ isOpen, onClose, children, modalHeader }) => {
+ return (
+ <>
+
+
+
+
+
+ {modalHeader}
+
+
+
+
+
+
+ {children}
+
+
+ >
+ )
+}
+
+export default BottomModal
diff --git a/apps/tourism/components/BottomModal/index.tsx b/apps/tourism/components/BottomModal/index.tsx
new file mode 100644
index 000000000..88b5f609a
--- /dev/null
+++ b/apps/tourism/components/BottomModal/index.tsx
@@ -0,0 +1,3 @@
+import BottomModal from './BottomModal'
+
+export default BottomModal
diff --git a/apps/tourism/components/UI/Breadcrumb.tsx b/apps/tourism/components/UI/Breadcrumb.tsx
new file mode 100644
index 000000000..3a97c512b
--- /dev/null
+++ b/apps/tourism/components/UI/Breadcrumb.tsx
@@ -0,0 +1,83 @@
+import React, { useEffect, useState } from 'react'
+import { useRouter } from 'next/router'
+import Link from 'next/link'
+import { IBreadcrumb } from '../../lib/types/breadcrumb'
+import { useLanguage } from '../../hooks/useLanguage'
+import { BsShop } from 'react-icons/bs'
+
+const convertBreadcrumb = (str: string) => {
+ return str.replace(/-/g, ' ').replace(/oe/g, 'ö').replace(/ae/g, 'ä').replace(/ue/g, 'ü')
+}
+
+const Breadcrumb = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ const [breadcrumbs, setBreadcrumbs] = useState([])
+ useEffect(() => {
+ if (router) {
+ const paths = router.asPath.split('/')
+ paths.shift()
+
+ const pathsArray = paths.map((path, i) => {
+ return {
+ breadcrumb: path,
+ href: '/' + paths.slice(0, i + 1).join('/')
+ }
+ })
+
+ setBreadcrumbs(pathsArray)
+ }
+ }, [router])
+
+ if (!breadcrumbs) {
+ return null
+ }
+
+ return (
+
+ )
+}
+
+export default Breadcrumb
diff --git a/apps/tourism/components/UI/CarouselBox/CarouselBox.tsx b/apps/tourism/components/UI/CarouselBox/CarouselBox.tsx
new file mode 100644
index 000000000..0d8facb2b
--- /dev/null
+++ b/apps/tourism/components/UI/CarouselBox/CarouselBox.tsx
@@ -0,0 +1,108 @@
+import React from 'react'
+import Link from 'next/link'
+import { useLanguage } from '../../../hooks/useLanguage'
+import { NextArrow, PrevArrow } from './CarouselBoxArrows'
+import Slider from 'react-slick'
+import { HiOutlineChevronLeft, HiOutlineChevronRight } from 'react-icons/hi'
+
+interface Props {
+ title: string
+ className?: string
+ href?: string
+ children?: React.ReactNode
+ full?: boolean
+}
+const CarouselBox: React.FC = ({ title, className, children, href, full }) => {
+ const { t } = useLanguage()
+
+ const settings = {
+ className: ` px-4 ${full ? 'bg-palette-fill' : 'bg-[#37bccef9]'}`,
+ infinite: true,
+ speed: 600,
+ centerPadding: '60px',
+ slidesToShow: 5,
+ slidesToScroll: 5,
+ // initialSlide: 0,
+ swipeToSlide: true,
+ // rtl: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1324,
+ settings: {
+ slidesToShow: 4,
+ slidesToScroll: 4
+ }
+ },
+ {
+ breakpoint: 1024,
+ settings: {
+ slidesToShow: 3,
+ slidesToScroll: 3
+ }
+ },
+ {
+ breakpoint: 768,
+ settings: {
+ slidesToShow: 2,
+ slidesToScroll: 2
+ }
+ },
+ {
+ breakpoint: 640,
+ settings: {
+ slidesToShow: 1,
+ slidesToScroll: 1
+ }
+ }
+ ]
+ }
+
+ return (
+
+ )
+}
+
+export default CarouselBox
diff --git a/apps/tourism/components/UI/CarouselBox/CarouselBoxArrows.tsx b/apps/tourism/components/UI/CarouselBox/CarouselBoxArrows.tsx
new file mode 100644
index 000000000..2d6eaae74
--- /dev/null
+++ b/apps/tourism/components/UI/CarouselBox/CarouselBoxArrows.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+
+interface Props {
+ className?: string
+ style?: any
+ onClick?: () => void
+}
+export const NextArrow: React.FC = ({ className, style, onClick }) => {
+ return (
+
+ )
+}
+export const PrevArrow: React.FC = ({ className, style, onClick }) => {
+ return (
+
+ )
+}
diff --git a/apps/tourism/components/UI/CarouselBox/CarouselBoxCard.tsx b/apps/tourism/components/UI/CarouselBox/CarouselBoxCard.tsx
new file mode 100644
index 000000000..8d87012a6
--- /dev/null
+++ b/apps/tourism/components/UI/CarouselBox/CarouselBoxCard.tsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import { Image } from '@chakra-ui/react'
+import { urlFor } from '../../../lib/client'
+import { RetailItem } from '../../../lib/types/products'
+import Link from 'next/link'
+import ProductPrice from '../ProductPrice'
+
+interface Props {
+ product: RetailItem
+}
+
+const CarouselBoxCard: React.FC = ({ product }) => {
+ return (
+
+ )
+}
+
+export default CarouselBoxCard
diff --git a/apps/tourism/components/UI/DropDown.tsx b/apps/tourism/components/UI/DropDown.tsx
new file mode 100644
index 000000000..f6bfb107f
--- /dev/null
+++ b/apps/tourism/components/UI/DropDown.tsx
@@ -0,0 +1,94 @@
+import React, { useState, forwardRef, useRef } from 'react'
+import Link from 'next/link'
+import { HiChevronUp, HiChevronDown } from 'react-icons/hi'
+import { Transition } from 'react-transition-group'
+
+import { IDropDown } from '../../lib/types/dropDown'
+import { useDispatch } from 'react-redux'
+import { sideNavBarActions } from '../../store/sideNavBar-slice'
+import { useSelector } from 'react-redux'
+import { IActiveMenuItemRootState } from '../../lib/types/activeMenuItem'
+import { useLanguage } from '../../hooks/useLanguage'
+
+interface Props {
+ dropDown: IDropDown
+ ref: React.HTMLProps
+}
+const DropDown = forwardRef(({ dropDown }, ref) => {
+ const [openDropdown, setOpenDropDown] = useState(false)
+ const nodeRef = useRef(null)
+ const dispatch = useDispatch()
+ const { t } = useLanguage()
+ let ArrowDirection = !openDropdown ? HiChevronDown : HiChevronUp
+
+ const activeMenuItemText = useSelector((state: IActiveMenuItemRootState) => state.activeMenuItem.activeMenuItemText)
+
+ const closeNavbar = () => {
+ dispatch(sideNavBarActions.closeNavbar())
+ }
+
+ return (
+
+
setOpenDropDown(prevState => !prevState)}
+ >
+
{t[`${dropDown.title}`]}
+
+
+
+ {state => (
+ <>
+
+ {dropDown.subtitles.map((item, index) => {
+ return (
+
+ )
+ })}
+
+ >
+ )}
+
+
+ )
+})
+
+DropDown.displayName = 'DropDown'
+export default DropDown
diff --git a/apps/tourism/components/UI/Input.tsx b/apps/tourism/components/UI/Input.tsx
new file mode 100644
index 000000000..ad5d4ef9c
--- /dev/null
+++ b/apps/tourism/components/UI/Input.tsx
@@ -0,0 +1,72 @@
+import React, { useImperativeHandle, useRef, useState } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+
+interface Props {
+ id: string
+ type: string
+ minLength?: number
+ maxLength?: number
+ placeholder?: string
+ classes?: string
+ value?: string
+ ref?: HTMLInputElement
+ readonly?: boolean
+ autocomplete?: string
+ title?: string
+ required?: boolean
+}
+
+interface IImperativeHandler {
+ focus: () => void
+ value?: string
+}
+const Input = React.forwardRef((props, ref) => {
+ const inputRef = useRef(null)
+ const [value, setValue] = useState(props.value || '')
+
+ function inputChangeHandler(e: React.FormEvent) {
+ setValue(e.currentTarget.value)
+ }
+
+ function inputFocused() {
+ inputRef.current?.focus()
+ inputRef.current?.setAttribute('style', 'border:2px solid red')
+ }
+
+ useImperativeHandle(ref, () => {
+ return {
+ focus: inputFocused,
+ value: value
+ }
+ })
+ const { t } = useLanguage()
+ return (
+
+
+ {props.required ? * : null}
+ {t[`${props.id}`]}
+
+
+
+ )
+})
+
+Input.displayName = 'Input'
+export default Input
diff --git a/apps/tourism/components/UI/MenuItems/MenuItems.tsx b/apps/tourism/components/UI/MenuItems/MenuItems.tsx
new file mode 100644
index 000000000..e911fc456
--- /dev/null
+++ b/apps/tourism/components/UI/MenuItems/MenuItems.tsx
@@ -0,0 +1,92 @@
+import React from 'react'
+import Link from 'next/link'
+import { useDispatch, useSelector } from 'react-redux'
+import { megaMenuActions } from '../../../store/megaMenu-slice'
+import { useLanguage } from '../../../hooks/useLanguage'
+import menuItems from '../../../mock/menuItems'
+import { HiChevronRight, HiChevronLeft } from 'react-icons/hi'
+import { IDropDown } from '../../../lib/types/dropDown'
+import { useRouter } from 'next/router'
+import { useWindowDimensions } from '../../../hooks/useWindowDimensions'
+import { IActiveMenuItemRootState } from '../../../lib/types/activeMenuItem'
+
+interface Props {
+ onClick?: (submenu: IDropDown[] | undefined, activeItemName: string, index: number) => void
+ onMouseOver?: (submenu: IDropDown[] | undefined, index: number, activeItemName: string) => void
+}
+
+const MenuItems: React.FC = props => {
+ const { t, locale } = useLanguage()
+ const route = useRouter()
+ const dispatch = useDispatch()
+ const { width } = useWindowDimensions()
+ const ArrowDirection = locale === 'en' ? HiChevronRight : HiChevronLeft
+
+ function onMenuItemClickHandler(productsGroup: IDropDown[] | undefined, category: string, index: number) {
+ props.onClick && props.onClick(productsGroup, category, index)
+ width >= 768 && dispatch(megaMenuActions.closeMegaMenu())
+ }
+
+ const activeMenuItemIndex = useSelector((state: IActiveMenuItemRootState) => state.activeMenuItem.activeMenuItemIndex)
+ return (
+
+ )
+}
+
+export default MenuItems
diff --git a/apps/tourism/components/UI/ProductPrice.tsx b/apps/tourism/components/UI/ProductPrice.tsx
new file mode 100644
index 000000000..0fca7c978
--- /dev/null
+++ b/apps/tourism/components/UI/ProductPrice.tsx
@@ -0,0 +1,44 @@
+import { Box } from '@chakra-ui/react'
+import React from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+
+interface Props {
+ price: number
+ discount?: number
+ isLargeSize?: boolean
+ isInSlider?: boolean
+}
+const ProductPrice: React.FC = ({ price, isLargeSize = false, isInSlider }) => {
+ const { t, locale } = useLanguage()
+
+ //style base on component position
+ const textMainPriceSize = isLargeSize ? ' md:text-3xl' : ' md:text-lg'
+ const textDiscountPriceSize = isLargeSize ? ' md:text-xl' : ' md:text-md'
+ const justifyContent = isInSlider && locale === 'fa' ? 'flex-start' : ''
+ const flexDirection = 'row'
+
+ return (
+
+
+
+ {/* ☝slider cards (.slick-slide=>Slider component) are float and because of that, they don't accept height so, for making cards the same height, I have to do this hack*/}
+
+ {t.currencySymbol}
+ {price.toFixed(2)}
+
+
+
+
+ )
+}
+
+export default ProductPrice
diff --git a/apps/tourism/components/UI/SectionTitle/index.tsx b/apps/tourism/components/UI/SectionTitle/index.tsx
new file mode 100644
index 000000000..19883edac
--- /dev/null
+++ b/apps/tourism/components/UI/SectionTitle/index.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import { useLanguage } from '../../../hooks/useLanguage'
+
+interface Props {
+ title: string
+}
+const SectionTitle: React.FC = ({ title }) => {
+ const { t } = useLanguage()
+ return {t[`${title}`]}
+}
+
+export default SectionTitle
diff --git a/apps/tourism/components/UI/card/Card.tsx b/apps/tourism/components/UI/card/Card.tsx
new file mode 100644
index 000000000..9adfb1e51
--- /dev/null
+++ b/apps/tourism/components/UI/card/Card.tsx
@@ -0,0 +1,111 @@
+import React from 'react'
+import Link from 'next/link'
+import { Box, Flex, Text, Image } from '@chakra-ui/react'
+import { toBinary } from '../../../utilities/common-utils'
+import StarIcon from '../../../public/images/Star.svg'
+import { useLanguage } from '@hooks/useLanguage'
+
+interface Props {
+ product: RetailItem
+}
+
+const Card: React.FC = ({ product }) => {
+ const { t } = useLanguage()
+ const encodedProduct = window.btoa(toBinary(JSON.stringify(product)))
+ return (
+
+
+
+
+
+
+
+
+
+ {product.descriptor.name}
+
+
+
+ {product.descriptor.short_desc}
+
+
+
+ 800 m
+
+
+
+ {product.tags.Rating}
+
+
+
+
+
+
+
+ {t.viewDetails}
+
+
+
+
+
+
+ )
+}
+
+export default Card
diff --git a/apps/tourism/components/UI/card/CardActions.tsx b/apps/tourism/components/UI/card/CardActions.tsx
new file mode 100644
index 000000000..ebc38668a
--- /dev/null
+++ b/apps/tourism/components/UI/card/CardActions.tsx
@@ -0,0 +1,69 @@
+import React from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import { useTheme } from 'next-themes'
+import { cartActions } from '../../../store/cart-slice'
+import { favoriteActions } from '../../../store/favorite-slice'
+import { RiHeartFill, RiHeartAddLine, RiShareLine, RiShoppingCart2Line } from 'react-icons/ri'
+import { RetailItem } from '../../../lib/types/products'
+import { IFavoriteRootState } from '../../../lib/types/favorite'
+
+import { toast } from 'react-toastify'
+import { useLanguage } from '../../../hooks/useLanguage'
+
+interface Props {
+ product: RetailItem
+}
+
+const CardActions: React.FC = ({ product }) => {
+ const dispatch = useDispatch()
+ const { t } = useLanguage()
+
+ const favoriteItems = useSelector((state: IFavoriteRootState) => state.favorite.items)
+ const isInFavorite = favoriteItems.some(item => item.id === product.id)
+ const FavoriteIcon = isInFavorite ? RiHeartFill : RiHeartAddLine
+
+ function addToCartHandler() {
+ dispatch(cartActions.addItemToCart({ product: product, quantity: 1 }))
+ toast.success(t.productAddedToCartMsg, {
+ theme: 'light'
+ })
+ }
+
+ function toggleFavoriteHandler() {
+ !isInFavorite
+ ? dispatch(favoriteActions.addToFavorite(product))
+ : dispatch(favoriteActions.removeFromFavorite(product.id))
+ }
+
+ return (
+ <>>
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ )
+}
+
+export default CardActions
diff --git a/apps/tourism/components/UI/discountCountdown/DateTimeDisplay.tsx b/apps/tourism/components/UI/discountCountdown/DateTimeDisplay.tsx
new file mode 100644
index 000000000..19f6751a5
--- /dev/null
+++ b/apps/tourism/components/UI/discountCountdown/DateTimeDisplay.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import { useLanguage } from '../../../hooks/useLanguage'
+
+interface Props {
+ value: number
+ type: string
+ isDanger: boolean
+}
+const DateTimeDisplay: React.FC = ({ value, type, isDanger }) => {
+ const { t, locale } = useLanguage()
+ const dateTime =
+ locale === 'en' ? new Intl.NumberFormat('en-EN').format(value) : new Intl.NumberFormat('fa-IR').format(value)
+ return (
+
+
{dateTime}
+
{t[`${type}`]}
+
+ )
+}
+
+export default DateTimeDisplay
diff --git a/apps/tourism/components/UI/discountCountdown/DiscountCountdown.tsx b/apps/tourism/components/UI/discountCountdown/DiscountCountdown.tsx
new file mode 100644
index 000000000..c6d86f9e4
--- /dev/null
+++ b/apps/tourism/components/UI/discountCountdown/DiscountCountdown.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import { useCountdown } from '../../../hooks/useCountdown'
+import ExpiredNotice from './ExpiredNotice'
+import ShowCounter from './ShowCounter'
+
+interface Props {
+ targetDate: number
+}
+const DiscountFlipCountdown: React.FC = ({ targetDate }) => {
+ const [days, hours, minutes, seconds] = useCountdown(targetDate)
+ if (days + hours + minutes + seconds <= 0) {
+ return
+ } else {
+ return (
+
+ )
+ }
+}
+
+export default DiscountFlipCountdown
diff --git a/apps/tourism/components/UI/discountCountdown/ExpiredNotice.tsx b/apps/tourism/components/UI/discountCountdown/ExpiredNotice.tsx
new file mode 100644
index 000000000..98ce398d2
--- /dev/null
+++ b/apps/tourism/components/UI/discountCountdown/ExpiredNotice.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import { useLanguage } from '../../../hooks/useLanguage'
+
+const ExpiredNotice = () => {
+ const { t } = useLanguage()
+ return (
+
+ )
+}
+
+export default ExpiredNotice
diff --git a/apps/tourism/components/UI/discountCountdown/ShowCounter.tsx b/apps/tourism/components/UI/discountCountdown/ShowCounter.tsx
new file mode 100644
index 000000000..997487906
--- /dev/null
+++ b/apps/tourism/components/UI/discountCountdown/ShowCounter.tsx
@@ -0,0 +1,40 @@
+import React from 'react'
+import DateTimeDisplay from './DateTimeDisplay'
+
+interface Props {
+ days: number
+ hours: number
+ minutes: number
+ seconds: number
+}
+const ShowCounter: React.FC = ({ days, hours, minutes, seconds }) => {
+ return (
+
+ )
+}
+
+export default ShowCounter
diff --git a/apps/tourism/components/appHeader/AppHeader.tsx b/apps/tourism/components/appHeader/AppHeader.tsx
new file mode 100644
index 000000000..f2634fc90
--- /dev/null
+++ b/apps/tourism/components/appHeader/AppHeader.tsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import Router from 'next/router'
+import { Box, Card, CardBody, Image, Text } from '@chakra-ui/react'
+import backArrow from '/public/images/Back.svg'
+
+export interface AppHeaderPropsModel {
+ appHeaderText: string
+}
+
+export const AppHeader: React.FC = props => {
+ const goBack = () => Router.back()
+ return (
+
+
+ goBack()}
+ cursor={'pointer'}
+ >
+ {/* eslint-disable-next-line jsx-a11y/alt-text */}
+
+
+
+ {props.appHeaderText}
+
+
+
+ )
+}
diff --git a/apps/tourism/components/assemblyDetails/index.tsx b/apps/tourism/components/assemblyDetails/index.tsx
new file mode 100644
index 000000000..b307039da
--- /dev/null
+++ b/apps/tourism/components/assemblyDetails/index.tsx
@@ -0,0 +1,352 @@
+import { Button } from '@beckn-ui/molecules'
+import { ChakraProvider, FormControl, FormLabel, Input, extendTheme, Box, Select, Flex } from '@chakra-ui/react'
+import Router from 'next/router'
+import React, { useEffect, useState } from 'react'
+
+const activeLabelStyles = {
+ transform: 'scale(1) translateY(-24px)'
+}
+
+export const theme = extendTheme({
+ components: {
+ Form: {
+ variants: {
+ floating: {
+ container: {
+ _focusWithin: {
+ label: {
+ ...activeLabelStyles
+ }
+ },
+ 'input:not(:placeholder-shown) + label, .chakra-select__wrapper + label, textarea:not(:placeholder-shown) ~ label':
+ {
+ ...activeLabelStyles
+ },
+ label: {
+ top: 0,
+ left: 0,
+ zIndex: 2,
+ position: 'absolute',
+ backgroundColor: 'white',
+ pointerEvents: 'none',
+ mx: 3,
+ px: 1,
+ my: 2,
+ transformOrigin: 'left top'
+ }
+ }
+ }
+ }
+ }
+ }
+})
+
+export default function AssemblyDetails() {
+ const [count, setCount] = useState(100)
+ const [formData, setFormData] = useState({
+ type: '',
+ colour: '',
+ shape: '',
+ length: '',
+ width: '',
+ quantity: count,
+ weight: ''
+ })
+ const [isFormDataFilled, setIsFormDataFilled] = useState(false)
+
+ useEffect(() => {
+ const areAllFieldsFilled = Object.values(formData).every(value => value !== '')
+ setIsFormDataFilled(areAllFieldsFilled)
+ }, [formData])
+
+ function increment() {
+ setCount(prevCount => prevCount + 1)
+ setFormData(prevData => ({ ...prevData, quantity: count + 1 }))
+ }
+
+ function decrement() {
+ if (count > 0) {
+ setCount(prevCount => prevCount - 1)
+ setFormData(prevData => ({ ...prevData, quantity: count - 1 }))
+ } else {
+ setCount(0)
+ setFormData(prevData => ({ ...prevData, quantity: 0 }))
+ }
+ }
+
+ const handleInputChange = (e: any, fieldName: any) => {
+ const updatedFormData = { ...formData, [fieldName]: e.target.value }
+ setFormData(updatedFormData)
+ }
+ const handleSelectChange = (value: any, fieldName: any) => {
+ const updatedFormData = { ...formData, [fieldName]: value }
+ setFormData(updatedFormData)
+ }
+
+ function submitAssemblyDetails() {
+ localStorage.setItem('assemblyDetails', JSON.stringify(formData))
+ Router.push('/checkoutPage')
+ }
+
+ return (
+ <>
+
+
+
+ handleSelectChange(e.target.value, 'type')}
+ value={formData.type}
+ // placeholder="Select option"
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ css={{
+ '& option': {
+ fontSize: '14px'
+ }
+ }}
+ >
+
+ Select Type
+
+ Plastic Box
+ Wooden Box
+
+
+ Type
+
+
+
+ handleSelectChange(e.target.value, 'colour')}
+ value={formData.colour}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ css={{
+ '& option': {
+ fontSize: '14px'
+ }
+ }}
+ >
+
+ Select Color
+
+ Blue
+ Red
+ Green
+
+
+ Color
+
+
+ handleSelectChange(e.target.value, 'shape')}
+ value={formData.shape}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ css={{
+ '& option': {
+ fontSize: '14px'
+ }
+ }}
+ >
+
+ Select Shape
+
+ Circle circle
+ Square
+
+
+ Shape
+
+
+
+
+ handleInputChange(e, 'length')}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ height="unset"
+ fontSize={'15px'}
+ paddingInlineEnd="unset"
+ paddingInlineStart="unset"
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ placeholder=" "
+ value={formData.length}
+ />
+ Length (in mm)
+
+
+ handleInputChange(e, 'width')}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ height="unset"
+ fontSize={'15px'}
+ paddingInlineStart="unset"
+ paddingInlineEnd="unset"
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ placeholder=""
+ value={formData.width}
+ />
+
+ Width (in mm)
+
+
+
+
+
+
+ -
+
+
+
+ +
+
+
+
+ Quantity
+
+
+
+ handleInputChange(e, 'weight')}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ height="unset"
+ fontSize={'15px'}
+ paddingInlineEnd="unset"
+ paddingInlineStart="unset"
+ _focusVisible={{
+ borderColor: 'unset',
+ boxShadow: 'unset'
+ }}
+ placeholder=" "
+ type={'text'}
+ value={formData.weight}
+ />
+
+ Weight (in Kg)
+
+
+
+
+
+ >
+ )
+}
diff --git a/apps/tourism/components/button/Button.tsx b/apps/tourism/components/button/Button.tsx
new file mode 100644
index 000000000..f29443699
--- /dev/null
+++ b/apps/tourism/components/button/Button.tsx
@@ -0,0 +1,39 @@
+import React, { ReactElement, useState } from 'react'
+import { Button as ButtonComp, useTheme } from '@chakra-ui/react'
+
+export interface ButtonPropsModel {
+ buttonText: string | ReactElement
+ background: string
+ color: string
+ handleOnClick?: () => void
+ isDisabled: boolean
+}
+
+const Button: React.FC = props => {
+ const theme = useTheme()
+ const isDisabled = props.isDisabled
+ const bgColorOfSearchIcon = theme.colors.primary['100']
+
+ return (
+ <>
+
+ {props.buttonText}
+
+ >
+ )
+}
+
+export default Button
diff --git a/apps/tourism/components/card/Card.module.css b/apps/tourism/components/card/Card.module.css
new file mode 100644
index 000000000..63205fa37
--- /dev/null
+++ b/apps/tourism/components/card/Card.module.css
@@ -0,0 +1,35 @@
+.checkbox label {
+ border: 1px solid #c5c5c5;
+ border-radius: 50%;
+ cursor: pointer;
+ height: 20px;
+ width: 20px;
+ position: absolute;
+ left: 20px;
+}
+
+.checkbox label:after {
+ border: 1px solid #fff;
+ content: "";
+ height: 4px;
+ opacity: 0;
+ position: absolute;
+ width: 4px;
+ border-radius: 50%;
+ padding: 4px;
+ left: 2px;
+ top: 2px;
+}
+
+.checkbox input[type="checkbox"] {
+ visibility: hidden;
+}
+
+.checkbox input[type="checkbox"]:checked + label::after {
+ background-color: #0560FA;
+ border-color: #0560FA;
+}
+
+.checkbox input[type="checkbox"]:checked + label:after {
+ opacity: 1;
+}
diff --git a/apps/tourism/components/card/Card.tsx b/apps/tourism/components/card/Card.tsx
new file mode 100644
index 000000000..b3d414d00
--- /dev/null
+++ b/apps/tourism/components/card/Card.tsx
@@ -0,0 +1,93 @@
+import { Box, Card, CardBody, Flex, Image, Text } from '@chakra-ui/react'
+import React from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+
+import styles from './Card.module.css'
+
+export interface CardWithCheckBoxPropsModel {
+ paymentMethod: string
+ paymentMethodNet: string
+ img1: string
+ img2: string
+ setChecked: React.Dispatch>
+}
+
+const CardWithCheckBox: React.FC = props => {
+ const { t } = useLanguage()
+
+ const handleChange = () => {
+ props.setChecked(prevValue => !prevValue)
+ }
+
+ return (
+
+
+
+
+
+
+
+ {props.paymentMethodNet}
+
+
+
+
+
+
+
+
+ {props.paymentMethod}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default React.memo(CardWithCheckBox)
diff --git a/apps/tourism/components/card/CardUncked.tsx b/apps/tourism/components/card/CardUncked.tsx
new file mode 100644
index 000000000..97405dd09
--- /dev/null
+++ b/apps/tourism/components/card/CardUncked.tsx
@@ -0,0 +1,90 @@
+import { Card, CardBody, Flex, Image, Text } from '@chakra-ui/react'
+import React from 'react'
+import styles from './Card.module.css'
+
+export interface CardWithUncheckedPropsModel {
+ paymentMethod: string
+ paymentMethodNet: string
+ img1: string
+ img2: string
+ setChecked: React.Dispatch>
+}
+
+const CardWithUnchecked: React.FC = props => {
+ const handleChange = () => {
+ props.setChecked(prevValue => !prevValue)
+ }
+
+ return (
+
+
+
+
+
+
+
+ {props.paymentMethodNet}
+
+
+
+
+
+
+
+
+ {props.paymentMethodNet}
+
+
+
+
+
+ )
+}
+
+export default React.memo(CardWithUnchecked)
diff --git a/apps/tourism/components/emptyCart/EmptyCart.tsx b/apps/tourism/components/emptyCart/EmptyCart.tsx
new file mode 100644
index 000000000..c02617f70
--- /dev/null
+++ b/apps/tourism/components/emptyCart/EmptyCart.tsx
@@ -0,0 +1,15 @@
+import { Box } from '@chakra-ui/react'
+import React from 'react'
+import Router from 'next/router'
+import { useLanguage } from '@hooks/useLanguage'
+
+const EmptyCart: React.FC = () => {
+ const { t } = useLanguage()
+ const handleGoBack = (): void => {
+ Router.push('/homePage')
+ }
+
+ return <>>
+}
+
+export default EmptyCart
diff --git a/apps/tourism/components/filter/Filter.tsx b/apps/tourism/components/filter/Filter.tsx
new file mode 100644
index 000000000..8a3f91a19
--- /dev/null
+++ b/apps/tourism/components/filter/Filter.tsx
@@ -0,0 +1,206 @@
+import {
+ Image,
+ Box,
+ ChakraProvider,
+ Divider,
+ extendTheme,
+ Flex,
+ FormControl,
+ FormLabel,
+ Select,
+ Text
+} from '@chakra-ui/react'
+import Button from '@components/button/Button'
+import React, { useState } from 'react'
+
+const activeLabelStyles = {
+ transform: 'scale(1) translateY(-24px)'
+}
+
+export const theme = extendTheme({
+ components: {
+ Form: {
+ variants: {
+ floating: {
+ container: {
+ _focusWithin: {
+ label: {
+ ...activeLabelStyles
+ }
+ },
+ 'input:not(:placeholder-shown) + label, .chakra-select__wrapper + label, textarea:not(:placeholder-shown) ~ label':
+ {
+ ...activeLabelStyles
+ },
+ label: {
+ top: 0,
+ left: 0,
+ zIndex: 2,
+ position: 'absolute',
+ backgroundColor: 'white',
+ pointerEvents: 'none',
+ mx: 3,
+ px: 1,
+ my: 2,
+ transformOrigin: 'left top'
+ }
+ }
+ }
+ }
+ }
+ },
+ colors: {
+ primary: {
+ '100': '#F6D046'
+ }
+ }
+})
+
+const Filter = () => {
+ const [formData, setFormData] = useState({})
+
+ const handleChange = (name: string, value: string) => {
+ setFormData(prevData => ({
+ ...prevData,
+ [name]: value
+ }))
+ }
+
+ return (
+ <>
+
+
+
+ All Filters
+
+ Reset
+
+
+
+
+
+ handleChange('searchBy1', e.target.value)}
+ value={formData.searchBy1 || ''}
+ fontSize="15px"
+ height={'30px'}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ >
+ Search by
+ Relevance1
+ Relevance2
+
+
+ Search by
+
+
+
+
+
+ handleChange('searchBy2', e.target.value)}
+ value={formData.searchBy2 || ''}
+ fontSize="15px"
+ height={'30px'}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ >
+ Service Type
+ Relevance1
+ Relevance2
+
+
+ Service Type
+
+
+
+
+
+ handleChange('searchBy3', e.target.value)}
+ value={formData.searchBy3 || ''}
+ fontSize="15px"
+ height={'30px'}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ >
+ Rating
+ 1+
+ 2+
+
+
+ Rating
+
+
+
+
+
+ handleChange('searchBy4', e.target.value)}
+ value={formData.searchBy4 || ''}
+ fontSize="15px"
+ height={'30px'}
+ border={'unset'}
+ borderRadius="unset"
+ borderBottom={'1px solid'}
+ paddingBottom={'2px'}
+ >
+ Deals & Discounts
+ Relevance1
+ Relevance2
+
+
+ Deals & Discounts
+
+
+
+ {/* */}
+
+
+
+ >
+ )
+}
+
+export default Filter
diff --git a/apps/tourism/components/geoLocationInput/GeoLocationInput.module.css b/apps/tourism/components/geoLocationInput/GeoLocationInput.module.css
new file mode 100644
index 000000000..5fe34a7b5
--- /dev/null
+++ b/apps/tourism/components/geoLocationInput/GeoLocationInput.module.css
@@ -0,0 +1,125 @@
+.parent_container {
+ height: 150px;
+}
+.flex_container {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+}
+
+.flex_input_group {
+ display: flex;
+ flex-direction: row;
+}
+.location_drop_down_container {
+ margin-top: 8px;
+ max-height: 200px;
+ margin-bottom: 1px;
+ background-color: #f0f0f0;
+ overflow: scroll;
+}
+.location_drop_down_list {
+ width: 100%;
+ height: 200px;
+}
+
+.location_list_label {
+ border-bottom: 1px solid #ddd;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ cursor: pointer;
+}
+
+.input_box {
+ flex: 1;
+ border: none;
+ padding-left: 14px;
+ padding-top: 18px;
+ padding-bottom: 18px;
+ border-top-left-radius: 10px;
+ border-bottom-left-radius: 10px;
+ color: #7f898e;
+ font-size: 16px;
+ font-weight: 400;
+ filter: drop-shadow(0px 10px 24px rgba(0, 0, 0, 0.1));
+}
+.input_box:focus {
+ background-color: #fff;
+ outline: none;
+}
+
+.search_button {
+ background-color: rgba(var(--color-primary));
+ color: #fff;
+ border: none;
+ padding: 18px 21px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+}
+
+/* -----------*/
+
+.main_container2 {
+ background: #fff;
+ height: calc(100vh - 0px);
+ background-repeat: no-repeat;
+ margin-top: 3.5vh;
+ padding-left: 5px;
+ background-size: cover;
+}
+
+.search_box_container {
+ width: 85%;
+}
+.search_box_input {
+ outline: none;
+ width: 90%;
+ margin-right: 12px;
+}
+.close_icon{
+ position: absolute;
+ right:40px;
+}
+.border {
+ border-top: 1px solid black;
+ border-right: 1px solid black;
+}
+
+.location_pointer_wrapper {
+ height: 20px;
+ width: 20px;
+ margin-top: auto;
+ margin-bottom: auto;
+}
+.location_listitem_content {
+ max-width: 80%;
+ margin-left: 10px;
+ margin-bottom: 5px;
+}
+.location_list_item {
+ border-bottom: 1px solid #f0f0f0;
+ height: max-content;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.location_listitem_content_main_text {
+ font-weight: 700;
+ font-size: 14px;
+ line-height: 14.32px;
+ color: #37474f;
+}
+.location_listitem_content_secondary_text {
+ font-weight: 400;
+ font-size: 12px;
+ line-height: 15px;
+ color: #7c7c7c;
+}
+.location_listitem_container {
+ margin-top: 10px;
+}
diff --git a/apps/tourism/components/geoLocationInput/GeoLocationInputList.tsx b/apps/tourism/components/geoLocationInput/GeoLocationInputList.tsx
new file mode 100644
index 000000000..77152907f
--- /dev/null
+++ b/apps/tourism/components/geoLocationInput/GeoLocationInputList.tsx
@@ -0,0 +1,126 @@
+import { Box, Flex, Image, Input, Text } from '@chakra-ui/react'
+import React from 'react'
+import Styles from './GeoLocationInput.module.css'
+import { useDispatch } from 'react-redux'
+import { useState } from 'react'
+import { toggleLocationSearchPageVisibility, setGeoAddressAndLatLong } from '../../store/geoMapLocationSearch-slice'
+import backArrow from '/public/images/Back.svg'
+import locationMarker from '../../public/images/searchlocationmarker.svg'
+import PlacesAutocomplete, { geocodeByAddress, getLatLng } from 'react-places-autocomplete'
+import { IoClose } from 'react-icons/io5'
+
+const GeoLocationInputList: React.FC = () => {
+ const dispatch = useDispatch()
+ const [address, setAddress] = useState('')
+ const handleSelect = async (data: string) => {
+ const addressData = await geocodeByAddress(data)
+ const latLong = await getLatLng(addressData[0])
+ dispatch(
+ setGeoAddressAndLatLong({
+ geoAddress: data,
+ geoLatLong: `${latLong.lat},${latLong.lng}`
+ })
+ )
+ closeGeoLocationSearchPage()
+ }
+ const closeGeoLocationSearchPage = () => {
+ dispatch(toggleLocationSearchPageVisibility(false))
+ }
+ return (
+
+ {
+ return setAddress(event)
+ }}
+ onSelect={data => handleSelect(data)}
+ >
+ {({ getInputProps, suggestions, getSuggestionItemProps }) => (
+
+
+
+ {
+ closeGeoLocationSearchPage()
+ }}
+ alt="backArrow"
+ />
+
+
+
+
+ {
+ setAddress('')
+ }}
+ />
+
+
+
+
+ {suggestions.length
+ ? suggestions.map(suggestion => {
+ return (
+
+
+
+
+
+
+ {suggestion.formattedSuggestion.mainText}
+
+
+ {suggestion.formattedSuggestion.secondaryText}
+
+
+
+ )
+ })
+ : null}
+
+
+ )}
+
+
+ )
+}
+
+export default GeoLocationInputList
diff --git a/apps/tourism/components/header/SearchBar.tsx b/apps/tourism/components/header/SearchBar.tsx
new file mode 100644
index 000000000..953a9a76c
--- /dev/null
+++ b/apps/tourism/components/header/SearchBar.tsx
@@ -0,0 +1,58 @@
+import React, { useState } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+import { SearchBarPropsModel } from '../../lib/types/search'
+import { Box, Flex, Image, Input } from '@chakra-ui/react'
+
+const SearchBar: React.FC = ({ searchString, handleChange }) => {
+ const { t } = useLanguage()
+ const [searchText, setSearchText] = useState(searchString)
+
+ const inputChangeHandler = (event: React.BaseSyntheticEvent) => {
+ setSearchText(event.target.value)
+ }
+
+ const handleSubmit = () => {
+ handleChange(searchText)
+ }
+
+ return (
+
+
+ event.key === 'Enter' && handleSubmit()}
+ />
+
+
+
+
+
+ )
+}
+
+export default SearchBar
diff --git a/apps/tourism/components/header/header.module.css b/apps/tourism/components/header/header.module.css
new file mode 100644
index 000000000..2b11efdb9
--- /dev/null
+++ b/apps/tourism/components/header/header.module.css
@@ -0,0 +1,84 @@
+.header_title {
+ width: 260px;
+ display: flex;
+ margin-left: 8px;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ gap: 4px;
+ margin: 0 auto;
+}
+.header_title_text {
+ margin: 0 auto;
+ text-align: center;
+ font-size: 17px !important;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+.top_header {
+ height: 30px;
+ width: 100%;
+ background-color: #efefef;
+ position: fixed;
+ z-index: 9999;
+ /* padding: 0 10rem; */
+ top: 0;
+}
+.top_header_wrapper {
+ display: flex;
+ height: 100%;
+ align-items: center;
+ justify-content: space-between;
+}
+.top_header_lan {
+ margin-left: auto;
+ display: flex;
+ gap: 16px;
+}
+.top_header_modal {
+ display: flex;
+ gap: 8px;
+ padding: 15px 0px;
+}
+.bottom_header {
+ position: fixed;
+ left: 0;
+ right: 0;
+ padding-left: 10px;
+ margin-bottom: 16px;
+ top: 30px;
+ background-color: #ffffff;
+ box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.07);
+ z-index: 1;
+}
+.bottom_header_wrapper {
+ display: flex;
+ flex-direction: column;
+}
+.bottom_header_innr {
+ display: flex;
+ align-items: center;
+ position: relative;
+ height: 60px;
+ /* padding: 0 10rem; */
+}
+.bottom_header_backIcon {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+}
+.bottom_header_cartIcon {
+ display: flex;
+ gap: 16px;
+}
+@media (min-width: 768px) {
+ .bottom_header {
+ z-index: 99;
+ }
+}
+@media screen and (min-width: 1024px) and (max-width: 1366px) {
+ .bottom_header_innr,
+ .top_header {
+ padding: 0 20px !important;
+ }
+}
diff --git a/apps/tourism/components/header/index.tsx b/apps/tourism/components/header/index.tsx
new file mode 100644
index 000000000..f9554008e
--- /dev/null
+++ b/apps/tourism/components/header/index.tsx
@@ -0,0 +1,410 @@
+import React, { useEffect, useState } from 'react'
+import { BottomModal } from '@beckn-ui/molecules'
+
+import { Box, Divider, Flex, HStack, Image, Text } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import styles from './header.module.css'
+
+import { useLanguage } from '../../hooks/useLanguage'
+import Qrcode from '@components/qrCode/Qrcode'
+import BottomModalScan from '@components/BottomModal/BottomModalScan'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import TopSheet from '@components/topSheet/TopSheet'
+
+type PathnameObjectType = { [key: string]: string }
+
+const cartIconBlackList: string[] = [
+ '/orderConfirmation',
+ '/orderDetails',
+ '/trackOrder',
+ '/feedback',
+ '/orderHistory',
+ '/',
+ '/mobileOtp',
+ '/cart',
+ '/checkoutPage',
+ '/paymentMode',
+ '/search',
+ '/product',
+ '/signUp',
+ '/invoiceDetails'
+]
+
+const backIconList = ['/', '/homePage']
+
+const homeIconBlackList = ['/', '/homePage', '/mobileOtp', '/paymentMode', '/signUp']
+
+const storeHeaderBlackList = [
+ '/checkoutPage',
+ '/orderHistory',
+ '/orderDetails',
+ '/cart',
+ '/homePage',
+ '/orderConfirmation',
+ 'feedback',
+ '/',
+ '/signUp',
+ '/mobileOtp',
+ '/paymentMode',
+ '/invoiceDetails',
+ '/assemblyDetails',
+ '/updateShippingDetails',
+ '/orderCancellation',
+ '/profile'
+]
+const headerValues: PathnameObjectType = {
+ '/checkoutPage': 'Review Purchase Order',
+ '/orderHistory': 'Order History',
+ '/orderDetails': 'Order Details',
+ '/invoiceDetails': 'Invoice Details',
+ '/': 'Sign In',
+ '/signUp': 'Sign Up',
+ '/cart': 'Cart',
+ '/paymentMode': 'Select Payment Method',
+ '/assemblyDetails': 'Add Assembly Details',
+ '/updateShippingDetails': 'Shipping Details',
+ '/orderCancellation': 'Order Cancel',
+ '/feedback': '',
+ '/profile': 'Profile'
+ // '/search':'Search results'
+}
+
+const headerValuesFrench: PathnameObjectType = {
+ '/checkoutPage': 'Facturation et Livraison',
+ '/orderHistory': 'Historique des Commandes',
+ '/orderDetails': 'Détails de la Commande',
+ '/': 'Se Connecter',
+ '/mobileOtp': 'Se Connecter',
+ '/cart': 'Panier',
+ '/paymentMode': 'Sélectionner la Méthode de Paiement',
+ '/feedback': ''
+}
+
+const topHeaderBlackList: string[] = []
+
+const bottomHeaderBlackList = ['/orderConfirmation', '/']
+
+const menuIconWhiteList = ['/homePage', '/search', '/profile']
+const orderIconList = ['/orderDetails']
+const invoiceDownloadIcon = ['/invoiceDetails']
+const currentLocation = ['/homePage']
+
+const getHeaderTitleForPage = (name: string, logo: string, pathName: string, locale: string | undefined) => {
+ const values = locale === 'en' ? headerValues : headerValuesFrench
+ switch (true) {
+ case storeHeaderBlackList.includes(pathName):
+ return {values[pathName]}
+ default:
+ return (
+
+ {name}
+
+ )
+ }
+}
+
+export interface TopHeaderProps {
+ handleMenuClick?: () => void
+}
+
+const TopHeader: React.FC = ({ handleMenuClick }) => {
+ const [isMenuModalOpen, setMenuModalOpen] = useState(false)
+
+ const { t, locale } = useLanguage()
+ const router = useRouter()
+
+ const handleMenuModalClose = () => {
+ setMenuModalOpen(false)
+ }
+
+ return (
+ <>
+
+
+
+ {/* */}
+
+
+ {!homeIconBlackList.includes(router.pathname) && (
+ {
+ const user = localStorage.getItem('userPhone') as string
+ localStorage.clear()
+ localStorage.setItem('userPhone', user)
+ router.push(`/homePage`)
+ }}
+ src="/images/Home_icon.svg"
+ alt="home Icon"
+ />
+ )}
+
+ {menuIconWhiteList.includes(router.pathname) && (
+ setMenuModalOpen(true)}
+ className="block"
+ src="/images/threeDots.svg"
+ alt="menu icon"
+ />
+ )}
+
+
+
+
+ {/* Menu Modal */}
+
+ {
+ router.push('/orderHistory')
+ setMenuModalOpen(false)
+ }}
+ className={styles.top_header_modal}
+ >
+
+ {t['orderHistory']}
+
+
+ >
+ )
+}
+
+const BottomHeader = () => {
+ const [optionTags, setOptionTags] = useState()
+ const { t, locale } = useLanguage()
+ const [isOrderModalOpen, setOrderModalOpen] = useState(false)
+ const [isInvoiceModalOpen, setInvoiceModalOpen] = useState(false)
+
+ const [currentAddress, setCurrentAddress] = useState('')
+ const [loadingForCurrentAddress, setLoadingForCurrentAddress] = useState(true)
+ const [currentLocationFetchError, setFetchCurrentLocationError] = useState('')
+ const handleInvoiceModalClose = () => {
+ setInvoiceModalOpen(false)
+ }
+ const handleOrderModalClose = () => {
+ setOrderModalOpen(false)
+ }
+ useEffect(() => {
+ setOptionTags(JSON.parse(localStorage.getItem('optionTags') as string))
+ }, [])
+
+ const apiKeyForGoogle = process.env.NEXT_PUBLIC_GOOGLE_API_KEY
+ const router = useRouter()
+
+ useEffect(() => {
+ // Check if geolocation is available in the browser
+ if (navigator) {
+ if ('geolocation' in navigator) {
+ navigator.geolocation.getCurrentPosition(
+ async position => {
+ const latitude = position.coords.latitude
+ const longitude = position.coords.longitude
+
+ const coordinates = {
+ latitude,
+ longitude
+ }
+
+ localStorage.setItem('coordinates', JSON.stringify(coordinates))
+
+ try {
+ const response = await fetch(
+ `https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${apiKeyForGoogle}`
+ )
+
+ if (response.ok) {
+ const data = await response.json()
+
+ if (data.results.length > 0) {
+ const formattedAddress = data.results[0].formatted_address
+ setCurrentAddress(formattedAddress)
+ } else {
+ setFetchCurrentLocationError('No address found for the given coordinates.')
+ }
+ } else {
+ setFetchCurrentLocationError('Failed to fetch address data.')
+ alert('Failed to fetch address data.')
+ }
+ } catch (error) {
+ setFetchCurrentLocationError('Error fetching address data: ' + (error as any).message)
+ alert('Error fetching address data: ' + (error as any).message)
+ } finally {
+ setLoadingForCurrentAddress(false)
+ }
+ },
+ error => {
+ setFetchCurrentLocationError('Error getting location: ' + error.message)
+ alert('Error getting location: ' + error.message)
+ setLoadingForCurrentAddress(false)
+ }
+ )
+ } else {
+ setFetchCurrentLocationError('Geolocation is not available in this browser.')
+ alert('Geolocation is not available in this browser.')
+ setLoadingForCurrentAddress(false)
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ return (
+
+
+
+
+ {!backIconList.includes(router.pathname) && (
+ router.back()}
+ cursor="pointer"
+ >
+
+
+ )}
+ {currentLocation.includes(router.pathname) && (
+
+ )}
+
+ {getHeaderTitleForPage(optionTags?.name, optionTags?.logo, router.pathname, locale)}
+
+ {!cartIconBlackList.includes(router.pathname) && (
+ router.push('/cart')}
+ cursor="pointer"
+ >
+
+
+ )}
+
+ {orderIconList.includes(router.pathname) && (
+ setOrderModalOpen(true)}
+ src="/images/orderDetailsIcon.svg"
+ alt="order icon"
+ mr={'20px'}
+ />
+ )}
+ {invoiceDownloadIcon.includes(router.pathname) && (
+ setInvoiceModalOpen(true)}
+ src="/images/downloadInvoice.svg"
+ alt="invoice icon"
+ mr={'20px'}
+ />
+ )}
+
+
+
+ {
+ router.push('/invoiceDetails')
+ setOrderModalOpen(false)
+ }}
+ className={styles.top_header_modal}
+ >
+
+ {t['invoiceDetails']}
+
+
+
+
+
+ {t.scanthisQR}
+ {t.toImportthisorderanotherapp}
+
+
+
+
+
+
+
+
+
+ {t.or}
+
+
+
+
+ {t.clicktheShopbuttontobuyitemsforthistrip}
+
+
+
+
+
+ )
+}
+
+const Header = () => {
+ const router = useRouter()
+
+ const renderTopHeader = !topHeaderBlackList.includes(router.pathname)
+ const renderBottomHeader = !bottomHeaderBlackList.includes(router.pathname)
+
+ return (
+
+ {renderTopHeader && }
+ {renderBottomHeader && }
+
+ )
+}
+
+export default Header
diff --git a/apps/tourism/components/layout/Layout.module.css b/apps/tourism/components/layout/Layout.module.css
new file mode 100644
index 000000000..db77330e4
--- /dev/null
+++ b/apps/tourism/components/layout/Layout.module.css
@@ -0,0 +1,40 @@
+/* Layout.module.css */
+
+.container {
+ display: flex;
+ flex-direction: column;
+}
+
+.container.homepage {
+ height: 100vh;
+ background-image: url('/images/landingPageTourism.svg');
+}
+
+.container.minHeight {
+ min-height: 100vh;
+}
+
+.main {
+ flex-grow: 1;
+ /* background: #fbfcff; */
+}
+
+.main.withPadding {
+ padding: 0 20px;
+}
+
+.main.withMargin {
+ margin-top: 100px;
+}
+.main.withMarginSignUp {
+ margin-top: 60px;
+}
+
+.main.homepageMargin {
+ margin-top: 100px;
+ padding: 20px;
+}
+
+.main.searchMargin {
+ margin-top: 95px;
+}
diff --git a/apps/tourism/components/layout/Layout.tsx b/apps/tourism/components/layout/Layout.tsx
new file mode 100644
index 000000000..2bd6bb6fe
--- /dev/null
+++ b/apps/tourism/components/layout/Layout.tsx
@@ -0,0 +1,65 @@
+import React from 'react'
+import { Provider, useSelector } from 'react-redux'
+import Head from 'next/head'
+import { ThemeProvider } from 'next-themes'
+import { useRouter } from 'next/router'
+import Header from '../header'
+import store from '../../store/index'
+import { ToastContainer } from 'react-toastify'
+import { useLanguage } from '../../hooks/useLanguage'
+import NextNProgress from 'nextjs-progressbar'
+import styles from './Layout.module.css'
+import { IGeoLocationSearchPageRootState } from '@lib/types/geoLocationSearchPage'
+import GeoLocationInputList from '@components/geoLocationInput/GeoLocationInputList'
+import { Box } from '@chakra-ui/react'
+
+const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
+ const { locale } = useLanguage()
+ const router = useRouter()
+ const isHomepage = router.pathname === '/'
+ const isSearch = router.pathname === '/search'
+ const isSignUp = router.pathname === '/signUp'
+ const isSearchPage = router.pathname === '/search'
+ const geoLocationSearchPageVisible = useSelector((state: IGeoLocationSearchPageRootState) => {
+ return state.geoLocationSearchPageUI.geoLocationSearchPageVisible
+ })
+
+ return (
+ //
+
+
+ Tourism
+
+
+
+
+ {!geoLocationSearchPageVisible ? (
+
+ {children}
+
+ ) : (
+
+ )}
+
+
+
+ //
+ )
+}
+
+export default Layout
diff --git a/apps/tourism/components/loader/LoaderWithMessage.tsx b/apps/tourism/components/loader/LoaderWithMessage.tsx
new file mode 100644
index 000000000..9ab39c49c
--- /dev/null
+++ b/apps/tourism/components/loader/LoaderWithMessage.tsx
@@ -0,0 +1,38 @@
+import { Loader } from '@beckn-ui/molecules'
+import { Box, Text } from '@chakra-ui/react'
+import React from 'react'
+
+interface LoaderWithMessagePropsModel {
+ loadingText: string
+ loadingSubText: string
+}
+
+const LoaderWithMessage: React.FC = props => {
+ const { loadingText = '', loadingSubText = '' } = props
+ return (
+
+
+
+ {loadingText}
+
+
+ {loadingSubText}
+
+
+
+ )
+}
+
+export default React.memo(LoaderWithMessage)
diff --git a/apps/tourism/components/orderHistory/emptyOrder.tsx b/apps/tourism/components/orderHistory/emptyOrder.tsx
new file mode 100644
index 000000000..37a1ecb7f
--- /dev/null
+++ b/apps/tourism/components/orderHistory/emptyOrder.tsx
@@ -0,0 +1,50 @@
+import React from 'react'
+import { Text, Flex, Image } from '@chakra-ui/react'
+import { Typography } from '@beckn-ui/molecules'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import orderHistoreyPageIcon from '../../public/images/orderHistoryPageIcon.svg'
+import { useLanguage } from '@hooks/useLanguage'
+import { useRouter } from 'next/router'
+
+const EmptyOrder = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+
+ router.push('/homePage')}
+ />
+
+ )
+}
+
+export default EmptyOrder
diff --git a/apps/tourism/components/productCard/product-card-renderer.tsx b/apps/tourism/components/productCard/product-card-renderer.tsx
new file mode 100644
index 000000000..73703e4f3
--- /dev/null
+++ b/apps/tourism/components/productCard/product-card-renderer.tsx
@@ -0,0 +1,138 @@
+import { Flex, Box, Image, Text, Link } from '@chakra-ui/react'
+import { useLanguage } from '@hooks/useLanguage'
+import { toBinary } from '@utils/common-utils'
+import { calculateDistance, Coordinate } from '@utils/homePage.utils'
+import { useRouter } from 'next/router'
+import React, { useEffect, useState } from 'react'
+import StarIcon from '../../public/images/Star.svg'
+
+const ProductCardRenderer = (data: any) => {
+ const [distance, setDistance] = useState(0)
+ const { dataSource } = data
+ const { t } = useLanguage()
+ const router = useRouter()
+ const encodedProduct = window.btoa(toBinary(JSON.stringify(dataSource)))
+
+ useEffect(() => {
+ const stringifiedCoords = localStorage.getItem('coordinates') as string
+ const parsedThing: Coordinate = JSON.parse(stringifiedCoords)
+
+ const distance = calculateDistance(parsedThing, dataSource.providerCoordinates)
+ setDistance(Math.floor(distance))
+ }, [])
+
+ // TODO :- have to fix CSS as well as remove mock data and add dynamic data
+ return (
+
+
+
+
+
+
+
+
+
+ {dataSource.item.name}
+
+
+
+
+ {dataSource.providerName}
+
+ {dataSource.item.short_desc}
+
+
+
+
+
+
+
+
+ {distance} {distance > 1 ? 'km' : 'm'}
+
+
+
+
+
+
+ {dataSource.rating}
+
+
+
+ {
+ localStorage.setItem('selectedItem', JSON.stringify(dataSource))
+ router.push(`/product?productDetails=${encodedProduct}`)
+ }}
+ mt={'30px'}
+ >
+
+ {t.viewDetails}
+
+
+
+
+ )
+}
+
+export default ProductCardRenderer
diff --git a/apps/tourism/components/productDetails/CallToAction.tsx b/apps/tourism/components/productDetails/CallToAction.tsx
new file mode 100644
index 000000000..11dea0756
--- /dev/null
+++ b/apps/tourism/components/productDetails/CallToAction.tsx
@@ -0,0 +1,49 @@
+import React, { useEffect, useState } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+import { useDispatch } from 'react-redux'
+import { cartActions } from '../../store/cart-slice'
+import { RetailItem } from '../../lib/types/products'
+import { Box, useTheme, Button } from '@chakra-ui/react'
+
+interface Props {
+ product: RetailItem
+}
+const CallToAction: React.FC = ({ product }) => {
+ const [counter, setCounter] = useState(1)
+ const { t } = useLanguage()
+ const theme = useTheme()
+ const bgColorOfSearchIcon = theme.colors.primary['100']
+
+ useEffect(() => {
+ return () => {
+ setCounter(1)
+ }
+ }, [product])
+
+ const dispatch = useDispatch()
+
+ function addToCartHandler() {
+ dispatch(
+ cartActions.addItemToCart({
+ product: product,
+ quantity: counter
+ })
+ )
+ }
+ return (
+
+
+ {t.book}
+
+
+ )
+}
+
+export default CallToAction
diff --git a/apps/tourism/components/productDetails/DetailsSection.tsx b/apps/tourism/components/productDetails/DetailsSection.tsx
new file mode 100644
index 000000000..8e1bf15da
--- /dev/null
+++ b/apps/tourism/components/productDetails/DetailsSection.tsx
@@ -0,0 +1,90 @@
+import { Box, Flex, Image } from '@chakra-ui/react'
+import React, { useEffect, useState } from 'react'
+import StarRatingComponent from 'react-star-rating-component'
+import { useLanguage } from '../../hooks/useLanguage'
+import { RetailItem } from '../../lib/types/products'
+import CallToAction from './CallToAction'
+import greenVegIcon from '../../public/images/greenVeg.svg'
+import redNonVegIcon from '../../public/images/redNonVeg.svg'
+
+interface Props {
+ product: RetailItem
+}
+const DetailsSection: React.FC = ({ product }) => {
+ const { t } = useLanguage()
+ const [showComponent, setShowComponent] = useState(false)
+
+ useEffect(() => {
+ setShowComponent(true)
+ }, [])
+
+ if (!showComponent) {
+ return <>>
+ }
+
+ return (
+
+
+
+ {product.descriptor.name}
+
+
+ {product.tags.foodType ? (
+ product.tags.foodType === 'veg' ? (
+
+ ) : (
+
+ )
+ ) : null}
+
+
+
+
+
+
+
+ {parseFloat(product.tags.rating)} {t.stars}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DetailsSection
diff --git a/apps/tourism/components/productDetails/ImageSection.tsx b/apps/tourism/components/productDetails/ImageSection.tsx
new file mode 100644
index 000000000..931d83a95
--- /dev/null
+++ b/apps/tourism/components/productDetails/ImageSection.tsx
@@ -0,0 +1,62 @@
+import { Image } from '@chakra-ui/react'
+import React, { useState } from 'react'
+import { RetailItem } from '../../lib/types/products'
+import ProductPageActions from './ProductPageActions'
+
+interface Props {
+ imgArray: string[]
+ product: RetailItem
+}
+const ImageSection: React.FC = ({ imgArray, product }) => {
+ const [selectedImg, setSelectedImg] = useState(0)
+ function onClickHandler(index: number) {
+ setSelectedImg(index)
+ }
+ return (
+
+
+
+
+
+
+
+ {/* TODO :- will uncomment it if we get multiple images in the array */}
+
+ {/*
+ {imgArray.map((imgItem: string, index: number) => {
+ return (
+
onClickHandler(index)}
+ >
+
+
+ );
+ })}
+
*/}
+
+
+ )
+}
+
+export default ImageSection
diff --git a/apps/tourism/components/productDetails/ProductPageActions.tsx b/apps/tourism/components/productDetails/ProductPageActions.tsx
new file mode 100644
index 000000000..2970fd2df
--- /dev/null
+++ b/apps/tourism/components/productDetails/ProductPageActions.tsx
@@ -0,0 +1,42 @@
+import React from 'react'
+import { useSelector, useDispatch } from 'react-redux'
+import { favoriteActions } from '../../store/favorite-slice'
+import { RetailItem } from '../../lib/types/products'
+import { IFavoriteRootState } from '../../lib/types/favorite'
+import { RiHeartFill, RiHeartAddLine, RiShareLine } from 'react-icons/ri'
+
+interface Props {
+ product: RetailItem
+}
+const ProductPageActions: React.FC = ({ product }) => {
+ const dispatch = useDispatch()
+ const favoriteItems = useSelector((state: IFavoriteRootState) => state.favorite.items)
+ const isInFavorite = favoriteItems.some(item => item.id === product.id)
+ let FavoriteIcon = isInFavorite ? RiHeartFill : RiHeartAddLine
+ function toggleFavoriteHandler() {
+ !isInFavorite
+ ? dispatch(favoriteActions.addToFavorite(product))
+ : dispatch(favoriteActions.removeFromFavorite(product.id))
+ }
+ return (
+ <>>
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ )
+}
+
+export default ProductPageActions
diff --git a/apps/tourism/components/productDetails/SimilarProducts.tsx b/apps/tourism/components/productDetails/SimilarProducts.tsx
new file mode 100644
index 000000000..e37a7bd2e
--- /dev/null
+++ b/apps/tourism/components/productDetails/SimilarProducts.tsx
@@ -0,0 +1,27 @@
+import React from 'react'
+import { RetailItem } from '../../lib/types/products'
+import CarouselBox from '../UI/CarouselBox/CarouselBox'
+import CarouselBoxCard from '../UI/CarouselBox/CarouselBoxCard'
+
+interface Props {
+ products: RetailItem[]
+}
+const SimilarProducts: React.FC = ({ products }) => {
+ return (
+
+
+ {products.map(product => (
+
+ ))}
+
+
+ )
+}
+
+export default SimilarProducts
diff --git a/apps/tourism/components/productDetails/index.tsx b/apps/tourism/components/productDetails/index.tsx
new file mode 100644
index 000000000..9a87b3c87
--- /dev/null
+++ b/apps/tourism/components/productDetails/index.tsx
@@ -0,0 +1,85 @@
+import React from 'react'
+import { Box, Flex, Text } from '@chakra-ui/react'
+import { ProductDescription, ProductSummary } from '@beckn-ui/becknified-components'
+import StarRatingComponent from 'react-star-rating-component'
+import { Button } from '@beckn-ui/molecules'
+import { useRouter } from 'next/router'
+import { useLanguage } from '@hooks/useLanguage'
+import { ParsedItemModel } from '../../types/search.types'
+
+interface Props {
+ product: ParsedItemModel
+}
+
+// TODO :- remove the static value and add dynamic value for the description
+
+const ProductDetails: React.FC = ({ product }) => {
+ const router = useRouter()
+ const { t } = useLanguage()
+ return (
+
+
+
+
+
+
+ {product.item.short_desc}
+
+
+
+
+ {product.rating ? `${parseFloat(product.rating)} stars` : null}
+
+
+
+ {
+ router.push('/assemblyDetails')
+ }}
+ >
+
+
+
+
+
+ )
+}
+
+export default ProductDetails
diff --git a/apps/tourism/components/productList/ProductList.tsx b/apps/tourism/components/productList/ProductList.tsx
new file mode 100644
index 000000000..df60c7d22
--- /dev/null
+++ b/apps/tourism/components/productList/ProductList.tsx
@@ -0,0 +1,68 @@
+import React, { useEffect, useState } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+import Card from '../UI/card/Card'
+import { useDispatch, useSelector } from 'react-redux'
+import { SortedProductsListActions } from '../../store/sortedProductList-slice'
+import { IProductListRootState } from '../../lib/types/productList'
+import { ParsedScholarshipData } from './ProductList.utils'
+import { Box, Flex, Grid, Text } from '@chakra-ui/react'
+
+interface Props {
+ productList: ParsedScholarshipData[]
+}
+const ProductList: React.FC = ({ productList }) => {
+ const { t } = useLanguage()
+
+ const [selectedRadioBtn, setSelectedRadioBtn] = useState('all')
+ const dispatch = useDispatch()
+
+ useEffect(() => {
+ dispatch(
+ SortedProductsListActions.sortProductsList({
+ productsList: productList,
+ sortBasedOn: selectedRadioBtn
+ })
+ )
+ }, [dispatch, productList, selectedRadioBtn])
+
+ const sortedProductList = useSelector((state: IProductListRootState) => state.sortedProductsList.productsList)
+
+ return (
+
+ {sortedProductList && sortedProductList.length ? (
+
+ {sortedProductList.map(product => {
+ return (
+
+ )
+ })}
+
+ ) : (
+ {t.noProduct}
+ )}
+
+ )
+}
+
+export default ProductList
diff --git a/apps/tourism/components/productList/Sort.tsx b/apps/tourism/components/productList/Sort.tsx
new file mode 100644
index 000000000..28975e063
--- /dev/null
+++ b/apps/tourism/components/productList/Sort.tsx
@@ -0,0 +1,99 @@
+import React, { ChangeEvent } from 'react'
+import { useLanguage } from '../../hooks/useLanguage'
+import { BsFilterLeft, BsArrowDown } from 'react-icons/bs'
+import { radioBtnValue } from '../../mock/sortRadioInput'
+import { Box } from '@chakra-ui/react'
+
+interface Props {
+ selectedBtn: string
+ onChangeSelectedBtn: (e: ChangeEvent) => void
+}
+const Sort: React.FC = ({ selectedBtn: selectedRadioBtn, onChangeSelectedBtn }) => {
+ const { t } = useLanguage()
+
+ const isRadioSelected = (value: string): boolean => (value === selectedRadioBtn ? true : false)
+
+ return (
+
+
+
+
+
+ {radioBtnValue.map(radioInput => {
+ return (
+
+
+ {t[radioInput]}
+
+
+
+ )
+ })}
+
+
+
+ )
+}
+
+export default Sort
diff --git a/apps/tourism/components/productList/SubmenuCategory.tsx b/apps/tourism/components/productList/SubmenuCategory.tsx
new file mode 100644
index 000000000..c9291d557
--- /dev/null
+++ b/apps/tourism/components/productList/SubmenuCategory.tsx
@@ -0,0 +1,47 @@
+import React from 'react'
+import { useRouter } from 'next/router'
+import { useLanguage } from '../../hooks/useLanguage'
+import menuItems from '../../mock/menuItems'
+import { useWindowDimensions } from '../../hooks/useWindowDimensions'
+
+const SubmenuCategory = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ const { width } = useWindowDimensions()
+ const iconFontSize = width <= 768 ? '1.5rem' : '2.5rem'
+ const category = router.query.category
+ const selectedCategory = menuItems.filter(item => item.category === category)
+ const subCategories = selectedCategory[0]?.productsGroup?.map(item => ({
+ title: item.title,
+ icon: item.icon
+ }))
+ function onClickHandler(subCategory: string) {
+ if (selectedCategory[0].category) {
+ router.push(`/${selectedCategory[0].category}/${subCategory}`)
+ }
+ }
+
+ return subCategories ? (
+
+
{t.categories}
+
+ {subCategories?.map(subCategory => (
+
onClickHandler(subCategory.title)}
+ >
+
+
{t[subCategory.title]}
+
+ ))}
+
+
+ ) : null
+}
+
+export default SubmenuCategory
diff --git a/apps/tourism/components/qrCode/QrCode.module.css b/apps/tourism/components/qrCode/QrCode.module.css
new file mode 100644
index 000000000..114246322
--- /dev/null
+++ b/apps/tourism/components/qrCode/QrCode.module.css
@@ -0,0 +1,3 @@
+.qrCode_tourism canvas {
+ margin: 0 auto;
+}
diff --git a/apps/tourism/components/qrCode/Qrcode.tsx b/apps/tourism/components/qrCode/Qrcode.tsx
new file mode 100644
index 000000000..a881d087b
--- /dev/null
+++ b/apps/tourism/components/qrCode/Qrcode.tsx
@@ -0,0 +1,18 @@
+import { QRCodeCanvas } from 'qrcode.react'
+import React from 'react'
+import { Box } from '@chakra-ui/react'
+import Style from './QrCode.module.css'
+
+interface QrCodePropsModel {
+ value: string
+}
+
+const Qrcode = ({ value }: QrCodePropsModel) => {
+ return (
+
+
+
+ )
+}
+
+export default Qrcode
diff --git a/apps/tourism/components/starRating/StarRating.tsx b/apps/tourism/components/starRating/StarRating.tsx
new file mode 100644
index 000000000..fd5540fa2
--- /dev/null
+++ b/apps/tourism/components/starRating/StarRating.tsx
@@ -0,0 +1,58 @@
+import { Box, Text } from '@chakra-ui/react'
+import React, { useState } from 'react'
+import { FaStar } from 'react-icons/fa'
+
+export interface StarRatingProps {
+ rating: number
+ setRating: (rating: number) => void
+ count?: number
+ size?: number
+ transition: string
+ ratingText: string
+}
+
+const StarRating: React.FC = props => {
+ const [hover, setHover] = useState(null)
+
+ return (
+
+
+ {props.ratingText}
+
+
+ {[...Array(props.count || 5)].map((star, index) => {
+ const ratingValue = index + 1
+ return (
+ setHover(ratingValue)}
+ onMouseLeave={() => setHover(null)}
+ >
+ props.setRating(ratingValue)}
+ value={ratingValue}
+ style={{
+ display: 'none'
+ }}
+ />
+
+
+ )
+ })}
+
+
+ )
+}
+export default StarRating
diff --git a/apps/tourism/components/topSheet/TopSheet.module.css b/apps/tourism/components/topSheet/TopSheet.module.css
new file mode 100644
index 000000000..e6a730287
--- /dev/null
+++ b/apps/tourism/components/topSheet/TopSheet.module.css
@@ -0,0 +1,17 @@
+.TopSheet ::before {
+ content: '';
+ border-left: 18px solid transparent;
+ border-right: 18px solid transparent;
+}
+
+.searchTopSheetMargin {
+ margin-left: -20px;
+ margin-right: -20px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ justify-content: space-between;
+ background-color: #ffffff;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+ height: 60px;
+}
diff --git a/apps/tourism/components/topSheet/TopSheet.tsx b/apps/tourism/components/topSheet/TopSheet.tsx
new file mode 100644
index 000000000..bcc52fa7f
--- /dev/null
+++ b/apps/tourism/components/topSheet/TopSheet.tsx
@@ -0,0 +1,179 @@
+/* eslint-disable jsx-a11y/alt-text */
+import React from 'react'
+import {
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ useDisclosure,
+ Box,
+ Image,
+ Text,
+ Flex,
+ ChakraProvider,
+ Input,
+ useTheme,
+ Skeleton
+} from '@chakra-ui/react'
+import style from './TopSheet.module.css'
+import { useLanguage } from '../../hooks/useLanguage'
+import { useDispatch, useSelector } from 'react-redux'
+import { IGeoLocationSearchPageRootState } from '../../lib/types/geoLocationSearchPage'
+import { toggleLocationSearchPageVisibility } from '../../store/geoMapLocationSearch-slice'
+import { MdMyLocation } from 'react-icons/md'
+import { BiSolidUpArrow } from 'react-icons/bi'
+import { useRouter } from 'next/router'
+
+interface TopSheetPropsModel {
+ currentAddress: string
+ loadingForCurrentAddress?: boolean
+ currentLocationFetchError?: string
+}
+
+const TopSheet: React.FC = props => {
+ const { currentAddress, currentLocationFetchError, loadingForCurrentAddress } = props
+ const theme = useTheme()
+ const router = useRouter()
+ const { isOpen, onOpen, onClose } = useDisclosure()
+ const { t } = useLanguage()
+ const dispatch = useDispatch()
+ const bgColorOfSearchIcon = theme.colors.primary['100']
+ const isSearchPage = router.pathname === '/search'
+
+ const geoLocationSearchPageSelectedAddress = useSelector((state: IGeoLocationSearchPageRootState) => {
+ return state.geoLocationSearchPageUI.geoAddress
+ })
+
+ const onFocusChange = () => {
+ dispatch(toggleLocationSearchPageVisibility(true))
+ }
+
+ const renderAddresstext = currentLocationFetchError || geoLocationSearchPageSelectedAddress || currentAddress || ''
+
+ return (
+
+
+
+
+
+
+
+
+ {t.yourLocation}
+
+
+ {loadingForCurrentAddress ? (
+
+ ) : (
+ <>
+
+ {renderAddresstext}
+
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t.devicelocationisnotenabled}
+
+ {t.accessToProvideLocation}
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default TopSheet
diff --git a/apps/tourism/garudaa-1.0.0.tgz b/apps/tourism/garudaa-1.0.0.tgz
new file mode 100644
index 000000000..6c88662ed
Binary files /dev/null and b/apps/tourism/garudaa-1.0.0.tgz differ
diff --git a/apps/tourism/global.d.ts b/apps/tourism/global.d.ts
new file mode 100644
index 000000000..ba29177a1
--- /dev/null
+++ b/apps/tourism/global.d.ts
@@ -0,0 +1,5 @@
+interface Date {
+ addDays: (days: number) => Date
+}
+
+//to fix error that when I want to add function (addDays) to Date.prototype, happen.
diff --git a/apps/tourism/hooks/useLanguage.tsx b/apps/tourism/hooks/useLanguage.tsx
new file mode 100644
index 000000000..f30556c73
--- /dev/null
+++ b/apps/tourism/hooks/useLanguage.tsx
@@ -0,0 +1,9 @@
+import { useRouter } from 'next/router'
+import en from '../locales/en'
+import fa from '../locales/fa'
+
+export const useLanguage = () => {
+ const { locale } = useRouter()
+ const t = locale === 'en' ? en : fa
+ return { t, locale }
+}
diff --git a/apps/tourism/lib/types/geoLocationSearchPage.ts b/apps/tourism/lib/types/geoLocationSearchPage.ts
new file mode 100644
index 000000000..df1862447
--- /dev/null
+++ b/apps/tourism/lib/types/geoLocationSearchPage.ts
@@ -0,0 +1,9 @@
+export interface IGeoLocationSearchPage {
+ geoLocationSearchPageVisible: boolean
+ geoAddress: string
+ geoLatLong: string
+}
+
+export interface IGeoLocationSearchPageRootState {
+ geoLocationSearchPageUI: IGeoLocationSearchPage
+}
diff --git a/apps/tourism/lib/types/products.ts b/apps/tourism/lib/types/products.ts
new file mode 100644
index 000000000..510cfe5e5
--- /dev/null
+++ b/apps/tourism/lib/types/products.ts
@@ -0,0 +1,101 @@
+export interface IProductDetails {
+ processor?: string
+ screen?: string
+ operating_system?: string
+ ram?: string
+ ssd?: string
+ ports?: string
+ graphic?: string
+ warranty?: string
+ back_camera?: string
+ front_camera?: string
+ battery?: string
+ frequency_response?: string
+ microphone?: boolean
+ wireless?: boolean
+ wireless_standby_time?: boolean
+ connectionType?: string[]
+ connectors?: string[]
+ bluetooth?: boolean
+ noise_cancelling?: boolean
+ sound_isolating?: boolean
+}
+
+export type TSlug = {
+ _type: string
+ current: string
+}
+
+export type TImage = {
+ _key: string
+ _type: 'image'
+ asset: {
+ _ref: string
+ _type: 'reference'
+ }
+}
+
+export interface IProduct {
+ image: any
+ name: string
+ slug: TSlug
+ price: number
+ discount?: number
+ details?: IProductDetails[]
+ brand: string
+ category: string[]
+ isOffer?: boolean
+ registerDate?: string
+ timeStamp?: number
+ starRating: number
+}
+
+/**
+ * New types for the retail
+ */
+
+export interface RetailItem {
+ extended_attributes?: any
+ price: {
+ listed_value?: string
+ currency?: string
+ value: string
+ }
+ matched?: boolean
+ id: string
+ descriptor: {
+ images: string[]
+ name: string
+ short_desc: string
+ long_desc: string
+ }
+ location_id?: string
+ recommended?: boolean
+ tags: {
+ fulfillment_start_loc?: string
+ Category?: string
+ Trekking?: string
+ Himalayas?: string
+ fulfillment_end_time?: string
+ Country?: string
+ Ladakh?: string
+ Treks?: string
+ Package?: string
+ Leh?: string
+ fulfillment_end_loc?: string
+ authorName: string
+ rating: string
+ foodType?: string
+ }
+}
+
+export interface SanitizedProduct {
+ productName: string
+ productImage: string
+ productDescription: string
+}
+
+export interface IProductRootState {
+ product: RetailItem
+ encodedProduct: string
+}
diff --git a/apps/tourism/lib/types/search.ts b/apps/tourism/lib/types/search.ts
new file mode 100644
index 000000000..fc0c8e241
--- /dev/null
+++ b/apps/tourism/lib/types/search.ts
@@ -0,0 +1,4 @@
+export interface SearchBarPropsModel {
+ searchString: string | string[] | undefined
+ handleChange: Function
+}
diff --git a/apps/tourism/locales/en.ts b/apps/tourism/locales/en.ts
new file mode 100644
index 000000000..b6bd745cd
--- /dev/null
+++ b/apps/tourism/locales/en.ts
@@ -0,0 +1,110 @@
+const en: { [key: string]: string } = {
+ name: 'Name',
+ fullName: 'Enter Your Full Name',
+ password: 'Password',
+ enterPassword: 'Enter Password',
+ email: 'Email',
+ enterEmailID: 'Enter Email ID',
+ signIn: 'Sign In',
+ signUp: 'Sign Up',
+ enterMobileNumber: 'Enter Mobile Number',
+ enterYourUserName: 'Please Enter Your UserName',
+ enterYourPassword: 'Please Enter Your Password',
+ enterYourEmail: 'Please Enter Your Email',
+ doHaveAnAccount: "Don't You Have An Account? ",
+ alreadyHaveAnAccount: 'Already You Have An Account? ',
+ Invalid_email_or_password: 'Invalid email or password',
+ Email_already_exists: 'Email already exists',
+ errorNumber: 'Mobile Number is required',
+ errorNumber2: 'Invalid Mobile Number',
+ errorPassword: 'Password is required',
+ errorPassword2: 'Password must be at least 8 characters long',
+ errorPassword3: 'Password must contain at least one uppercase letter',
+ errorPassword4: 'Password must contain at least one special character',
+ errorPassword5: 'Password cannot consist of only digits',
+ errorPassword6: 'Password must contain at least one digit',
+ errorEmail: 'Invalid Email',
+ errorName: 'Name is required',
+ errorName2: 'Name can only contain letters and spaces',
+ errorName3: 'Name must contain at least 3 characters',
+ searchforService: 'search for service',
+ homePara: 'To proceed with creating your workflow, please set your location and search for services.',
+ footerText: 'Powered by',
+ yourLocation: 'Select location',
+ devicelocationisnotenabled: ' Device location is not enabled',
+ accessToProvideLocation: ' Please provide the permission to access better & hassle free services',
+ enableLocation: ' Enable Location',
+ or: ' Or',
+ searchforlocation: 'Search For Location',
+ search: 'Search',
+ viewDetails: 'View Details',
+ book: 'Book',
+ orderSuccesfully: 'The order has been placed successfully.',
+ orderPlaced: ' Order Placed',
+ currencySymbol: '€',
+ orderOverview: 'Order Overview',
+ assembly: 'Assembly',
+ shipping: 'Shipping',
+ billing: 'Billing',
+ addBillingDetails: 'Add Billing Details',
+ addShippingDetails: 'Add Shipping Details',
+ overviewofBillingDetails: 'Overview of Billing Details',
+ completed: 'Completed',
+ pending: 'Pending',
+ progressSummary: 'Progress Summary',
+ cards: 'Credit & Debit cards',
+ addCard: 'Add',
+ upi: 'UPI',
+ other: 'Other',
+ confirmOrder: 'Confirm Order',
+ phonePay: 'PhonePe UPI',
+ cashOnDelivery: 'Cash on Delivery',
+ netBanking: ' Net Banking',
+ orderHistory: 'Order History',
+ invoiceDetails: 'Invoice Details',
+ cardNumber: '**** **** **** 1234',
+ procced: 'Proceed',
+ clicktheShopbuttontobuyitemsforthistrip: 'Click ‘Proceed’ to continue',
+ toImportthisorderanotherapp: 'to Import this order another app',
+ scanthisQR: 'Scan this QR ',
+ scanQR: 'Scan QR',
+ openInWallet: 'Open in Wallet',
+ viewJSON: 'View JSON',
+ payment: 'Payment',
+ pleaseWait: 'Please wait!',
+ searchLoaderSubText: ' While we find service providers near you',
+ total: 'Total',
+ checkoutLoaderSubText: 'while we setup a form to understand your requirements',
+ confirmLoaderSubtext: 'while we confirm your order',
+ statusLoaderSubText: 'while we update the current status of your order.',
+ emptyOrderHistoryText: 'This space appears quite empty!',
+ noExistingWorkflowText: 'No existing workflows found; create a new workflow to proceed.',
+ allRequestFullfilled: 'All orders delivered!',
+ howTodo: 'How did we do?',
+ rateUs: 'Rate Us',
+ orderDeliveredOnTime: 'Order Delivered on Time!',
+ pleaseShareYourFeedback: 'Please share your feedback with us',
+ rateDeliveryExperience: 'Rate the overall experience',
+ addCommentsHere: 'Add your comments here',
+ writeExperience: 'Write about your experience..',
+ shippingDetails: 'Shipping Details',
+ orderCancellation: 'Order Cancellation',
+ pleaseSelectReason: 'Please select the reason for cancellation',
+ orderCancel: 'Order Cancelled!',
+ yourOrderHasBeencancel: 'Your order has been cancelled,',
+ ifYouPaid: 'If you have paid already, it will get ',
+ refundedSoon: 'refunded soon',
+ fetchingTrackLoaderSubtext: 'While we fetch for tracking and support details',
+ updateOrderLoaderSubText: 'While we update your Order',
+ rateOrderLoaderSubText: 'While we submit your feedback',
+ cancelLoaderSubText: 'While we process your request',
+ signInwithGoogle: 'Sign In with Google',
+ saveContinue: 'Save & Continue',
+ enterFlatDetails: 'Enter Flat, House no, Building , etc',
+ enterStreetDetails: 'Enter Area , Street , Sector, Village',
+ enterCity: 'Enter City /Town',
+ enterPincode: 'Enter Pincode',
+ enterState: 'Enter State / Province',
+ enterCountry: 'Enter Country'
+}
+export default en
diff --git a/apps/tourism/locales/fa.ts b/apps/tourism/locales/fa.ts
new file mode 100644
index 000000000..f7f764ef9
--- /dev/null
+++ b/apps/tourism/locales/fa.ts
@@ -0,0 +1,350 @@
+const fa: { [key: string]: string } = {
+ mainPage: 'Page principale de ZiShop',
+ search: 'Recherche',
+ login: 'Connexion',
+ logout: 'Se déconnecter',
+ favorites: 'Favoris',
+ delete: 'Supprimer',
+ thereAreNoFavorites: "actuellement, il n'y a pas d'articles favoris",
+ signIn: "S'identifier",
+ seeCart: 'Voir le panier',
+ product: 'Produit',
+ totalAmount: 'Montant total',
+ totalQuantity: 'Quantité totale',
+ payableAmount: 'Montant payable',
+ loginAndOrder: 'Se connecter et commander',
+ orderSummary: 'Récapitulatif de la commande',
+ cartIsEmpty: 'Le panier est vide',
+ categories: 'Catégories',
+ seeAllProduct: 'Voir tous les produits de cette catégorie',
+ offer: 'Offres et réductions',
+ bestSells: 'Les meilleures ventes',
+ mainMenu: 'Menu principal',
+ language: 'Langue: ',
+ fa: 'français - Fa',
+ en: 'Anglais - En',
+ theme: 'Thème: ',
+ dark: 'Sombre',
+ light: 'Lumière',
+ digital: 'Numérique',
+ laptop: 'Ordinateur portable et accessoires',
+ asus: 'Asus',
+ apple: 'Pomme',
+ dell: 'Dell',
+ lenovo: 'Lenovo',
+ samsung: 'Samsung',
+ hp: 'CV',
+ huawei: 'HUAWEI',
+ acer: 'Acer',
+ msi: 'MSI',
+ mobile: 'Mobile et Accessoires',
+ nokia: 'Nokia',
+ xiaomi: 'Xiaomi',
+ motorola: 'Motorola',
+ lg: 'LG',
+ sony: 'Sony',
+ computer: 'Ordinateur et Accessoires',
+ monitor: 'Moniteur',
+ mouse: 'Souris',
+ keyboard: 'Clavier',
+ hard: 'Disque dur, mémoire Flash et SSD',
+ other: 'Autre',
+ tablet: 'Tablette',
+ powerBank: "Banque d'alimentation",
+ speaker: 'Haut-parleur Bluetooth et fil',
+ headphones: 'Casque, casque et mains libres',
+ fashion: 'Mode et vêtements',
+ women: 'La mode des femmes',
+ dress: 'Robe',
+ skirt: 'Jupe',
+ jeans: 'jeans',
+ pants: 'Pantalon',
+ tShirt: 'T-shirt',
+ scarf: 'Foulard',
+ shirt: 'Chemise',
+ tie: 'Cravate',
+ overalls: 'Salopette',
+ mittens: 'Mitaines',
+ babyApron: 'Tablier bébé',
+ shoes: 'Chaussures',
+ watch: 'Montre',
+ wallet: 'Portefeuille',
+ hat: 'Chapeau',
+ belt: 'Ceinture',
+ men: 'La mode masculine',
+ child: 'Mode enfantine',
+ toys: 'Jouets et Bébé',
+ cosmetic: 'Cosmétique',
+ home: 'Meubles et cuisine',
+ stationery: 'Livres, Papeterie et Art',
+ noProduct: "Il n'y a pas encore de produits dans cette catégorie ! ",
+ digitalBT: 'Vivez les meilleures expériences',
+ digitalBD: 'Nous fournissons la meilleure expérience avec les marques les plus populaires. ',
+ stationeryBT: 'Variété de choix',
+ stationeryBD: "Quand il s'agit de Beauté et d'Efficacité. ",
+ toyBT: 'Divertissement et croissance de la créativité',
+ toyBD: 'Des produits de la meilleure qualité et anti-allergiques pour créer des moments heureux',
+ houseBT: 'Maison moderne',
+ houseBD:
+ 'profitez de beaux moments de satisfaction et de paix avec vos proches à la maison avec des produits conçus selon les styles les plus récents et les plus en vue.',
+ fashionBT: 'Beauté et confort',
+ fashionBD:
+ 'Vous trouverez les meilleurs tissus, les designs les plus en vogue et les marques les plus populaires à des prix raisonnables. ',
+ beautyBT: 'Accentue votre Beauté',
+ beautyBD: 'sans allergènes, les personnes de tous types de peau peuvent trouver les produits dont elles ont besoin. ',
+ deliver: 'livraison express',
+ cash: 'paiement sur place',
+ support: 'Assistance 24h/24 et 7j/7',
+ warrantyBenefit: "Garantir l'originalité",
+ return: 'garantie de remboursement des marchandises',
+ offers: 'Offres spéciales',
+ newest: 'Marchandises les plus récentes',
+ seeAll: 'Voir tout',
+ specialSale: 'Vente spéciale',
+ seeAllNewProducts: 'Voir tous les nouveaux produits',
+ digitalCategoryDescription: 'Nous offrons les produits les plus récents aux prix les plus compétitifs',
+ fashionCategoryDescription: 'Les marques les plus populaires avec les prix les plus raisonnables',
+ beautyCategoryDescription: 'Produits anti-allergiques adaptés à tous les types de peau de marques réputées',
+ sportCategoryDescription: 'Des produits de qualité et durables',
+ houseCategoryDescription: 'Conforme aux dessins du jour',
+ toyCategoryDescription: 'Une combinaison de divertissement et de créativité',
+ stationeryCategoryTitle: 'Livres, Papeterie et Art',
+ stationeryCategoryDescription: 'Variété de choix',
+ seeAllProducts: 'Voir tous les produits',
+ expireDiscount: 'La remise pour ce produit était Expire.',
+ days: 'Jours',
+ hours: 'Heures',
+ mins: 'Minutes',
+ seconds: 'Secondes',
+ larisaTitle: 'Meubles Larissa',
+ larisaDescription:
+ 'Le beau canapé Larissa avec son design privé peut donner une beauté unique à votre décoration de réception.',
+ byNow: 'Ajouter au panier',
+ see: 'Voir le produit',
+ romanoTitle: 'Meubles romans',
+ romanoDescription:
+ 'Le canapé Romano a une beauté impressionnante et peut multiplier le charme de la décoration de votre maison.',
+ popularBrands: 'Marques populaires',
+ zishopMap: 'Carte de Zishop',
+ aboutUs: 'À propos de nous',
+ contactUs: 'Contactez-nous',
+ saleInZishop: 'Vente à Zishop',
+ careerOpportunities: 'Opportunités de carrière',
+ customerServices: 'Service client',
+ commonQuestions: 'Questions courantes',
+ returnProcedures: 'Procédures de retour',
+ privacy: 'Confidentialité',
+ shoppingGuide: "Guide d'achat",
+ howToPlaceAnOrder: 'Comment passer une commande ?',
+ orderSubmissionProcedure: 'Procédure de soumission de commande',
+ paymentMethods: 'méthodes de payement',
+ beWithUs: 'Soyez avec nous!',
+ emailRegister: 'Restez au courant des dernières réductions en nous envoyant un e-mail',
+ yourEmail: 'Veuillez saisir votre e-mail',
+ register: 'Enregistrer',
+ copyRight: '© 2022 ZiShop. ',
+ sort: 'Trier en fonction de : ',
+ all: 'Tous',
+ newestProducts: 'Le plus récent',
+ cheapest: 'Le moins cher',
+ popular: 'Le plus populaire',
+ expensive: 'Le plus cher',
+ details: 'détails du produit',
+ back_camera: 'Caméra principale',
+ battery: 'Batterie',
+ front_camera: 'Caméra frontale',
+ operating_system: 'Système opérateur',
+ processor: 'CPU',
+ ram: 'RAM',
+ screen: 'Filtrer',
+ resolution: 'Résolution',
+ display_type: "Type d'affichage",
+ viewing_angle: 'Angle de vue',
+ response_time: 'Temps de réponse',
+ refresh_rate: 'Fréquence de rafraîchissement',
+ panel_technology: 'Technologie des panneaux',
+ input_output_types: "Types d'entrée/sortie",
+ true: 'Oui',
+ false: 'Non',
+ bluetooth: 'Bluetooth',
+ frequency_response: 'Fréquence de réponse',
+ sound_isolating: 'Isolation acoustique',
+ microphone: 'Microphone',
+ noise_cancelling: 'Suppression du bruit',
+ wireless: 'Sans fil',
+ wireless_standby_time: 'Autonomie de la batterie en mode veille',
+ connectionType: 'Type de connexion',
+ connectors: 'Connecteurs',
+ multimedia_keys: 'Touches multimédia',
+ number_of_buttons: 'Nombre de boutons (y compris la molette de défilement)',
+ width: 'Largeur',
+ height: 'Hauteur',
+ depth: 'Profondeur',
+ curved: 'Incurvé',
+ built_in_speakers: 'Haut-parleurs intégrés',
+ mechanical_keys: 'Clés mécaniques',
+ backlit_keys: 'Touches rétroéclairées',
+ ergonomic_design: 'Design ergonomique',
+ designed_for_gaming: 'Conçu pour les jeux',
+ graphic: 'Graphique',
+ ports: 'Ports',
+ ssd: 'Disque dur SSD',
+ warranty: 'garantie',
+ addToCart: 'AJOUTER AU PANIER',
+ stars: 'Étoile',
+ price: 'Prix du produit',
+ similarProducts: 'Vous etes peut etre intéressé',
+ cart: 'Panier',
+ hi: 'Salut!',
+ loginExplanation:
+ 'En plus de vous inscrire, vous pouvez également tester le modèle avec les informations du compte de test (e-mail : test@info.com - Mot de passe : 123456)',
+ testAccount: "compte d'essai",
+ userName: "Nom d'utilisateur",
+ password: 'Mot de passe',
+ email: 'E-mail',
+ enterYourUserName: "S'il vous plaît entrez votre nom d'utilisateur",
+ enterYourPassword: "S'il vous plait entrez votre mot de passe",
+ enterYourEmail: 'Veuillez saisir votre e-mail',
+ doHaveAnAccount: "Vous n'avez pas de compte ? ",
+ alreadyHaveAnAccount: 'Vous avez déjà un compte ? ',
+ signUp: "S'inscrire",
+ Invalid_email_or_password: 'email ou mot de passe invalide',
+ Email_already_exists: "l'email existe déjà",
+ aboutLongText:
+ 'Le modèle de magasin ZShop a été écrit pour consolider mes connaissances frontales, en utilisant des technologies telles que Nextjs, Typescript, React, Tailwindcss, etc. en tant que portefeuille. ',
+ aboutEnjoy: "J'espère que vous apprécierez regarder et travailler avec ce modèle.",
+ myName: 'Kehyshow',
+ cafeDX: "Le travail a pour but d'améliorer la vie, et non l'inverse.",
+ productAddedToCartMsg: 'Produit ajouté au panier avec succès',
+ BrowseByCategory: 'Parcourir par catégorie',
+ meatAndFish: 'Viande',
+ fruitsVegetablesTitle: 'Fruits et légumes',
+ frozenFood: 'Des surgelés',
+ beverages: 'Breuvages',
+ snacks: 'Collations',
+ dairy: 'Laitier',
+ cashOnDelivery: 'Paiement à la réception',
+ selectPaymentMethod: 'Sélectionnez le mode de paiement',
+ orderDetails: 'Détails de la commande',
+ trackOrder: 'Suivi de commande',
+ proceedToPay: 'Procéder au paiement',
+ backToHome: 'Retournez à la maison',
+ contactSupport: 'Contactez le support',
+ orderDeliveredOnTime: 'Commande livrée à temps !',
+ shareYourfeedback: "S'il vous plaît partagez vos commentaires avec nous",
+ submitReview: 'Poster le commentaire',
+ skipForNow: 'Passer pour le moment',
+ orderConfirmed: 'Commande confirmée',
+ orderConfirmedMssg: 'ABC Mart a confirmé votre commande',
+ orderConfirmedTime: '10h13',
+ agentAssigned: "Un livreur s'occupe de vous",
+ agentAssignedMssg: 'Steve notre transporteur est au magasin pour récupérer votre commande.',
+ agentAssignedTime: '10h35',
+ OFD: 'En cours de livraison',
+ OFDMssg: 'La commande a été récupérée ! ',
+ orderDeliveredMssg: 'La commande a été retirée ! Notre transporteur est en chemin pour vous livrer',
+ orderDeliveredTime: '12h23',
+ checkout: 'Vérifier',
+ items: 'Articles',
+ shipping: 'Expédition',
+ billing: 'Facturation',
+ changeText: 'Changer',
+ paymentText: 'Paiement',
+ orderDetailsCheckboxText: "Identique aux détails d'expédition",
+ subtotalText: 'Total',
+ deliveryChargesText: 'Frais de livraison',
+ totalText: 'Total',
+ orderpolicyText: 'Politique de commande',
+ orderPolicyText:
+ "Dans l'édition et la conception graphique, Lorem ipsum est un texte d'espace réservé couramment utilisé pour démontrer la forme visuelle d'un document ou d'une police de caractères sans s'appuyer sur Dans l'édition et la conception graphique, Lorem ipsum est un texte d'espace réservé couramment utilisé pour démontrer la forme visuelle d'un document ",
+ readMoreText: 'En savoir plus',
+ readLessText: 'Lire moins',
+ addShippingdetailsBtnText: 'Ajouter les détails de livraison',
+ orderHistory: 'Historique des commandes',
+ bottomModalTitle: 'Recherche',
+ optionRestaurants: 'Restaurants',
+ optionRestaurant: 'Restaurant',
+ restaurants: 'Restaurants à',
+ optionStores: 'Commerces',
+ optionHotels: 'Hôtels',
+ optionBooks: 'Librairies',
+ categoryLoadPrimary: "S'il vous plaît, attendez!",
+ categoryLoadSecondary: 'Récupération du catalogue du magasin à partir du réseau',
+ shopButton: 'magasiner',
+ summary: 'Summary',
+ fulfillment: 'Fulfillment ',
+ order: 'Commande',
+ localStores: 'Commerces de proximité',
+ cartLoader: 'Obtention des devis',
+ initializingOrderLoader: 'Veuillez patienter pendant que nous préparons les choses pour vous',
+ confirmingOrderLoader: 'Veuillez patienter pendant que nous confirmons votre commande',
+ orderConfirm: 'Commande confirmée!',
+ confirmOrderMessage: 'Merci ! Notre agent de livraison vous livrera votre commande.',
+ currencySymbol: '€',
+ saveShippingDetails: "Enregistrer l'expédition détails",
+ saveBillingDetails: 'Enregistrer les détails de facturation',
+ addBillingDetails: 'Ajouter les détails de facturation',
+ comingSoon: 'À venir !',
+ proceedToCheckout: 'Vérifier',
+ confirmOrder: 'Confirmer la commande',
+ orderPlacedAt: 'Passée à ',
+ ordersFulfilled: 'Commande honorée',
+ subTotal: 'Sous-total',
+ deliveryCharge: 'Frais de livraison',
+ total: 'Total',
+ status: 'Statut',
+ paymentMethod: 'Méthode de paiement',
+ explorePlaces: 'Explorer les lieux à proximité',
+ cards: 'Cartes bancaires',
+ addCard: 'Ajouter',
+ orderPlaced: 'commande passée',
+ inStoreShopping: 'Achats en magasin',
+ delivery: 'Livraison',
+ clickAndCollect: 'Click & Collect',
+ dineIn: 'Service sur place',
+ takeAway: 'À emporte',
+ bookstore: 'Librairie',
+ formName: 'Nom',
+ formNumber: 'Numéro de téléphone portable',
+ formEmail: 'Adresse e-mail',
+ formAddress: 'Adresse complète',
+ formZipCode: 'Code Interphone',
+ errorName: 'Le nom est requis',
+ errorNumber: 'Le numéro de téléphone portable est requis',
+ errorNumber2: 'Numéro de téléphone portable invalide',
+ errorNumber3: 'Le numéro de téléphone portable doit comporter 10 chiffres',
+ errorEmail: "L'e-mail est requis",
+ errorEmail2: 'Adresse e-mail invalide',
+ errorAddress: "L'adresse complète est requise",
+ errorZipcode: 'Le code interphone est requis',
+ errorZipcode2: 'Code nterphone invalide',
+ confirmMessage1: 'Merci ! Notre commande sera',
+ confirmMessage2: 'confirmée sous peu',
+ sendOtpButton: 'Envoyer',
+ verifyMobile: 'Vérifier le numéro de téléphone',
+ otpMessage1: 'Un code a été envoyé à votre téléphone',
+ otpMessage2: 'se termine par',
+ otpPlaceholder: 'Entrez le code ici',
+ loginButton: 'Se connecter',
+ errorOtp1: 'Code requis',
+ errorOtp2: 'Code invalide',
+ catalogLoader: 'Veuillez patienter !',
+ catalogSubLoader: 'Récupération du catalogue du magasin depuis le réseau',
+ quoteRequestLoader: "S'il vous plaît, attendez! Votre commande est en cours de traitement",
+ estimatedDelivery: 'Délai de livraison estimé au ',
+ orderId: 'De la livraison',
+ pending: 'En attente',
+ confirmed: 'Confirmé',
+ delivered: 'Livrée',
+ confirmationPending: 'Confirmation en attente',
+ itemsConfirmed: 'Articles confirmés',
+ orderPacked: 'Commande emballée',
+ outForDelivery: 'Prêt pour la livraison',
+ orderDelivered: 'Commande livrée',
+ rateStore: 'Évaluer le magasin',
+ rateDeliveryExperience: "Évaluer l'expérience de livraison",
+ addCommentsHere: 'Ajoutez vos commentaires ici',
+ writeExperience: 'Décrivez votre expérience..',
+ completed: 'Complété'
+}
+export default fa
diff --git a/apps/tourism/next-env.d.ts b/apps/tourism/next-env.d.ts
new file mode 100644
index 000000000..4f11a03dc
--- /dev/null
+++ b/apps/tourism/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/apps/tourism/next-sitemap.config.js b/apps/tourism/next-sitemap.config.js
new file mode 100644
index 000000000..75460e752
--- /dev/null
+++ b/apps/tourism/next-sitemap.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next-sitemap').IConfig} */
+
+module.exports = {
+ siteUrl: process.env.SITE_URL,
+ generateRobotsTxt: true
+}
diff --git a/apps/tourism/next.config.js b/apps/tourism/next.config.js
new file mode 100644
index 000000000..65ff33546
--- /dev/null
+++ b/apps/tourism/next.config.js
@@ -0,0 +1,48 @@
+/** @type {import('next').NextConfig} */
+
+const nextConfig = {
+ reactStrictMode: false,
+ transpilePackages: ['@beckn-ui/molecules', '@beckn-ui/becknified-components'],
+ i18n: {
+ locales: ['en', 'fa'],
+ defaultLocale: 'en',
+ localeDetection: false
+ },
+ images: {
+ domains: [
+ 'cdn.sanity.io',
+ 'bazaar.becknprotocol.io',
+ 'mandi.succinct.in',
+ 'market.becknprotocol.io',
+ 'retail-osm-stage.becknprotocol.io',
+ 'retail-osm-prod.becknprotocol.io'
+ ]
+ },
+ eslint: {
+ // Warning: This allows production builds to successfully complete even if
+ // your project has ESLint errors.
+ ignoreDuringBuilds: true
+ },
+ typescript: {
+ // !! WARN !!
+ // Dangerously allow production builds to successfully complete even if
+ // your project has type errors.
+ // !! WARN !!
+ ignoreBuildErrors: true
+ },
+ webpack: function (config) {
+ config.module.rules.push({
+ test: /\.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
+ use: {
+ loader: 'url-loader',
+ options: {
+ limit: 100000,
+ name: '[name].[ext]'
+ }
+ }
+ })
+ return config
+ }
+}
+
+module.exports = nextConfig
diff --git a/apps/tourism/npm b/apps/tourism/npm
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/tourism/package-lock.json b/apps/tourism/package-lock.json
new file mode 100644
index 000000000..995e2715f
--- /dev/null
+++ b/apps/tourism/package-lock.json
@@ -0,0 +1,5794 @@
+{
+ "name": "online-shop",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "requires": {
+ "@babel/highlight": "^7.22.5"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ=="
+ },
+ "@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz",
+ "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.5.tgz",
+ "integrity": "sha512-TNPDN6aBFaUox2Lu+H/Y1dKKQgr4ucz/FGyCz67RVYLsBpVpUFf1dDngzg+Od8aqbrqwyztkaZjtWCZEUOT8zA==",
+ "dev": true,
+ "requires": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/types": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@chakra-ui/accordion": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.2.0.tgz",
+ "integrity": "sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==",
+ "requires": {
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16"
+ }
+ },
+ "@chakra-ui/alert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz",
+ "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/spinner": "2.0.13"
+ }
+ },
+ "@chakra-ui/anatomy": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz",
+ "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ=="
+ },
+ "@chakra-ui/avatar": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.11.tgz",
+ "integrity": "sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==",
+ "requires": {
+ "@chakra-ui/image": "2.0.16",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/breadcrumb": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz",
+ "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==",
+ "requires": {
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/breakpoint-utils": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz",
+ "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/button": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz",
+ "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/spinner": "2.0.13"
+ }
+ },
+ "@chakra-ui/card": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz",
+ "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/checkbox": {
+ "version": "2.2.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.15.tgz",
+ "integrity": "sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/visually-hidden": "2.0.15",
+ "@zag-js/focus-visible": "0.2.2"
+ }
+ },
+ "@chakra-ui/clickable": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz",
+ "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==",
+ "requires": {
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/close-button": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz",
+ "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16"
+ }
+ },
+ "@chakra-ui/color-mode": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz",
+ "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/control-box": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz",
+ "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A=="
+ },
+ "@chakra-ui/counter": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz",
+ "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==",
+ "requires": {
+ "@chakra-ui/number-utils": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/css-reset": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.2.tgz",
+ "integrity": "sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A=="
+ },
+ "@chakra-ui/descendant": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz",
+ "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7"
+ }
+ },
+ "@chakra-ui/dom-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz",
+ "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ=="
+ },
+ "@chakra-ui/editable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.0.0.tgz",
+ "integrity": "sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/event-utils": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz",
+ "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw=="
+ },
+ "@chakra-ui/focus-lock": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.17.tgz",
+ "integrity": "sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "react-focus-lock": "^2.9.4"
+ }
+ },
+ "@chakra-ui/form-control": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz",
+ "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/hooks": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.0.tgz",
+ "integrity": "sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==",
+ "requires": {
+ "@chakra-ui/react-utils": "2.0.12",
+ "@chakra-ui/utils": "2.0.15",
+ "compute-scroll-into-view": "1.0.20",
+ "copy-to-clipboard": "3.3.3"
+ }
+ },
+ "@chakra-ui/icon": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz",
+ "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/icons": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.0.19.tgz",
+ "integrity": "sha512-0A6U1ZBZhLIxh3QgdjuvIEhAZi3B9v8g6Qvlfa3mu6vSnXQn2CHBZXmJwxpXxO40NK/2gj/gKXrLeUaFR6H/Qw==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16"
+ }
+ },
+ "@chakra-ui/image": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.16.tgz",
+ "integrity": "sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/input": {
+ "version": "2.0.22",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.22.tgz",
+ "integrity": "sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/layout": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.2.0.tgz",
+ "integrity": "sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==",
+ "requires": {
+ "@chakra-ui/breakpoint-utils": "2.0.8",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/lazy-utils": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz",
+ "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg=="
+ },
+ "@chakra-ui/live-region": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz",
+ "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ=="
+ },
+ "@chakra-ui/media-query": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz",
+ "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==",
+ "requires": {
+ "@chakra-ui/breakpoint-utils": "2.0.8",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/menu": {
+ "version": "2.1.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.15.tgz",
+ "integrity": "sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==",
+ "requires": {
+ "@chakra-ui/clickable": "2.0.14",
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-animation-state": "2.0.9",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-focus-effect": "2.0.11",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-outside-click": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16"
+ }
+ },
+ "@chakra-ui/modal": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.12.tgz",
+ "integrity": "sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==",
+ "requires": {
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/focus-lock": "2.0.17",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/transition": "2.0.16",
+ "aria-hidden": "^1.2.2",
+ "react-remove-scroll": "^2.5.5"
+ }
+ },
+ "@chakra-ui/number-input": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz",
+ "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==",
+ "requires": {
+ "@chakra-ui/counter": "2.0.14",
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-interval": "2.0.5",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/number-utils": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz",
+ "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg=="
+ },
+ "@chakra-ui/object-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz",
+ "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ=="
+ },
+ "@chakra-ui/pin-input": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz",
+ "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==",
+ "requires": {
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/popover": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.12.tgz",
+ "integrity": "sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==",
+ "requires": {
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-animation-state": "2.0.9",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-focus-effect": "2.0.11",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/popper": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.14.tgz",
+ "integrity": "sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==",
+ "requires": {
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@popperjs/core": "^2.9.3"
+ }
+ },
+ "@chakra-ui/portal": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz",
+ "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/progress": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz",
+ "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8"
+ }
+ },
+ "@chakra-ui/provider": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.3.0.tgz",
+ "integrity": "sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==",
+ "requires": {
+ "@chakra-ui/css-reset": "2.1.2",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/system": "2.5.8",
+ "@chakra-ui/utils": "2.0.15"
+ }
+ },
+ "@chakra-ui/radio": {
+ "version": "2.0.22",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz",
+ "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@zag-js/focus-visible": "0.2.2"
+ }
+ },
+ "@chakra-ui/react": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.7.1.tgz",
+ "integrity": "sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==",
+ "requires": {
+ "@chakra-ui/accordion": "2.2.0",
+ "@chakra-ui/alert": "2.1.0",
+ "@chakra-ui/avatar": "2.2.11",
+ "@chakra-ui/breadcrumb": "2.1.5",
+ "@chakra-ui/button": "2.0.18",
+ "@chakra-ui/card": "2.1.6",
+ "@chakra-ui/checkbox": "2.2.15",
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/control-box": "2.0.13",
+ "@chakra-ui/counter": "2.0.14",
+ "@chakra-ui/css-reset": "2.1.2",
+ "@chakra-ui/editable": "3.0.0",
+ "@chakra-ui/focus-lock": "2.0.17",
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/hooks": "2.2.0",
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/image": "2.0.16",
+ "@chakra-ui/input": "2.0.22",
+ "@chakra-ui/layout": "2.2.0",
+ "@chakra-ui/live-region": "2.0.13",
+ "@chakra-ui/media-query": "3.2.12",
+ "@chakra-ui/menu": "2.1.15",
+ "@chakra-ui/modal": "2.2.12",
+ "@chakra-ui/number-input": "2.0.19",
+ "@chakra-ui/pin-input": "2.0.20",
+ "@chakra-ui/popover": "2.1.12",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/progress": "2.1.6",
+ "@chakra-ui/provider": "2.3.0",
+ "@chakra-ui/radio": "2.0.22",
+ "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/select": "2.0.19",
+ "@chakra-ui/skeleton": "2.0.24",
+ "@chakra-ui/skip-nav": "2.0.15",
+ "@chakra-ui/slider": "2.0.25",
+ "@chakra-ui/spinner": "2.0.13",
+ "@chakra-ui/stat": "2.0.18",
+ "@chakra-ui/stepper": "2.2.0",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/switch": "2.0.27",
+ "@chakra-ui/system": "2.5.8",
+ "@chakra-ui/table": "2.0.17",
+ "@chakra-ui/tabs": "2.1.9",
+ "@chakra-ui/tag": "3.0.0",
+ "@chakra-ui/textarea": "2.0.19",
+ "@chakra-ui/theme": "3.1.2",
+ "@chakra-ui/theme-utils": "2.0.18",
+ "@chakra-ui/toast": "6.1.4",
+ "@chakra-ui/tooltip": "2.2.9",
+ "@chakra-ui/transition": "2.0.16",
+ "@chakra-ui/utils": "2.0.15",
+ "@chakra-ui/visually-hidden": "2.0.15"
+ }
+ },
+ "@chakra-ui/react-children-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz",
+ "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA=="
+ },
+ "@chakra-ui/react-context": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz",
+ "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A=="
+ },
+ "@chakra-ui/react-env": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz",
+ "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==",
+ "requires": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ }
+ },
+ "@chakra-ui/react-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz",
+ "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ=="
+ },
+ "@chakra-ui/react-use-animation-state": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.9.tgz",
+ "integrity": "sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-callback-ref": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz",
+ "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw=="
+ },
+ "@chakra-ui/react-use-controllable-state": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz",
+ "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-disclosure": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz",
+ "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-event-listener": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz",
+ "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-focus-effect": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.11.tgz",
+ "integrity": "sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-focus-on-pointer-down": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz",
+ "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==",
+ "requires": {
+ "@chakra-ui/react-use-event-listener": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-interval": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz",
+ "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-latest-ref": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz",
+ "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ=="
+ },
+ "@chakra-ui/react-use-merge-refs": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz",
+ "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw=="
+ },
+ "@chakra-ui/react-use-outside-click": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.1.0.tgz",
+ "integrity": "sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-pan-event": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz",
+ "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==",
+ "requires": {
+ "@chakra-ui/event-utils": "2.0.8",
+ "@chakra-ui/react-use-latest-ref": "2.0.5",
+ "framesync": "6.1.2"
+ }
+ },
+ "@chakra-ui/react-use-previous": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz",
+ "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw=="
+ },
+ "@chakra-ui/react-use-safe-layout-effect": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz",
+ "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ=="
+ },
+ "@chakra-ui/react-use-size": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz",
+ "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==",
+ "requires": {
+ "@zag-js/element-size": "0.3.2"
+ }
+ },
+ "@chakra-ui/react-use-timeout": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz",
+ "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==",
+ "requires": {
+ "@chakra-ui/react-use-callback-ref": "2.0.7"
+ }
+ },
+ "@chakra-ui/react-use-update-effect": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz",
+ "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg=="
+ },
+ "@chakra-ui/react-utils": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz",
+ "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==",
+ "requires": {
+ "@chakra-ui/utils": "2.0.15"
+ }
+ },
+ "@chakra-ui/select": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz",
+ "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/shared-utils": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz",
+ "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q=="
+ },
+ "@chakra-ui/skeleton": {
+ "version": "2.0.24",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz",
+ "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==",
+ "requires": {
+ "@chakra-ui/media-query": "3.2.12",
+ "@chakra-ui/react-use-previous": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/skip-nav": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.0.15.tgz",
+ "integrity": "sha512-5UtmlnV4BmIgEk6lQ0h81JEYhPX04wJEk5ZMoilQ2zEQYL6TkVVHkhRXyc1Zfq76hmHuZPXZV/yJeTecj6jIrA=="
+ },
+ "@chakra-ui/slider": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.25.tgz",
+ "integrity": "sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==",
+ "requires": {
+ "@chakra-ui/number-utils": "2.0.7",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-latest-ref": "2.0.5",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-pan-event": "2.0.9",
+ "@chakra-ui/react-use-size": "2.0.10",
+ "@chakra-ui/react-use-update-effect": "2.0.7"
+ }
+ },
+ "@chakra-ui/spinner": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz",
+ "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/stat": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz",
+ "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/stepper": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.2.0.tgz",
+ "integrity": "sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/styled-system": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.1.tgz",
+ "integrity": "sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5",
+ "csstype": "^3.0.11",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/switch": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.27.tgz",
+ "integrity": "sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==",
+ "requires": {
+ "@chakra-ui/checkbox": "2.2.15",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/system": {
+ "version": "2.5.8",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.8.tgz",
+ "integrity": "sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==",
+ "requires": {
+ "@chakra-ui/color-mode": "2.1.12",
+ "@chakra-ui/object-utils": "2.1.0",
+ "@chakra-ui/react-utils": "2.0.12",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme-utils": "2.0.18",
+ "@chakra-ui/utils": "2.0.15",
+ "react-fast-compare": "3.2.1"
+ }
+ },
+ "@chakra-ui/table": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz",
+ "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==",
+ "requires": {
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/tabs": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz",
+ "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==",
+ "requires": {
+ "@chakra-ui/clickable": "2.0.14",
+ "@chakra-ui/descendant": "3.0.14",
+ "@chakra-ui/lazy-utils": "2.0.5",
+ "@chakra-ui/react-children-utils": "2.0.6",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-controllable-state": "2.0.8",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/tag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz",
+ "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==",
+ "requires": {
+ "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/react-context": "2.0.8"
+ }
+ },
+ "@chakra-ui/textarea": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz",
+ "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==",
+ "requires": {
+ "@chakra-ui/form-control": "2.0.18",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/theme": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.1.2.tgz",
+ "integrity": "sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==",
+ "requires": {
+ "@chakra-ui/anatomy": "2.1.2",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/theme-tools": "2.0.18"
+ }
+ },
+ "@chakra-ui/theme-tools": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.18.tgz",
+ "integrity": "sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==",
+ "requires": {
+ "@chakra-ui/anatomy": "2.1.2",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "color2k": "^2.0.0"
+ }
+ },
+ "@chakra-ui/theme-utils": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.18.tgz",
+ "integrity": "sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme": "3.1.2",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/toast": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.4.tgz",
+ "integrity": "sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==",
+ "requires": {
+ "@chakra-ui/alert": "2.1.0",
+ "@chakra-ui/close-button": "2.0.17",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-use-timeout": "2.0.5",
+ "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5",
+ "@chakra-ui/styled-system": "2.9.1",
+ "@chakra-ui/theme": "3.1.2"
+ }
+ },
+ "@chakra-ui/tooltip": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.9.tgz",
+ "integrity": "sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==",
+ "requires": {
+ "@chakra-ui/dom-utils": "2.1.0",
+ "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/react-types": "2.0.7",
+ "@chakra-ui/react-use-disclosure": "2.0.8",
+ "@chakra-ui/react-use-event-listener": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/transition": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz",
+ "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==",
+ "requires": {
+ "@chakra-ui/shared-utils": "2.0.5"
+ }
+ },
+ "@chakra-ui/utils": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz",
+ "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==",
+ "requires": {
+ "@types/lodash.mergewith": "4.6.7",
+ "css-box-model": "1.2.1",
+ "framesync": "6.1.2",
+ "lodash.mergewith": "4.6.2"
+ }
+ },
+ "@chakra-ui/visually-hidden": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz",
+ "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw=="
+ },
+ "@corex/deepmerge": {
+ "version": "4.0.29",
+ "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.29.tgz",
+ "integrity": "sha512-q/yVUnqckA8Do+EvAfpy7RLdumnBy9ZsducMUtZTvpdbJC7azEf1hGtnYYxm0QfphYxjwggv6XtH64prvS1W+A=="
+ },
+ "@emotion/babel-plugin": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
+ "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/serialize": "^1.1.2",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+ }
+ }
+ },
+ "@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "requires": {
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
+ }
+ },
+ "@emotion/hash": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
+ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ },
+ "@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "requires": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ },
+ "@emotion/react": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
+ "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/cache": "^11.11.0",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "hoist-non-react-statics": "^3.3.1"
+ }
+ },
+ "@emotion/serialize": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
+ "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
+ "requires": {
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/unitless": "^0.8.1",
+ "@emotion/utils": "^1.2.1",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@emotion/sheet": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
+ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ },
+ "@emotion/styled": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
+ "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
+ "requires": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/is-prop-valid": "^1.2.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1"
+ }
+ },
+ "@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ },
+ "@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
+ "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw=="
+ },
+ "@emotion/utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
+ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ },
+ "@emotion/weak-memoize": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
+ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ },
+ "@eslint/eslintrc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
+ "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.1",
+ "globals": "^13.9.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@fullhuman/postcss-purgecss": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-4.1.3.tgz",
+ "integrity": "sha512-jqcsyfvq09VOsMXxJMPLRF6Fhg/NNltzWKnC9qtzva+QKTxerCO4esG6je7hbnmkpZtaDyPTwMBj9bzfWorsrw==",
+ "requires": {
+ "purgecss": "^4.1.3"
+ }
+ },
+ "@headlessui/react": {
+ "version": "1.7.15",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz",
+ "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==",
+ "requires": {
+ "client-only": "^0.0.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@next/env": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.6.tgz",
+ "integrity": "sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA=="
+ },
+ "@next/eslint-plugin-next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.6.tgz",
+ "integrity": "sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.7"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "@next/swc-android-arm-eabi": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.6.tgz",
+ "integrity": "sha512-BxBr3QAAAXWgk/K7EedvzxJr2dE014mghBSA9iOEAv0bMgF+MRq4PoASjuHi15M2zfowpcRG8XQhMFtxftCleQ==",
+ "optional": true
+ },
+ "@next/swc-android-arm64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.6.tgz",
+ "integrity": "sha512-EboEk3ROYY7U6WA2RrMt/cXXMokUTXXfnxe2+CU+DOahvbrO8QSWhlBl9I9ZbFzJx28AGB9Yo3oQHCvph/4Lew==",
+ "optional": true
+ },
+ "@next/swc-darwin-arm64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.6.tgz",
+ "integrity": "sha512-P0EXU12BMSdNj1F7vdkP/VrYDuCNwBExtRPDYawgSUakzi6qP0iKJpya2BuLvNzXx+XPU49GFuDC5X+SvY0mOw==",
+ "optional": true
+ },
+ "@next/swc-darwin-x64": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz",
+ "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==",
+ "optional": true
+ },
+ "@next/swc-linux-arm-gnueabihf": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.6.tgz",
+ "integrity": "sha512-PvfEa1RR55dsik/IDkCKSFkk6ODNGJqPY3ysVUZqmnWMDSuqFtf7BPWHFa/53znpvVB5XaJ5Z1/6aR5CTIqxPw==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-gnu": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.6.tgz",
+ "integrity": "sha512-53QOvX1jBbC2ctnmWHyRhMajGq7QZfl974WYlwclXarVV418X7ed7o/EzGY+YVAEKzIVaAB9JFFWGXn8WWo0gQ==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-musl": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.6.tgz",
+ "integrity": "sha512-CMWAkYqfGdQCS+uuMA1A2UhOfcUYeoqnTW7msLr2RyYAys15pD960hlDfq7QAi8BCAKk0sQ2rjsl0iqMyziohQ==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-gnu": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.6.tgz",
+ "integrity": "sha512-AC7jE4Fxpn0s3ujngClIDTiEM/CQiB2N2vkcyWWn6734AmGT03Duq6RYtPMymFobDdAtZGFZd5nR95WjPzbZAQ==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-musl": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.6.tgz",
+ "integrity": "sha512-c9Vjmi0EVk0Kou2qbrynskVarnFwfYIi+wKufR9Ad7/IKKuP6aEhOdZiIIdKsYWRtK2IWRF3h3YmdnEa2WLUag==",
+ "optional": true
+ },
+ "@next/swc-win32-arm64-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.6.tgz",
+ "integrity": "sha512-3UTOL/5XZSKFelM7qN0it35o3Cegm6LsyuERR3/OoqEExyj3aCk7F025b54/707HTMAnjlvQK3DzLhPu/xxO4g==",
+ "optional": true
+ },
+ "@next/swc-win32-ia32-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.6.tgz",
+ "integrity": "sha512-8ZWoj6nCq6fI1yCzKq6oK0jE6Mxlz4MrEsRyu0TwDztWQWe7rh4XXGLAa2YVPatYcHhMcUL+fQQbqd1MsgaSDA==",
+ "optional": true
+ },
+ "@next/swc-win32-x64-msvc": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.6.tgz",
+ "integrity": "sha512-4ZEwiRuZEicXhXqmhw3+de8Z4EpOLQj/gp+D9fFWo6ii6W1kBkNNvvEx4A90ugppu+74pT1lIJnOuz3A9oQeJA==",
+ "optional": true
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@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
+ },
+ "@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"
+ }
+ },
+ "@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
+ },
+ "@react-leaflet/core": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz",
+ "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg=="
+ },
+ "@reduxjs/toolkit": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.8.2.tgz",
+ "integrity": "sha512-CtPw5TkN1pHRigMFCOS/0qg3b/yfPV5qGCsltVnIz7bx4PKTJlGHYfIxm97qskLknMzuGfjExaYdXJ77QTL0vg==",
+ "requires": {
+ "immer": "^9.0.7",
+ "redux": "^4.1.2",
+ "redux-thunk": "^2.4.1",
+ "reselect": "^4.1.5"
+ }
+ },
+ "@rushstack/eslint-patch": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz",
+ "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
+ "dev": true
+ },
+ "@sanity/client": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@sanity/client/-/client-3.3.0.tgz",
+ "integrity": "sha512-ecIRsV+IncI1P9I6ZdB3xKLBpWVggqtiY0RLWeT3RWaP4cX6lXzD5fPknaXaBnCxtIr9ZhqZVqpRkyjrUlHe0Q==",
+ "requires": {
+ "@sanity/eventsource": "^3.0.2",
+ "@sanity/generate-help-url": "^3.0.0",
+ "get-it": "^6.0.1",
+ "make-error": "^1.3.0",
+ "object-assign": "^4.1.1",
+ "rxjs": "^6.0.0"
+ }
+ },
+ "@sanity/eventsource": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@sanity/eventsource/-/eventsource-3.0.2.tgz",
+ "integrity": "sha512-cg0NTs75gbW84tpKFRBeFLbG6hSLp9U5mwLaGaMjuqP7DkfXbpkZsgRPPnRRVj1M+o32eiGZ8xQaLop2Ixn7yw==",
+ "requires": {
+ "event-source-polyfill": "1.0.25",
+ "eventsource": "^1.0.6"
+ }
+ },
+ "@sanity/generate-help-url": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sanity/generate-help-url/-/generate-help-url-3.0.0.tgz",
+ "integrity": "sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA=="
+ },
+ "@sanity/image-url": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@sanity/image-url/-/image-url-1.0.1.tgz",
+ "integrity": "sha512-AdKQ3zMk7WdoNwoJPrAvQhW+kUtBldBX0nHtnGy+rwmgsCQ0rAXasrgH43Fhmsp/yB6piiq+F2d5qEuBFsdQVg=="
+ },
+ "@sanity/timed-out": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@sanity/timed-out/-/timed-out-4.0.2.tgz",
+ "integrity": "sha512-NBDKGj14g9Z+bopIvZcQKWCzJq5JSrdmzRR1CS+iyA3Gm8SnIWBfZa7I3mTg2X6Nu8LQXG0EPKXdOGozLS4i3w=="
+ },
+ "@stripe/stripe-js": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.29.0.tgz",
+ "integrity": "sha512-OsUxk0VLlum8E2d6onlEdKuQcvLMs7qTrOXCnl/BGV3fAm65qr6h3e1IZ5AX4lgUlPRrzRcddSOA5DvkKKYLvg=="
+ },
+ "@types/bcryptjs": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
+ "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ=="
+ },
+ "@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/js-cookie": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.2.tgz",
+ "integrity": "sha512-6+0ekgfusHftJNYpihfkMu8BWdeHs9EOJuGcSofErjstGPfPGEu9yTu4t460lTzzAMl2cM5zngQJqPMHbbnvYA=="
+ },
+ "@types/json-schema": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA=="
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "@types/jsonwebtoken": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz",
+ "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/leaflet": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz",
+ "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==",
+ "requires": {
+ "@types/geojson": "*"
+ }
+ },
+ "@types/lodash": {
+ "version": "4.14.195",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
+ "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg=="
+ },
+ "@types/lodash.mergewith": {
+ "version": "4.6.7",
+ "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz",
+ "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==",
+ "requires": {
+ "@types/lodash": "*"
+ }
+ },
+ "@types/node": {
+ "version": "17.0.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz",
+ "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q=="
+ },
+ "@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.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "@types/react": {
+ "version": "18.0.8",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.8.tgz",
+ "integrity": "sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.3.tgz",
+ "integrity": "sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-redux": {
+ "version": "7.1.24",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz",
+ "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "@types/react-slick": {
+ "version": "0.23.8",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.8.tgz",
+ "integrity": "sha512-SfzSg++/3uyftVZaCgHpW+2fnJFsyJEQ/YdsuqfOWQ5lqUYV/gY/UwAnkw4qksCj5jalto/T5rKXJ8zeFldQeA==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-star-rating-component": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@types/react-star-rating-component/-/react-star-rating-component-1.4.1.tgz",
+ "integrity": "sha512-f4rKKGvS9//wr2mjsT2Ol3N7tgV3DPmu4RZRp2dabEvYukHDx5tIjXecnEZGxpdU6HszKkvbpcy4kPq5VrAqew==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-transition-group": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz",
+ "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==",
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz",
+ "integrity": "sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.22.0",
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/typescript-estree": "5.22.0",
+ "debug": "^4.3.2"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz",
+ "integrity": "sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/visitor-keys": "5.22.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz",
+ "integrity": "sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz",
+ "integrity": "sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "@typescript-eslint/visitor-keys": "5.22.0",
+ "debug": "^4.3.2",
+ "globby": "^11.0.4",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.22.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz",
+ "integrity": "sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.22.0",
+ "eslint-visitor-keys": "^3.0.0"
+ }
+ },
+ "@zag-js/element-size": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
+ "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
+ },
+ "@zag-js/focus-visible": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
+ "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
+ },
+ "@zeit/next-css": {
+ "version": "1.0.2-canary.0",
+ "resolved": "https://registry.npmjs.org/@zeit/next-css/-/next-css-1.0.2-canary.0.tgz",
+ "integrity": "sha512-7W4LAy1FDaYZF+kMbDVNy353tf/h90P8RWRCS9JlduTM/XOaUjYbZoa6oKOCZLPuePfSOYvFAz25WfTF2uqJ+Q==",
+ "requires": {
+ "css-loader": "1.0.0",
+ "extract-css-chunks-webpack-plugin": "^3.2.0",
+ "extracted-loader": "1.0.4",
+ "find-up": "2.1.0",
+ "ignore-loader": "0.1.2",
+ "postcss-loader": "3.0.0"
+ }
+ },
+ "acorn": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
+ "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "requires": {
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
+ }
+ },
+ "array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ }
+ },
+ "array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true
+ },
+ "axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "requires": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==",
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
+ }
+ }
+ },
+ "babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "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"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
+ },
+ "big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "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==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "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"
+ }
+ },
+ "broadcast-channel": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+ "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+ "requires": {
+ "@babel/runtime": "^7.7.2",
+ "detect-node": "^2.1.0",
+ "js-sha3": "0.8.0",
+ "microseconds": "0.2.0",
+ "nano-time": "1.0.0",
+ "oblivious-set": "1.0.0",
+ "rimraf": "3.0.2",
+ "unload": "2.2.0"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
+ "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001359",
+ "electron-to-chromium": "^1.4.172",
+ "node-releases": "^2.0.5",
+ "update-browserslist-db": "^1.0.4"
+ }
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+ "requires": {
+ "callsites": "^2.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="
+ }
+ }
+ },
+ "caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+ "requires": {
+ "caller-callsite": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "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==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001363",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
+ "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg=="
+ },
+ "capture-stack-trace": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz",
+ "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w=="
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "color2k": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz",
+ "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
+ },
+ "compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "requires": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "core-js-pure": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.0.tgz",
+ "integrity": "sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==",
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "css-box-model": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
+ "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
+ "requires": {
+ "tiny-invariant": "^1.0.6"
+ }
+ },
+ "css-loader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz",
+ "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==",
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "css-selector-tokenizer": "^0.7.0",
+ "icss-utils": "^2.1.0",
+ "loader-utils": "^1.0.2",
+ "lodash.camelcase": "^4.3.0",
+ "postcss": "^6.0.23",
+ "postcss-modules-extract-imports": "^1.2.0",
+ "postcss-modules-local-by-default": "^1.2.0",
+ "postcss-modules-scope": "^1.1.0",
+ "postcss-modules-values": "^1.3.0",
+ "postcss-value-parser": "^3.3.0",
+ "source-list-map": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "css-selector-tokenizer": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+ "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
+ "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.11",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
+ "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "requires": {
+ "mimic-response": "^3.1.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dev": true,
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "defined": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+ "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ }
+ },
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "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==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.447",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz",
+ "integrity": "sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
+ "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.21.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz",
+ "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==",
+ "dev": true,
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.0",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.9"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ },
+ "eslint": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
+ "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.2.2",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
+ },
+ "eslint-config-next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.1.6.tgz",
+ "integrity": "sha512-qoiS3g/EPzfCTkGkaPBSX9W0NGE/B1wNO3oWrd76QszVGrdpLggNqcO8+LR6MB0CNqtp9Q8NoeVrxNVbzM9hqA==",
+ "dev": true,
+ "requires": {
+ "@next/eslint-plugin-next": "12.1.6",
+ "@rushstack/eslint-patch": "^1.1.3",
+ "@typescript-eslint/parser": "^5.21.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^2.7.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.29.4",
+ "eslint-plugin-react-hooks": "^4.5.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7",
+ "resolve": "^1.20.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-import-resolver-typescript": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz",
+ "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "glob": "^7.2.0",
+ "is-glob": "^4.0.3",
+ "resolve": "^1.22.0",
+ "tsconfig-paths": "^3.14.1"
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
+ "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.4",
+ "array.prototype.flat": "^1.2.5",
+ "debug": "^2.6.9",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-module-utils": "^2.7.3",
+ "has": "^1.0.3",
+ "is-core-module": "^2.8.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.5",
+ "resolve": "^1.22.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
+ "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.16.3",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.4",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.3.5",
+ "axobject-query": "^2.2.0",
+ "damerau-levenshtein": "^1.0.7",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.2.1",
+ "language-tags": "^1.0.5",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.29.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
+ "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.4",
+ "array.prototype.flatmap": "^1.2.5",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.5",
+ "object.fromentries": "^2.0.5",
+ "object.hasown": "^1.1.0",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.3",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.6"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz",
+ "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz",
+ "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "event-source-polyfill": {
+ "version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz",
+ "integrity": "sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg=="
+ },
+ "eventsource": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz",
+ "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA=="
+ },
+ "extract-css-chunks-webpack-plugin": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/extract-css-chunks-webpack-plugin/-/extract-css-chunks-webpack-plugin-3.3.3.tgz",
+ "integrity": "sha512-4DYo3jna9ov81rdKtE1U2cirb3ERoWhHldzRxZWx3Q5i5Dm6U+mmfon7PmaKDuh6+xySVOqtlXrZyJY2V4tc+g==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "lodash": "^4.17.11",
+ "normalize-url": "^3.3.0",
+ "schema-utils": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "extracted-loader": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/extracted-loader/-/extracted-loader-1.0.4.tgz",
+ "integrity": "sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q=="
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-glob": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
+ "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
+ },
+ "fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "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"
+ }
+ },
+ "find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "focus-lock": {
+ "version": "0.11.6",
+ "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
+ "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==",
+ "requires": {
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
+ "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "form-urlencoded": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/form-urlencoded/-/form-urlencoded-2.0.9.tgz",
+ "integrity": "sha512-fWUzNiOnYa126vFAT6TFXd1mhJrvD8IqmQ9ilZPjkLYQfaRreBr5fIUoOpPlWtqaAG64nzoE7u5zSetifab9IA=="
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true
+ },
+ "framer-motion": {
+ "version": "10.12.16",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.16.tgz",
+ "integrity": "sha512-w/SfWEIWJkYSgRHYBmln7EhcNo31ao8Xexol8lGXf1pR/tlnBtf1HcxoUmEiEh6pacB4/geku5ami53AAQWHMQ==",
+ "requires": {
+ "@emotion/is-prop-valid": "^0.8.2",
+ "tslib": "^2.4.0"
+ },
+ "dependencies": {
+ "@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "requires": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
+ "tslib": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz",
+ "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w=="
+ }
+ }
+ },
+ "framesync": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
+ "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
+ "requires": {
+ "tslib": "2.4.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "dev": true
+ },
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-it": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/get-it/-/get-it-6.1.0.tgz",
+ "integrity": "sha512-hvk2h2hiOHji57MpBQ/o9CnJT7hpNII7Jio3AyY41I7AmkUVvnYrpQAPIQGc3j7R5QNYnhwyXmok+DSSdBLWbg==",
+ "requires": {
+ "@sanity/timed-out": "^4.0.2",
+ "create-error-class": "^3.0.2",
+ "debug": "^2.6.8",
+ "decompress-response": "^6.0.0",
+ "follow-redirects": "^1.2.4",
+ "form-urlencoded": "^2.0.7",
+ "into-stream": "^3.1.0",
+ "is-plain-object": "^2.0.4",
+ "is-retry-allowed": "^1.1.0",
+ "is-stream": "^1.1.0",
+ "nano-pubsub": "^1.0.2",
+ "object-assign": "^4.1.1",
+ "parse-headers": "^2.0.4",
+ "progress-stream": "^2.0.0",
+ "same-origin": "^0.1.1",
+ "simple-concat": "^1.0.1",
+ "tunnel-agent": "^0.6.0",
+ "url-parse": "^1.1.9"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "goober": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.9.tgz",
+ "integrity": "sha512-PAtnJbrWtHbfpJUIveG5PJIB6Mc9Kd0gimu9wZwPyA+wQUSeOeA4x4Ug16lyaaUUKZ/G6QEH1xunKOuXP1F4Vw=="
+ },
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ }
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="
+ },
+ "icss-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+ "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==",
+ "requires": {
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "ignore-loader": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz",
+ "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA=="
+ },
+ "immer": {
+ "version": "9.0.14",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz",
+ "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw=="
+ },
+ "import-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+ "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==",
+ "requires": {
+ "import-from": "^2.1.0"
+ }
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-from": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+ "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==",
+ "requires": {
+ "resolve-from": "^3.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "into-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+ "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==",
+ "requires": {
+ "from2": "^2.1.1",
+ "p-is-promise": "^1.1.0"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "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==",
+ "dev": true,
+ "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",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "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
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
+ },
+ "js-cookie": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+ "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw=="
+ },
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+ },
+ "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",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "requires": {
+ "string-convert": "^0.2.0"
+ }
+ },
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
+ "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true
+ },
+ "language-tags": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.8.tgz",
+ "integrity": "sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==",
+ "dev": true,
+ "requires": {
+ "language-subtag-registry": "^0.3.20"
+ }
+ },
+ "leaflet": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
+ "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
+ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "dev": true
+ },
+ "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": "2.0.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+ "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ }
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "requires": {
+ "p-locate": "^2.0.0",
+ "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.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "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.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ },
+ "match-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
+ "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "remove-accents": "0.4.2"
+ }
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "microseconds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+ "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "nano-pubsub": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nano-pubsub/-/nano-pubsub-1.0.2.tgz",
+ "integrity": "sha512-HtPs1RbULM/z8wt3BbeeZlxVNiJbl+zQAwwrbc0KAq5NHaCG3MmffOVCpRhNTs+TK67MdN6aZ+5wzPtRZvME+w=="
+ },
+ "nano-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+ "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+ "requires": {
+ "big-integer": "^1.6.16"
+ }
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "next": {
+ "version": "12.1.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz",
+ "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==",
+ "requires": {
+ "@next/env": "12.1.6",
+ "@next/swc-android-arm-eabi": "12.1.6",
+ "@next/swc-android-arm64": "12.1.6",
+ "@next/swc-darwin-arm64": "12.1.6",
+ "@next/swc-darwin-x64": "12.1.6",
+ "@next/swc-linux-arm-gnueabihf": "12.1.6",
+ "@next/swc-linux-arm64-gnu": "12.1.6",
+ "@next/swc-linux-arm64-musl": "12.1.6",
+ "@next/swc-linux-x64-gnu": "12.1.6",
+ "@next/swc-linux-x64-musl": "12.1.6",
+ "@next/swc-win32-arm64-msvc": "12.1.6",
+ "@next/swc-win32-ia32-msvc": "12.1.6",
+ "@next/swc-win32-x64-msvc": "12.1.6",
+ "caniuse-lite": "^1.0.30001332",
+ "postcss": "8.4.5",
+ "styled-jsx": "5.0.2"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.4.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+ "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+ "requires": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ }
+ }
+ }
+ },
+ "next-connect": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/next-connect/-/next-connect-0.12.2.tgz",
+ "integrity": "sha512-B/zKHPs5S7XWvAVsZVLvOeY2eL2U3g0W/BgCDetEJRcNDzxX2vi8rzqBuEoLLPlI8LvtHwujDVUFFjSgOEZTbA==",
+ "requires": {
+ "trouter": "^3.2.0"
+ }
+ },
+ "next-sanity-image": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/next-sanity-image/-/next-sanity-image-3.2.1.tgz",
+ "integrity": "sha512-lnynR/h7kD5ueVxQoam8ElKXb+bGWuU1cP+PCwx1NzIiBUHM2wBMnvmpt+emubGocMaIURT/iwPU46VnmB9rsQ==",
+ "requires": {
+ "@sanity/image-url": "^0.140.22"
+ },
+ "dependencies": {
+ "@sanity/image-url": {
+ "version": "0.140.22",
+ "resolved": "https://registry.npmjs.org/@sanity/image-url/-/image-url-0.140.22.tgz",
+ "integrity": "sha512-CAmQZnj+KM7FSEYiWlIGDit072syicYuAw0w7R2ctMzHiZ4p9mE/g6dBnYqrqFUrw2J+GpJgPt+RVspKP8vdqA=="
+ }
+ }
+ },
+ "next-sitemap": {
+ "version": "3.1.17",
+ "resolved": "https://registry.npmjs.org/next-sitemap/-/next-sitemap-3.1.17.tgz",
+ "integrity": "sha512-xop7KgEbWsqOe4Fr50g9RQ1UGb1bAEJoKYVVynbUqietpSltAnCIzvq/StL2gZcNyFW9K+9tZV7EpcD+72gRrA==",
+ "requires": {
+ "@corex/deepmerge": "^4.0.29",
+ "minimist": "^1.2.6"
+ }
+ },
+ "next-themes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.0.tgz",
+ "integrity": "sha512-myhpDL4vadBD9YDSHiewqvzorGzB03N84e+3LxCwHRlM/hiBOaW+UsKsQojQAzC7fdcJA0l2ppveXcYaVV+hxQ=="
+ },
+ "nextjs-progressbar": {
+ "version": "0.0.14",
+ "resolved": "https://registry.npmjs.org/nextjs-progressbar/-/nextjs-progressbar-0.0.14.tgz",
+ "integrity": "sha512-AXYXHDN6M52AwFnGqH/vlwyo0gbC9zM7QS/4ryOTI0RUqfze5FJl8uSrxKJMzK6hGFdDeQXcZoWsLGXeCVtTwg==",
+ "requires": {
+ "nprogress": "^0.2.0",
+ "prop-types": "^15.7.2"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+ },
+ "nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ },
+ "object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "oblivious-set": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+ "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-is-promise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg=="
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww=="
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-headers": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "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=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "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=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-load-config": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+ "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "import-cwd": "^2.0.0"
+ }
+ },
+ "postcss-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "postcss": "^7.0.0",
+ "postcss-load-config": "^2.0.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
+ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+ "requires": {
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+ "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==",
+ "requires": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+ "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==",
+ "requires": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-values": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+ "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==",
+ "requires": {
+ "icss-replace-symbols": "^1.1.0",
+ "postcss": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "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==",
+ "dev": true
+ },
+ "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
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "progress-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz",
+ "integrity": "sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==",
+ "requires": {
+ "speedometer": "~1.0.0",
+ "through2": "~2.0.3"
+ }
+ },
+ "prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+ },
+ "purgecss": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.1.3.tgz",
+ "integrity": "sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==",
+ "requires": {
+ "commander": "^8.0.0",
+ "glob": "^7.1.7",
+ "postcss": "^8.3.5",
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "qs": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+ "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "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
+ },
+ "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==",
+ "dev": true
+ },
+ "react": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz",
+ "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-clientside-effect": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz",
+ "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==",
+ "requires": {
+ "@babel/runtime": "^7.12.13"
+ }
+ },
+ "react-dom": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz",
+ "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.22.0"
+ }
+ },
+ "react-fast-compare": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz",
+ "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg=="
+ },
+ "react-focus-lock": {
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz",
+ "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==",
+ "requires": {
+ "@babel/runtime": "^7.0.0",
+ "focus-lock": "^0.11.6",
+ "prop-types": "^15.6.2",
+ "react-clientside-effect": "^1.2.6",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ }
+ },
+ "react-hot-toast": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.2.0.tgz",
+ "integrity": "sha512-248rXw13uhf/6TNDVzagX+y7R8J183rp7MwUMNkcrBRyHj/jWOggfXTGlM8zAOuh701WyVW+eUaWG2LeSufX9g==",
+ "requires": {
+ "goober": "^2.1.1"
+ }
+ },
+ "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=="
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "react-leaflet": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz",
+ "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==",
+ "requires": {
+ "@react-leaflet/core": "^2.1.0"
+ }
+ },
+ "react-leaflet-custom-control": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/react-leaflet-custom-control/-/react-leaflet-custom-control-1.3.5.tgz",
+ "integrity": "sha512-9/v7AxY6CoUbc6fAD/0u8O6wCBopxtdzJukWOR7vLZcyAN5rQCYWXjF5wXJ8klONweZGsRaGPJelfEBRtZAgQA=="
+ },
+ "react-query": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.38.1.tgz",
+ "integrity": "sha512-CM9hsz6oib17hsBguGaMJr+a0swMzou2gvNHHjAusnXvkfTx6CTzx0Iwuplox1jI2j3WiY91BGrcIN6bp1n1Iw==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "broadcast-channel": "^3.4.1",
+ "match-sorter": "^6.0.2"
+ }
+ },
+ "react-redux": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.2.tgz",
+ "integrity": "sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
+ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg=="
+ }
+ }
+ },
+ "react-remove-scroll": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz",
+ "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==",
+ "requires": {
+ "react-remove-scroll-bar": "^2.3.4",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-remove-scroll-bar": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
+ "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "requires": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "dependencies": {
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ }
+ }
+ },
+ "react-star-rating-component": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/react-star-rating-component/-/react-star-rating-component-1.4.1.tgz",
+ "integrity": "sha512-i0YEvQzToS0s0GDkxn01Jy4EeLpVEyh023NXJTJ+/1+xkvhpACyD4d1YeBhYWZab53ppUnUxs5gmp75gJr3khA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "prop-types": "^15.6.1"
+ },
+ "dependencies": {
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ }
+ }
+ },
+ "react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "requires": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "react-toastify": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.0.7.tgz",
+ "integrity": "sha512-UG5P/2F/fYdbK+v3XRWHM6xfMkWeLM+k2swKvwU8oO9DXx31GkeoH7Z6slBTkavZ0VjoQ+n/YD6xOBqEwN7HRg==",
+ "requires": {
+ "clsx": "^1.1.1"
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "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==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-thunk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
+ "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q=="
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ }
+ },
+ "regexparam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-1.3.0.tgz",
+ "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g=="
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "remove-accents": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
+ "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "reselect": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz",
+ "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ=="
+ },
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "requires": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "same-origin": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/same-origin/-/same-origin-0.1.1.tgz",
+ "integrity": "sha512-effkSW9cap879l6CVNdwL5iubVz8tkspqgfiqwgBgFQspV7152WHaLzr5590yR8oFgt7E1d4lO09uUhtAgUPoA=="
+ },
+ "scheduler": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz",
+ "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
+ "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+ "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA=="
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+ },
+ "speedometer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz",
+ "integrity": "sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw=="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "stripe": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-9.1.0.tgz",
+ "integrity": "sha512-Kpa+DoB5GCV360a6fvIrWokLhj3SXRadWAxR6duN2mIgrIkvLK0tVDd8b2OT2/QtJ6WX9EI3vLvaErzG76d+tg==",
+ "requires": {
+ "@types/node": ">=8.1.0",
+ "qs": "^6.10.3"
+ }
+ },
+ "styled-jsx": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
+ "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ=="
+ },
+ "stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "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=="
+ },
+ "tailwindcss": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.4.tgz",
+ "integrity": "sha512-NrxbFV4tYsga/hpWbRyUfIaBrNMXDxx5BsHgBS4v5tlyjf+sDsgBg5m9OxjrXIqAS/uR9kicxLKP+bEHI7BSeQ==",
+ "dev": true,
+ "requires": {
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "detective": "^5.2.1",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "lilconfig": "^2.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.4",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "dependencies": {
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ },
+ "to-regex-range": {
+ "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"
+ }
+ },
+ "toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
+ "trouter": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/trouter/-/trouter-3.2.0.tgz",
+ "integrity": "sha512-rLLXbhTObLy2MBVjLC+jTnoIKw99n0GuJs9ov10J870vDw5qhTurPzsDrudNtBf5w/CZ9ctZy2p2IMmhGcel2w==",
+ "requires": {
+ "regexparam": "^1.3.0"
+ }
+ },
+ "tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
+ },
+ "typescript": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==",
+ "dev": true
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unload": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+ "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+ "requires": {
+ "@babel/runtime": "^7.6.2",
+ "detect-node": "^2.0.4"
+ }
+ },
+ "update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use-callback-ref": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
+ "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "requires": {
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "requires": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ }
+ }
+ },
+ "use-sync-external-store": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
+ "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "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/apps/tourism/package.json b/apps/tourism/package.json
new file mode 100644
index 000000000..6002382d9
--- /dev/null
+++ b/apps/tourism/package.json
@@ -0,0 +1,79 @@
+{
+ "name": "@beckn-ui/tourism",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "postbuild": "next-sitemap",
+ "export": "next export"
+ },
+ "prettier": "@beckn-ui/prettier-config",
+ "dependencies": {
+ "@chakra-ui/icons": "^2.0.19",
+ "@chakra-ui/react": "^2.7.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.11.0",
+ "@fullhuman/postcss-purgecss": "^4.1.3",
+ "@headlessui/react": "^1.7.15",
+ "@reduxjs/toolkit": "^1.8.2",
+ "@sanity/client": "^3.3.0",
+ "@sanity/image-url": "^1.0.1",
+ "@stripe/stripe-js": "^1.29.0",
+ "@types/bcryptjs": "^2.4.2",
+ "@types/js-cookie": "^3.0.2",
+ "@types/jsonwebtoken": "^8.5.8",
+ "@types/leaflet": "^1.9.3",
+ "@types/react-redux": "^7.1.24",
+ "@types/react-slick": "^0.23.8",
+ "@types/react-star-rating-component": "^1.4.1",
+ "@types/react-transition-group": "^4.4.4",
+ "@zeit/next-css": "^1.0.2-canary.0",
+ "axios": "^0.27.2",
+ "bcryptjs": "^2.4.3",
+ "classnames": "^2.3.2",
+ "framer-motion": "^10.12.16",
+ "garudaa": "./garudaa-1.0.0.tgz",
+ "js-cookie": "^3.0.1",
+ "jsonwebtoken": "^8.5.1",
+ "leaflet": "^1.9.4",
+ "next": "^13.4.19",
+ "next-connect": "^0.12.2",
+ "next-sanity-image": "^3.2.1",
+ "next-sitemap": "^3.1.17",
+ "next-themes": "^0.2.0",
+ "nextjs-progressbar": "^0.0.14",
+ "qrcode.react": "^3.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hot-toast": "^2.2.0",
+ "react-icons": "^4.3.1",
+ "react-leaflet": "^4.2.1",
+ "react-leaflet-custom-control": "^1.3.5",
+ "react-places-autocomplete": "^7.3.0",
+ "react-query": "^3.38.1",
+ "react-redux": "^8.0.2",
+ "react-slick": "^0.29.0",
+ "react-star-rating-component": "^1.4.1",
+ "react-toastify": "^9.0.7",
+ "react-transition-group": "^4.4.5",
+ "slick-carousel": "^1.8.1",
+ "stripe": "^9.1.0",
+ "url-loader": "^4.1.1"
+ },
+ "devDependencies": {
+ "@beckn-ui/prettier-config": "workspace:^",
+ "@types/node": "17.0.31",
+ "@types/react": "18.0.8",
+ "@types/react-dom": "18.0.3",
+ "autoprefixer": "^10.4.7",
+ "eslint": "8.14.0",
+ "eslint-config-next": "latest",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "prettier": "^3.0.3",
+ "tailwindcss": "^3.1.4",
+ "typescript": "4.6.4"
+ }
+}
diff --git a/apps/tourism/pages/_app.tsx b/apps/tourism/pages/_app.tsx
new file mode 100644
index 000000000..7fbe6ba47
--- /dev/null
+++ b/apps/tourism/pages/_app.tsx
@@ -0,0 +1,42 @@
+import React from 'react'
+import type { AppProps } from 'next/app'
+
+import Layout from '@components/layout/Layout'
+import { BecknProvider } from '@beckn-ui/molecules'
+
+import 'slick-carousel/slick/slick.css'
+import 'slick-carousel/slick/slick-theme.css'
+
+import 'react-toastify/dist/ReactToastify.css'
+
+import '../styles/globals.css'
+import { Provider } from 'react-redux'
+import store from '@store/index'
+import { Garuda } from 'garudaa'
+
+Garuda.init({
+ projectId: '65c0d663cbe90cafae9185f6',
+ host: 'https://garuda-api.becknprotocol.io'
+})
+function MyApp({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+
+
+
+
+ )
+}
+
+export default MyApp
diff --git a/apps/tourism/pages/_document.tsx b/apps/tourism/pages/_document.tsx
new file mode 100644
index 000000000..b68f78940
--- /dev/null
+++ b/apps/tourism/pages/_document.tsx
@@ -0,0 +1,39 @@
+import { Html, Head, Main, NextScript } from 'next/document'
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/tourism/pages/assemblyDetails.tsx b/apps/tourism/pages/assemblyDetails.tsx
new file mode 100644
index 000000000..14b0c140d
--- /dev/null
+++ b/apps/tourism/pages/assemblyDetails.tsx
@@ -0,0 +1,10 @@
+import { Box, Select, Stack, useTheme } from '@chakra-ui/react'
+import AssemblyDetails from '@components/assemblyDetails'
+import React from 'react'
+
+const assemblyDetails = () => {
+ const theme = useTheme()
+ return
+}
+
+export default assemblyDetails
diff --git a/apps/tourism/pages/cart.tsx b/apps/tourism/pages/cart.tsx
new file mode 100644
index 000000000..20e161a5a
--- /dev/null
+++ b/apps/tourism/pages/cart.tsx
@@ -0,0 +1,8 @@
+import EmptyCart from '@components/emptyCart/EmptyCart'
+import React from 'react'
+
+const cart = () => {
+ return
+}
+
+export default cart
diff --git a/apps/retail/pages/checkoutPage.tsx b/apps/tourism/pages/checkoutPage.tsx
similarity index 100%
rename from apps/retail/pages/checkoutPage.tsx
rename to apps/tourism/pages/checkoutPage.tsx
diff --git a/apps/tourism/pages/feedback.tsx b/apps/tourism/pages/feedback.tsx
new file mode 100644
index 000000000..8dfb34565
--- /dev/null
+++ b/apps/tourism/pages/feedback.tsx
@@ -0,0 +1,153 @@
+import { Box, Text, Image, Textarea } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import React, { useEffect, useState } from 'react'
+import StarRating from '../components/starRating/StarRating'
+import { useLanguage } from '../hooks/useLanguage'
+import feedbackImg from '../public/images/feedbackImg.svg'
+import { Typography } from '@beckn-ui/molecules'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import { ConfirmResponseModel } from '../types/confirm.types'
+import axios from 'axios'
+import LoaderWithMessage from '@components/loader/LoaderWithMessage'
+
+const Feedback = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ const [ratingForStore, setRatingForStore] = useState(0)
+ const [feedback, setFeedback] = useState('')
+ const [confirmData, setConfirmData] = useState(null)
+ const [isLoadingForRating, setIsLoadingForRating] = useState(false)
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('confirmResponse')) {
+ const parsedConfirmData: ConfirmResponseModel[] = JSON.parse(localStorage.getItem('confirmResponse') as string)
+ setConfirmData(parsedConfirmData)
+ }
+ }, [])
+
+ const handleSubmitReview = async (confirmData: ConfirmResponseModel[]) => {
+ try {
+ setIsLoadingForRating(true)
+ const { domain, bpp_id, bpp_uri, transaction_id } = confirmData[0].context
+ const orderId = confirmData[0].message.orderId
+ const ratingPayload = {
+ data: [
+ {
+ context: {
+ transaction_id,
+ bpp_id,
+ bpp_uri,
+ domain
+ },
+ message: {
+ id: orderId,
+ rating_category: 'Order',
+ value: ratingForStore
+ }
+ }
+ ]
+ }
+
+ const ratingResponse = await axios.post(`${apiUrl}/rating`, ratingPayload)
+ if (ratingResponse.data.data.length > 0) {
+ router.push('/homePage')
+ }
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ if (!confirmData || confirmData.length === 0) {
+ return <>>
+ }
+
+ if (isLoadingForRating) {
+ return (
+
+
+
+ )
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ setFeedback(e.target.value)}
+ height={'124px'}
+ resize={'none'}
+ mb={'20px'}
+ placeholder={t.writeExperience}
+ boxShadow={'0px 4px 6px -1px rgba(0, 0, 0, 0.1), 0px 2px 4px -2px rgba(0, 0, 0, 0.1)'}
+ />
+ handleSubmitReview(confirmData)}
+ />
+ router.push('/homePage')}
+ />
+
+
+ )
+}
+
+export default Feedback
diff --git a/apps/tourism/pages/filter.tsx b/apps/tourism/pages/filter.tsx
new file mode 100644
index 000000000..db2f95da8
--- /dev/null
+++ b/apps/tourism/pages/filter.tsx
@@ -0,0 +1,38 @@
+import { Box, Image } from '@chakra-ui/react'
+import BottomModal from '@components/BottomModal'
+import Filter from '@components/filter/Filter'
+import React, { useState } from 'react'
+
+const filter = () => {
+ const [isFilterOpen, setIsFilterOpen] = useState(false)
+ const handleFilterClose = () => {
+ setIsFilterOpen(false)
+ }
+ return (
+ <>
+
+ setIsFilterOpen(true)}
+ cursor={'pointer'}
+ src="./images/filter-btn.svg"
+ alt=""
+ />
+
+
+
+
+
+ }
+ />
+
+
+
+
+ >
+ )
+}
+
+export default filter
diff --git a/apps/retail/pages/homePage.tsx b/apps/tourism/pages/homePage.tsx
similarity index 100%
rename from apps/retail/pages/homePage.tsx
rename to apps/tourism/pages/homePage.tsx
diff --git a/apps/tourism/pages/index.tsx b/apps/tourism/pages/index.tsx
new file mode 100644
index 000000000..f0d7ae287
--- /dev/null
+++ b/apps/tourism/pages/index.tsx
@@ -0,0 +1,220 @@
+import React, { useEffect, useState } from 'react'
+import axios from 'axios'
+import { useDispatch } from 'react-redux'
+import { Box, Flex, Image } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import { toBinary } from '@utils/common-utils'
+import { parsedSearchlist } from '@utils/search-results.utils'
+import { ProductCard } from '@beckn-ui/becknified-components'
+import { BottomModal, Typography } from '@beckn-ui/molecules'
+import { useBreakpoint } from '@chakra-ui/react'
+import ProductCardRenderer from '@components/productCard/product-card-renderer'
+import SearchBar from '../components/header/SearchBar'
+import { useLanguage } from '../hooks/useLanguage'
+import { ParsedItemModel } from '../types/search.types'
+import TopSheet from '@components/topSheet/TopSheet'
+import LoaderWithMessage from '@components/loader/LoaderWithMessage'
+import Filter from '../components/filter/Filter'
+import FilterIcon from '../public/images/filter-icon.svg'
+import { BsFilterSquare } from 'react-icons/bs'
+
+//Mock data for testing search API. Will remove after the resolution of CORS issue
+
+const Search = () => {
+ const [items, setItems] = useState([])
+ const router = useRouter()
+ const [searchKeyword, setSearchKeyword] = useState(router.query?.searchTerm || '')
+ const [isLoading, setIsLoading] = useState(false)
+ const [isFilterOpen, setIsFilterOpen] = useState(false)
+ const breakpoint = useBreakpoint()
+ const mobileBreakpoints = ['base', 'sm']
+ const isMediumScreen = breakpoint === 'md'
+ const isSmallScreen = mobileBreakpoints.includes(breakpoint)
+ const handleFilterClose = () => {
+ setIsFilterOpen(false)
+ }
+ const dispatch = useDispatch()
+ const { t } = useLanguage()
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+ const searchPayload = {
+ context: {
+ domain: 'retail'
+ },
+ message: {
+ criteria: {
+ dropLocation: '12.9715987,77.5945627',
+ categoryName: 'Retail',
+ searchString: searchKeyword
+ }
+ }
+ }
+
+ const transformData = data => {
+ const allItems = data.message.catalogs.flatMap((catalog: any) => {
+ if (catalog.message && catalog.message.catalog && catalog.message.catalog['bpp/providers'].length > 0) {
+ const providers = catalog.message.catalog['bpp/providers']
+ return providers.flatMap((provider: any) => {
+ if (provider.items && provider.items.length > 0) {
+ return provider.items.map((item: RetailItem) => {
+ return {
+ bpp_id: catalog.context.bpp_id,
+ bpp_uri: catalog.context.bpp_uri,
+ ...item,
+ providerId: provider.id,
+ locations: provider.locations,
+ bppName: catalog.message.catalog['bpp/descriptor'].name
+ }
+ })
+ }
+ return []
+ })
+ }
+ return []
+ })
+
+ return allItems
+ }
+
+ const fetchDataForSearch = () => {
+ setIsLoading(true)
+ axios
+ .post(`${apiUrl}/client/v2/search`, searchPayload)
+ .then(res => {
+ const parsedSearchItems = transformData(res.data)
+ localStorage.setItem('searchItems', JSON.stringify(parsedSearchItems))
+ setItems(parsedSearchItems)
+ setIsLoading(false)
+ })
+ .catch(e => {
+ setIsLoading(false)
+ })
+ }
+
+ useEffect(() => {
+ if (searchKeyword) {
+ localStorage.removeItem('searchItems')
+ localStorage.setItem('optionTags', JSON.stringify({ name: searchKeyword }))
+ window.dispatchEvent(new Event('storage-optiontags'))
+ fetchDataForSearch()
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [searchKeyword])
+
+ useEffect(() => {
+ if (localStorage) {
+ const cachedSearchResults = localStorage.getItem('searchItems')
+ if (cachedSearchResults) {
+ const parsedCachedResults = JSON.parse(cachedSearchResults)
+ setItems(parsedCachedResults)
+ }
+ }
+ }, [])
+
+ const handleImageClick = () => {
+ setIsFilterOpen(!isFilterOpen)
+ }
+
+ return (
+ <>
+
+
+
+
+ {
+ setSearchKeyword(text)
+ localStorage.removeItem('optionTags')
+ localStorage.setItem(
+ 'optionTags',
+ JSON.stringify({
+ name: text
+ })
+ )
+ window.dispatchEvent(new Event('storage-optiontags'))
+ fetchDataForSearch()
+ }}
+ />
+
+
+ {isLoading ? (
+
+
+
+ ) : (
+
+ {items.map((item, idx) => {
+ const product = {
+ id: item.id,
+ images: item.descriptor.images,
+ name: item.descriptor.name,
+ price: item.price.value,
+ rating: '4'
+ }
+ return (
+ {
+ e.preventDefault()
+ if (typeof window !== 'undefined') {
+ const encodedProduct = window.btoa(toBinary(JSON.stringify(item)))
+ localStorage.setItem(
+ 'productDetails',
+ JSON.stringify({
+ encodedProduct: encodedProduct,
+ product: product
+ })
+ )
+
+ router.push({
+ pathname: '/product',
+ query: {
+ productDetails: encodedProduct
+ }
+ })
+ }
+ }}
+ product={product}
+ />
+ )
+ })}
+
+ )}
+
+
+ >
+ )
+}
+
+export default Search
diff --git a/apps/tourism/pages/invoiceDetails.tsx b/apps/tourism/pages/invoiceDetails.tsx
new file mode 100644
index 000000000..9109e7d12
--- /dev/null
+++ b/apps/tourism/pages/invoiceDetails.tsx
@@ -0,0 +1,111 @@
+import DetailsCard from '@beckn-ui/becknified-components/src/components/checkout/details-card'
+import React, { useEffect, useState } from 'react'
+import PaymentDetails from '@beckn-ui/becknified-components/src/components/checkout/payment-details'
+import Accordion from '@beckn-ui/molecules/src/components/accordion/Accordion'
+import Typography from '@beckn-ui/molecules/src/components/typography/typography'
+import { Box, Flex, HStack, Stack } from '@chakra-ui/react'
+import Qrcode from '@components/qrCode/Qrcode'
+import { useLanguage } from '@hooks/useLanguage'
+import { getPaymentBreakDown } from '@utils/checkout-utils'
+import { StatusResponseModel } from '../types/status.types'
+
+const invoiceDetails = () => {
+ const [statusData, setStatusData] = useState([])
+
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('statusResponse')) {
+ const parsedStatusResponse = JSON.parse(localStorage.getItem('statusResponse') as string)
+ setStatusData(parsedStatusResponse)
+ }
+ }, [])
+
+ if (!statusData.length) {
+ return <>>
+ }
+
+ const {
+ message: {
+ order: {
+ quote: {
+ price: { currency, value }
+ },
+ items
+ }
+ }
+ } = statusData[0]
+
+ const { name } = items
+
+ const { t } = useLanguage()
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default invoiceDetails
diff --git a/apps/tourism/pages/orderCancellation.tsx b/apps/tourism/pages/orderCancellation.tsx
new file mode 100644
index 000000000..33befadca
--- /dev/null
+++ b/apps/tourism/pages/orderCancellation.tsx
@@ -0,0 +1,74 @@
+import { Typography } from '@beckn-ui/molecules'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import { Box, Flex, Image, Text } from '@chakra-ui/react'
+import { useLanguage } from '@hooks/useLanguage'
+import { useRouter } from 'next/router'
+import React from 'react'
+
+const orderCancellation = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ router.push('/homePage')}
+ />
+ router.push('/orderDetails')}
+ />
+
+
+ )
+}
+
+export default orderCancellation
diff --git a/apps/tourism/pages/orderConfirmation.tsx b/apps/tourism/pages/orderConfirmation.tsx
new file mode 100644
index 000000000..723d425b2
--- /dev/null
+++ b/apps/tourism/pages/orderConfirmation.tsx
@@ -0,0 +1,110 @@
+import React, { useEffect, useState } from 'react'
+import { useRouter } from 'next/router'
+import orderConfirmmark from '../public/images/orderConfirmmark.svg'
+import { useLanguage } from '../hooks/useLanguage'
+import { ConfirmationPage } from '@beckn-ui/becknified-components'
+import { InitResponseModel } from '../types/init.types'
+import { getPayloadForConfirm, getPayloadForOrderHistoryPost } from '@utils/confirm-utils'
+import axios from 'axios'
+import { Box } from '@chakra-ui/react'
+import Cookies from 'js-cookie'
+import { ConfirmResponseModel } from '../types/confirm.types'
+import LoaderWithMessage from '@components/loader/LoaderWithMessage'
+
+const OrderConfirmation = () => {
+ const { t } = useLanguage()
+ const router = useRouter()
+ const [isLoading, setIsLoading] = useState(true)
+ const [confirmData, setConfirmData] = useState([])
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+ const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
+
+ const bearerToken = Cookies.get('authToken')
+ const axiosConfig = {
+ headers: {
+ Authorization: `Bearer ${bearerToken}`,
+ 'Content-Type': 'application/json' // You can set the content type as needed
+ }
+ }
+
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('initResult')) {
+ const parsedInitResult: InitResponseModel[] = JSON.parse(localStorage.getItem('initResult') as string)
+ const payLoad = getPayloadForConfirm(parsedInitResult)
+ setIsLoading(true)
+ axios
+ .post(`${apiUrl}/confirm`, payLoad)
+ .then(res => {
+ const responseData: ConfirmResponseModel[] = res.data.data
+ setConfirmData(responseData)
+ localStorage.setItem('confirmResponse', JSON.stringify(responseData))
+
+ setIsLoading(false)
+ })
+ .catch(err => {
+ setIsLoading(false)
+ console.error(err)
+ })
+ }
+ }, [])
+
+ useEffect(() => {
+ if (confirmData.length > 0) {
+ const ordersPayload = getPayloadForOrderHistoryPost(confirmData)
+ axios
+ .post(`${strapiUrl}/orders`, ordersPayload, axiosConfig)
+ .then(res => {
+ return res
+ })
+ .catch(err => console.error(err))
+ }
+ }, [confirmData])
+
+ if (isLoading) {
+ return (
+
+
+
+ )
+ }
+
+ return (
+ {
+ router.push('/orderDetails')
+ },
+ disabled: false,
+ variant: 'solid',
+ colorScheme: 'primary'
+ },
+ {
+ text: 'Go Back Home',
+ handleClick: () => {
+ router.push('/homePage')
+ },
+ disabled: false,
+ variant: 'outline',
+ colorScheme: 'primary'
+ }
+ ]
+ }}
+ />
+ )
+}
+
+export default OrderConfirmation
diff --git a/apps/tourism/pages/orderDetails.tsx b/apps/tourism/pages/orderDetails.tsx
new file mode 100644
index 000000000..d2e18aef5
--- /dev/null
+++ b/apps/tourism/pages/orderDetails.tsx
@@ -0,0 +1,790 @@
+import React, { useEffect, useState } from 'react'
+import axios from 'axios'
+import Router, { useRouter } from 'next/router'
+import { Box, Card, CardBody, Divider, Flex, Image, Radio, RadioGroup, Stack, Text, Textarea } from '@chakra-ui/react'
+import { BottomModal, Typography } from '@beckn-ui/molecules'
+import { DetailCard, OrderStatusProgress, OrderStatusProgressProps } from '@beckn-ui/becknified-components'
+import { StatusResponseModel, SupportModel } from '../types/status.types'
+import { useLanguage } from '@hooks/useLanguage'
+import { formatTimestamp, getPayloadForOrderStatus } from '@utils/confirm-utils'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+import BottomModalScan from '@components/BottomModal/BottomModalScan'
+import { ConfirmResponseModel } from '../types/confirm.types'
+import LoaderWithMessage from '@components/loader/LoaderWithMessage'
+import { UIState, DataState, ProcessState } from '../types/order-details.types'
+
+const OrderDetails = () => {
+ const [uiState, setUiState] = useState({
+ isProceedDisabled: true,
+ isLoading: true,
+ isLoadingForTrackAndSupport: false,
+ isMenuModalOpen: false,
+ isCancelMenuModalOpen: false,
+ isLoadingForCancel: false
+ })
+
+ const [data, setData] = useState({
+ confirmData: null,
+ statusData: [],
+ trackUrl: null,
+ supportData: null
+ })
+
+ const [processState, setProcessState] = useState({
+ apiCalled: false,
+ allOrderDelivered: false,
+ radioValue: ''
+ })
+ const router = useRouter()
+ const { t } = useLanguage()
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+ const [orderStatusMap, setOrderStatusMap] = useState([])
+ const [currentStatusLabel, setCurrentStatusLabel] = useState('')
+
+ useEffect(() => {
+ const storedOrderStatusMap = JSON.parse(localStorage.getItem('orderStatusMap') || '[]')
+ setOrderStatusMap(storedOrderStatusMap)
+ }, [])
+
+ useEffect(() => {
+ if (orderStatusMap.length > 0) {
+ localStorage.setItem('orderStatusMap', JSON.stringify(orderStatusMap))
+ setCurrentStatusLabel(orderStatusMap[orderStatusMap.length - 1].label)
+ }
+ }, [orderStatusMap])
+
+ useEffect(() => {
+ if (data.statusData.length > 0) {
+ const newData = data.statusData
+ .map((status: any) => ({
+ label: status?.message?.order?.fulfillments[0]?.state?.descriptor?.short_desc,
+ statusTime: status?.message?.order?.fulfillments[0]?.state?.updated_at
+ }))
+ .filter((status: any) => status.label)
+
+ const labelSet = new Set(orderStatusMap.map(status => status.label))
+ setOrderStatusMap(prevState => [...prevState, ...newData.filter(status => !labelSet.has(status.label))])
+ }
+ }, [data.statusData])
+
+ const orderCancelReason = [
+ { id: 1, reason: 'Merchant is taking too long' },
+ { id: 2, reason: 'Ordered by mistake' },
+ { id: 3, reason: 'I’ve changed my mind' },
+ { id: 4, reason: 'Other' }
+ ]
+
+ useEffect(() => {
+ if (localStorage && localStorage.getItem('confirmResponse')) {
+ const parsedConfirmData: ConfirmResponseModel[] = JSON.parse(localStorage.getItem('confirmResponse') as string)
+ setData(prevState => ({
+ ...prevState,
+ confirmData: parsedConfirmData
+ }))
+ }
+ }, [])
+
+ // Define functions to handle menu modal opening and closing
+ const handleMenuModalClose = () => {
+ setUiState(prevState => ({
+ ...prevState,
+ isMenuModalOpen: false
+ }))
+ }
+
+ const handleCancelMenuModalClose = () => {
+ setUiState(prevState => ({
+ ...prevState,
+ isCancelMenuModalOpen: false
+ }))
+ }
+
+ const handleCancelMenuModalOpen = () => {
+ setUiState(prevState => ({
+ ...prevState,
+ isCancelMenuModalOpen: true,
+ isMenuModalOpen: false
+ }))
+ }
+
+ const handleEmailCustomer = (email: string) => {
+ const subject = 'Regarding Your Order'
+ const body = 'Dear Customer,\n\n'
+
+ const mailtoLink = `mailto:${email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`
+
+ window.open(mailtoLink, '_blank')
+ setUiState(prevState => ({
+ ...prevState,
+ isMenuModalOpen: false
+ }))
+ }
+ const handleCallCustomer = (phoneNumber: string) => {
+ // Use tel: protocol to initiate the phone call
+ const telLink = `tel:${phoneNumber}`
+
+ // Open the phone app to initiate the call
+ window.open(telLink, '_blank')
+ setUiState(prevState => ({
+ ...prevState,
+ isMenuModalOpen: false
+ }))
+ }
+
+ // Define menu items for the main menu
+ const menuItems = (trackingUrl: string) => [
+ {
+ image: '/images/trackOrder.svg',
+ text: 'Track Order',
+ onClick: () => {
+ window.open(trackingUrl, '_blank')
+ }
+ },
+ {
+ image: '/images/updateOrder.svg',
+ text: 'Update Order',
+ onClick: () => {
+ Router.push('/updateShippingDetails')
+ }
+ },
+ {
+ image: '/images/cancelOrder.svg',
+ text: (
+
+ Cancel Order
+
+ ),
+ onClick: handleCancelMenuModalOpen
+ }
+ ]
+
+ // Define menu items for the call menu
+ const callMenuItem = (supportInfo: SupportModel) => [
+ {
+ image: '/images/callCustomer.svg',
+ text: 'Call Customer Service',
+ onClick: () => handleCallCustomer(supportInfo.phone)
+ },
+ {
+ image: '/images/emailCustomer.svg',
+ text: 'Email Customer Service',
+ onClick: () => handleEmailCustomer(supportInfo.email)
+ }
+ ]
+
+ // Fetch data on component
+ useEffect(() => {
+ const fetchData = () => {
+ if (localStorage && localStorage.getItem('selectedOrder')) {
+ const selectedOrderData = JSON.parse(localStorage.getItem('selectedOrder') as string)
+ const { bppId, bppUri, orderId } = selectedOrderData
+ const statusPayload = {
+ data: [
+ {
+ context: {
+ transaction_id: '',
+ bpp_id: bppId,
+ bpp_uri: bppUri,
+ domain: 'supply-chain-services:assembly'
+ },
+ message: {
+ order_id: orderId
+ }
+ }
+ ]
+ }
+ setUiState(prevState => ({
+ ...prevState,
+ isLoading: true
+ }))
+
+ return axios
+ .post(`${apiUrl}/status`, statusPayload)
+ .then(res => {
+ const resData = res.data.data
+ setData(prevState => ({
+ ...prevState,
+ statusData: resData
+ }))
+ localStorage.setItem('statusResponse', JSON.stringify(resData))
+ })
+ .catch(err => {
+ console.error('Error fetching order status:', err)
+ })
+ .finally(() => {
+ setUiState(prevState => ({
+ ...prevState,
+ isLoading: false
+ }))
+
+ setProcessState(prevState => ({
+ ...prevState,
+ apiCalled: true
+ }))
+ })
+ }
+ if (data.confirmData && data.confirmData.length > 0) {
+ const parsedConfirmData: ConfirmResponseModel[] = JSON.parse(localStorage.getItem('confirmResponse') as string)
+ const statusPayload = getPayloadForOrderStatus(parsedConfirmData)
+ setUiState(prevState => ({
+ ...prevState,
+ isLoading: true
+ }))
+
+ return axios
+ .post(`${apiUrl}/status`, statusPayload)
+ .then(res => {
+ const resData = res.data.data
+ setData(prevState => ({
+ ...prevState,
+ statusData: resData
+ }))
+
+ localStorage.setItem('statusResponse', JSON.stringify(resData))
+ })
+ .catch(err => {
+ console.error('Error fetching order status:', err)
+ })
+ .finally(() => {
+ setUiState(prevState => ({
+ ...prevState,
+ isLoading: false
+ }))
+ setProcessState(prevState => ({
+ ...prevState,
+ apiCalled: true
+ }))
+ })
+ }
+ }
+
+ fetchData()
+
+ const intervalId = setInterval(fetchData, 30000)
+
+ return () => clearInterval(intervalId)
+ }, [apiUrl, data.confirmData])
+
+ // Check if the order is delivered
+ const isDelivered = data.statusData?.[0]?.message?.order?.fulfillments?.[0]?.state?.descriptor?.code === 'DELIVERED'
+
+ useEffect(() => {
+ if (isDelivered) {
+ setProcessState(prevState => ({
+ ...prevState,
+ allOrderDelivered: true
+ }))
+ }
+ }, [isDelivered])
+
+ const handleOrderDotsClick = async () => {
+ setUiState(prevState => ({
+ ...prevState,
+ isLoadingForTrackAndSupport: true
+ }))
+
+ try {
+ setUiState(prevState => ({
+ ...prevState,
+ isMenuModalOpen: true
+ }))
+
+ if (data.confirmData && data.confirmData.length > 0) {
+ const { domain, bpp_id, bpp_uri, transaction_id } = data.confirmData[0].context
+ const orderId = data.confirmData[0].message.orderId
+ const trackPayload = {
+ data: [
+ {
+ context: {
+ domain: domain,
+ bpp_id: bpp_id,
+ bpp_uri: bpp_uri,
+ transaction_id: transaction_id
+ },
+ orderId,
+ callbackUrl: 'https://dhp-network-bap.becknprotocol.io/track/callback'
+ }
+ ]
+ }
+
+ const supportPayload = {
+ data: [
+ {
+ context: {
+ domain,
+ bpp_id,
+ bpp_uri,
+ transaction_id
+ },
+ message: {
+ order_id: orderId,
+ support: {
+ callback_phone: '+91-8858150053',
+ ref_id: '894789-43954',
+ phone: '+91 9988776543',
+ email: 'supportperson@gmail.com'
+ }
+ }
+ }
+ ]
+ }
+
+ const [trackResponse, supportResponse] = await Promise.all([
+ axios.post(`${apiUrl}/track`, trackPayload),
+ axios.post(`${apiUrl}/support`, supportPayload)
+ ])
+
+ if (trackResponse.data && supportResponse.data) {
+ setData(prevState => ({
+ ...prevState,
+ trackUrl: trackResponse.data.data[0].message.tracking.url,
+ supportData: {
+ email: supportResponse.data.data[0].message.support.email,
+ phone: supportResponse.data.data[0].message.support.phone
+ }
+ }))
+
+ setUiState(prevState => ({
+ ...prevState,
+ isLoadingForTrackAndSupport: false
+ }))
+ }
+ } else if (localStorage.getItem('selectedOrder') && localStorage.getItem('statusResponse')) {
+ const selectedOrderData = JSON.parse(localStorage.getItem('selectedOrder') as string)
+ const { bppId, bppUri, orderId } = selectedOrderData
+ const statusResponseData = JSON.parse(localStorage.getItem('statusResponse') as string)
+ const { domain, transaction_id } = statusResponseData[0].context
+ const trackPayload = {
+ data: [
+ {
+ context: {
+ domain: domain,
+ bpp_id: bppId,
+ bpp_uri: bppUri,
+ transaction_id: transaction_id
+ },
+ orderId,
+ callbackUrl: 'https://dhp-network-bap.becknprotocol.io/track/callback'
+ }
+ ]
+ }
+
+ const supportPayload = {
+ data: [
+ {
+ context: {
+ domain: domain,
+ bpp_id: bppId,
+ bpp_uri: bppUri,
+ transaction_id: transaction_id
+ },
+ message: {
+ order_id: orderId,
+ support: {
+ callback_phone: '+91-8858150053',
+ ref_id: '894789-43954',
+ phone: '+91 9988776543',
+ email: 'supportperson@gmail.com'
+ }
+ }
+ }
+ ]
+ }
+
+ const [trackResponse, supportResponse] = await Promise.all([
+ axios.post(`${apiUrl}/track`, trackPayload),
+ axios.post(`${apiUrl}/support`, supportPayload)
+ ])
+
+ if (trackResponse.data && supportResponse.data) {
+ setData(prevState => ({
+ ...prevState,
+ trackUrl: trackResponse.data.data[0].message.tracking.url,
+ supportData: {
+ email: supportResponse.data.data[0].message.support.email,
+ phone: supportResponse.data.data[0].message.support.phone
+ }
+ }))
+
+ setUiState(prevState => ({
+ ...prevState,
+ isLoadingForTrackAndSupport: false
+ }))
+ }
+ }
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ // Display loading state if data is still being fetched
+ if (uiState.isLoading && !processState.apiCalled) {
+ return (
+
+
+
+ )
+ }
+
+ if (!data.confirmData?.length && !localStorage.getItem('selectedOrder')) {
+ return <>>
+ }
+
+ const handleCancelButton = async (
+ confirmData: ConfirmResponseModel[] | null | undefined,
+ statusData: StatusResponseModel[],
+ cancellationReason: string
+ ) => {
+ try {
+ setUiState(prevState => ({
+ ...prevState,
+ isLoadingForCancel: true
+ }))
+
+ // console.log(confirmData)
+ if (confirmData && confirmData.length > 0) {
+ const { transaction_id, bpp_id, bpp_uri, domain } = confirmData[0].context
+ const orderId = confirmData[0].message.orderId
+ const cancelPayload = {
+ data: [
+ {
+ context: {
+ transaction_id,
+ bpp_id,
+ bpp_uri,
+ domain
+ },
+ message: {
+ order_id: orderId,
+ cancellation_reason_id: '4',
+ descriptor: {
+ short_desc: cancellationReason
+ }
+ }
+ }
+ ]
+ }
+
+ const cancelResponse = await axios.post(`${apiUrl}/cancel`, cancelPayload)
+
+ if (cancelResponse.data.data.length > 0) {
+ router.push('/orderCancellation')
+ }
+ } else if (statusData && statusData.length > 0 && localStorage.getItem('selectedOrder')) {
+ const selectedOrderData = JSON.parse(localStorage.getItem('selectedOrder') as string)
+ const { orderId } = selectedOrderData
+ const { transaction_id, bpp_id, bpp_uri, domain } = statusData[0].context
+ const cancelPayload = {
+ data: [
+ {
+ context: {
+ transaction_id,
+ bpp_id,
+ bpp_uri,
+ domain
+ },
+ message: {
+ order_id: orderId,
+ cancellation_reason_id: '4',
+ descriptor: {
+ short_desc: cancellationReason
+ }
+ }
+ }
+ ]
+ }
+
+ const cancelResponse = await axios.post(`${apiUrl}/cancel`, cancelPayload)
+ if (cancelResponse.data.data.length > 0) {
+ router.push('/orderCancellation')
+ }
+ }
+ } catch (error) {
+ console.error(error)
+ } finally {
+ setUiState(prevState => ({
+ ...prevState,
+ isLoadingForCancel: false
+ }))
+ }
+ }
+
+ return (
+
+ {processState.allOrderDelivered && (
+
+
+
+
+
+
+
+
+ router.push('/feedback')}
+ pl="10px"
+ color="#0560FA"
+ as={Typography}
+ text={t.rateUs}
+ />
+
+
+
+ )}
+
+ {/* Display progress summary */}
+
+
+
+
+ {/* Display order status details */}
+
+
+ <>
+
+
+
+
+
+
+
+
+
+ >
+
+
+ {/* Display order status progress */}
+
+ {orderStatusMap.map((status: OrderStatusProgressProps, index: number) => (
+
+ ))}
+
+
+
+
+ {/* Display main bottom modal */}
+
+ {uiState.isLoadingForTrackAndSupport ? (
+
+
+
+ ) : (
+
+ {menuItems(data.trackUrl as string).map((menuItem, index) => (
+
+
+
+
+ ))}
+
+ {callMenuItem(data.supportData as SupportModel).map((menuItem, index) => (
+
+
+
+
+ ))}
+
+ )}
+
+
+ {/* Display cancellation bottom modal */}
+
+ {uiState.isLoadingForCancel ? (
+
+ ) : (
+ <>
+
+ {
+ setProcessState(prevValue => ({
+ ...prevValue,
+ radioValue: value
+ }))
+ setUiState(prevValue => ({
+ ...prevValue,
+ isProceedDisabled: false
+ }))
+ }}
+ value={processState.radioValue}
+ pl="20px"
+ >
+ {orderCancelReason.map(reasonObj => (
+
+ {reasonObj.reason}
+
+ ))}
+
+
+
+ {
+ handleCancelButton(
+ data.confirmData as ConfirmResponseModel[],
+ data.statusData as StatusResponseModel[],
+ processState.radioValue
+ )
+ }}
+ />
+
+ >
+ )}
+
+
+ )
+}
+
+export default OrderDetails
diff --git a/apps/tourism/pages/orderHistory.tsx b/apps/tourism/pages/orderHistory.tsx
new file mode 100644
index 000000000..38779257d
--- /dev/null
+++ b/apps/tourism/pages/orderHistory.tsx
@@ -0,0 +1,157 @@
+import Cookies from 'js-cookie'
+import { DetailCard } from '@beckn-ui/becknified-components'
+import { Loader, Typography } from '@beckn-ui/molecules'
+import { Box, Text, Flex, Image } from '@chakra-ui/react'
+import React, { useEffect, useState } from 'react'
+import pendingIcon from '../public/images/pendingStatus.svg'
+import { orderHistoryData } from '../types/order-history.types'
+import { formatTimestamp } from '@utils/confirm-utils'
+import { useRouter } from 'next/router'
+import EmptyOrder from '@components/orderHistory/emptyOrder'
+
+const orderStatusMap: Record = {
+ 'In Review': 'Pending'
+}
+
+const OrderHistory = () => {
+ const [orderHistoryList, setOrderHistoryList] = useState([])
+ const [isLoading, setIsLoading] = useState(true)
+ const strapiUrl = process.env.NEXT_PUBLIC_STRAPI_URL
+ const [error, setError] = useState('')
+
+ const bearerToken = Cookies.get('authToken')
+ const router = useRouter()
+
+ useEffect(() => {
+ let myHeaders = new Headers()
+ myHeaders.append('Authorization', `Bearer ${bearerToken}`)
+
+ let requestOptions: RequestInit = {
+ method: 'GET',
+ headers: myHeaders,
+ redirect: 'follow'
+ }
+ fetch(`${strapiUrl}/orders?filters[category]=5`, requestOptions)
+ .then(response => response.json())
+ .then(result => {
+ console.log('resluttt', result)
+ if (result.error) {
+ return setError(result.error.message)
+ }
+ setOrderHistoryList(result.data)
+ setIsLoading(false)
+ })
+ .catch(error => {
+ setIsLoading(false)
+ })
+ .finally(() => setIsLoading(false))
+ }, [])
+
+ if (isLoading) {
+ return (
+
+
+
+ )
+ }
+
+ if (error.length) {
+ return (
+
+
+ {error}
+
+
+ )
+ }
+
+ return (
+
+ {!orderHistoryList.length ? (
+
+ ) : (
+
+ {orderHistoryList.map((order, idx) => {
+ return (
+
+ {
+ const orderObjectForStatusCall = {
+ bppId: order.attributes.bpp_id,
+ bppUri: order.attributes.bpp_uri,
+ orderId: order.attributes.order_id
+ }
+ localStorage.setItem('selectedOrder', JSON.stringify(orderObjectForStatusCall))
+ router.push('/orderDetails')
+ }}
+ gap={'5px'}
+ flexDirection={'column'}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ {orderStatusMap[order.attributes.delivery_status]}
+
+
+
+
+ )
+ })}
+
+ )}
+
+ )
+}
+
+export default OrderHistory
diff --git a/apps/tourism/pages/paymentMode.tsx b/apps/tourism/pages/paymentMode.tsx
new file mode 100644
index 000000000..63d390a1d
--- /dev/null
+++ b/apps/tourism/pages/paymentMode.tsx
@@ -0,0 +1,114 @@
+import React, { useState } from 'react'
+import { Box, Flex, Text, Image, Card, CardBody, useTheme } from '@chakra-ui/react'
+import { useRouter } from 'next/router'
+import CardWithCheckBox from '../components/card/Card'
+import CardWithUnchecked from '../components/card/CardUncked'
+import { useLanguage } from '../hooks/useLanguage'
+import phonePay from '../public/images/phonePayPayment.svg'
+import CashOnDelivery from '../public/images/cash.svg'
+import Visa from '../public/images/visa.svg'
+import masterCard from '../public/images/masterCard.svg'
+
+import NetBanking from '../public/images/netbanking.svg'
+import BecknButton from '@beckn-ui/molecules/src/components/button/Button'
+
+function PaymentMode() {
+ const [checked, setChecked] = useState(false)
+
+ const { t } = useLanguage()
+ const router = useRouter()
+
+ return (
+ <>
+
+
+
+
+ {t.cards}
+
+
+ {t.addCard}
+
+
+
+
+
+ {t.upi}
+
+
+ {t.addCard}
+
+
+
+
+
+
+
+
+
+
+
+ {t.other}
+
+
+
+
+
+ router.push('/orderConfirmation')}
+ disabled={!checked}
+ />
+
+ >
+ )
+}
+
+export default PaymentMode
diff --git a/apps/tourism/pages/product.tsx b/apps/tourism/pages/product.tsx
new file mode 100644
index 000000000..b9854dd43
--- /dev/null
+++ b/apps/tourism/pages/product.tsx
@@ -0,0 +1,40 @@
+import Router from 'next/router'
+import React, { useEffect, useState } from 'react'
+import { ProductDetailPage } from '@beckn-ui/becknified-components'
+import { RetailItem } from '@lib/products'
+import { fromBinary } from '@utils/common-utils'
+
+const Product = () => {
+ const [product, setProduct] = useState(null)
+
+ console.log('Dank', product)
+
+ useEffect(() => {
+ const { productDetails } = Router.query
+ if (productDetails) {
+ setProduct(JSON.parse(fromBinary(window.atob(productDetails as string))))
+ }
+ }, [])
+
+ if (!product) {
+ return <>>
+ }
+
+ return (
+
+ )
+}
+
+export default Product
diff --git a/apps/tourism/pages/profile.tsx b/apps/tourism/pages/profile.tsx
new file mode 100644
index 000000000..f2995b69d
--- /dev/null
+++ b/apps/tourism/pages/profile.tsx
@@ -0,0 +1,128 @@
+import { BecknAuth } from '@beckn-ui/becknified-components'
+import { Box } from '@chakra-ui/react'
+import { profilePageProp } from '@components/signIn/SignIn.types'
+import { useLanguage } from '@hooks/useLanguage'
+import React, { useState } from 'react'
+
+const ProfilePage = () => {
+ const { t } = useLanguage()
+ const [formData, setFormData] = useState({
+ name: '',
+ mobileNumber: '',
+ email: '',
+ flatNumber: '',
+ street: '',
+ city: '',
+ pincode: '',
+ state: '',
+ country: ''
+ })
+ const [formErrors, setFormErrors] = useState({
+ name: '',
+ mobileNumber: '',
+ email: '',
+ flatNumber: '',
+ street: '',
+ city: '',
+ pincode: '',
+ state: '',
+ country: ''
+ })
+ return (
+
+ {},
+ disabled: false,
+ variant: 'solid',
+ colorScheme: 'primary'
+ }
+ ],
+ inputs: [
+ {
+ type: 'text',
+ name: 'name',
+ value: formData.name,
+ handleChange: () => {},
+ label: t.fullName,
+ error: formErrors.name
+ },
+ {
+ type: 'number',
+ name: 'mobileNumber',
+ value: formData.mobileNumber,
+ handleChange: () => {},
+ label: t.enterMobileNumber,
+ error: formErrors.mobileNumber
+ },
+ {
+ type: 'text',
+ name: 'email',
+ value: formData.email,
+ handleChange: () => {},
+ label: t.enterEmailID,
+ error: formErrors.email
+ },
+ {
+ type: 'text',
+ name: 'enterFlatDetails',
+ value: formData.flatNumber,
+ handleChange: () => {},
+ label: t.enterFlatDetails,
+ error: formErrors.flatNumber
+ },
+ {
+ type: 'text',
+ name: 'enterStreetDetails',
+ value: formData.street,
+ handleChange: () => {},
+ label: t.enterStreetDetails,
+ error: formErrors.street
+ },
+ {
+ type: 'text',
+ name: 'city',
+ value: formData.city,
+ handleChange: () => {},
+ label: t.enterCity,
+ error: formErrors.city
+ },
+ {
+ type: 'text',
+ name: 'pincode',
+ value: formData.pincode,
+ handleChange: () => {},
+ label: t.enterPincode,
+ error: formErrors.pincode
+ },
+ {
+ type: 'text',
+ name: 'state',
+ value: formData.state,
+ handleChange: () => {},
+ label: t.enterState,
+ error: formErrors.state
+ },
+ {
+ type: 'text',
+ name: 'country',
+ value: formData.country,
+ handleChange: () => {},
+ label: t.enterCountry,
+ error: formErrors.country
+ }
+ ]
+ }}
+ />
+
+ )
+}
+
+export default ProfilePage
diff --git a/apps/tourism/pages/updateShippingDetails.tsx b/apps/tourism/pages/updateShippingDetails.tsx
new file mode 100644
index 000000000..9a3e25efc
--- /dev/null
+++ b/apps/tourism/pages/updateShippingDetails.tsx
@@ -0,0 +1,163 @@
+import React, { useEffect, useState } from 'react'
+import ShippingForm from '@beckn-ui/becknified-components/src/components/checkout/shipping-form'
+import { Box, Text } from '@chakra-ui/react'
+import { ConfirmResponseModel } from '../types/confirm.types'
+import axios from 'axios'
+import { Loader, Typography } from '@beckn-ui/molecules'
+import { useLanguage } from '@hooks/useLanguage'
+import { useRouter } from 'next/router'
+
+const UpdateShippingDetails = () => {
+ const [shippingDetails, setShippingDetails] = useState({
+ name: '',
+ mobileNumber: '',
+ email: '',
+ address: '',
+ pinCode: ''
+ })
+ const [confirmData, setConfirmData] = useState(null)
+ const [isLoadingForUpdate, setIsLoadingForUpdate] = useState(false)
+ const { t } = useLanguage()
+ const router = useRouter()
+
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL
+
+ useEffect(() => {
+ if (typeof window !== 'undefined' && localStorage && localStorage.getItem('confirmResponse')) {
+ const parsedConfirmData: ConfirmResponseModel[] = JSON.parse(localStorage.getItem('confirmResponse') as string)
+ setConfirmData(parsedConfirmData)
+ }
+ }, [])
+
+ const handleSubmit = async (formData: any, confirmData: ConfirmResponseModel[]) => {
+ try {
+ setIsLoadingForUpdate(true)
+ if (confirmData && confirmData.length > 0) {
+ const { domain, bpp_id, bpp_uri, transaction_id } = confirmData[0].context
+ const orderId = confirmData[0].message.orderId
+ const { name, address, email, mobileNumber } = formData
+ const updateRequestPayload = {
+ data: [
+ {
+ context: {
+ domain,
+ bpp_id,
+ bpp_uri,
+ transaction_id
+ },
+ orderId,
+ updateDetails: {
+ updateTarget: 'order.billing',
+
+ billing: {
+ name: name,
+ address: address,
+ email: email,
+ phone: mobileNumber
+ }
+ }
+ }
+ ]
+ }
+ const updateResponse = await axios.post(`${apiUrl}/update`, updateRequestPayload)
+ if (updateResponse.data.data.length > 0) {
+ router.push('/orderDetails')
+ }
+ } else if (localStorage.getItem('selectedOrder') && localStorage.getItem('statusResponse')) {
+ const statusResponseData = JSON.parse(localStorage.getItem('statusResponse') as string)
+ const { domain, transaction_id, bpp_id, bpp_uri } = statusResponseData[0].context
+ const selectedOrderData = JSON.parse(localStorage.getItem('selectedOrder') as string)
+ const { orderId } = selectedOrderData
+ const { name, address, email, mobileNumber } = formData
+ const updateRequestPayload = {
+ data: [
+ {
+ context: {
+ domain,
+ bpp_id,
+ bpp_uri,
+ transaction_id
+ },
+ orderId,
+ updateDetails: {
+ updateTarget: 'order.billing',
+
+ billing: {
+ name: name,
+ address: address,
+ email: email,
+ phone: mobileNumber
+ }
+ }
+ }
+ ]
+ }
+ const updateResponse = await axios.post(`${apiUrl}/update`, updateRequestPayload)
+ if (updateResponse.data.data.length > 0) {
+ router.push('/orderDetails')
+ }
+ }
+ } catch (error) {
+ console.error('error in update', error)
+ }
+ }
+
+ const handleFormChange = (changedData: any) => {
+ setShippingDetails(prevDetails => ({ ...prevDetails, ...changedData }))
+ }
+
+ if (typeof window === 'undefined' || (!confirmData?.length && !localStorage.getItem('selectedOrder'))) {
+ return <>>
+ }
+ if (isLoadingForUpdate) {
+ return (
+
+
+
+
+
+
+
+
+
+ )
+ }
+
+ return (
+
+ handleSubmit(shippingDetails, confirmData)}
+ values={shippingDetails}
+ onChange={handleFormChange}
+ submitButton={{ text: 'Submit' }}
+ />
+
+ )
+}
+
+export default UpdateShippingDetails
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebblack.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebblack.ttf
new file mode 100644
index 000000000..580c70004
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebblack.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebbold.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebbold.ttf
new file mode 100644
index 000000000..1c6bbd43b
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebbold.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebextrablack.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebextrablack.ttf
new file mode 100644
index 000000000..b85362bce
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebextrablack.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebextrabold.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebextrabold.ttf
new file mode 100644
index 000000000..b3e78a7bc
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebextrabold.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanweblight.ttf b/apps/tourism/public/fonts/ttf/iranyekanweblight.ttf
new file mode 100644
index 000000000..9e81193e3
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanweblight.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebmedium.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebmedium.ttf
new file mode 100644
index 000000000..4dc2ad776
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebmedium.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebregular.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebregular.ttf
new file mode 100644
index 000000000..fc0ba6806
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebregular.ttf differ
diff --git a/apps/tourism/public/fonts/ttf/iranyekanwebthin.ttf b/apps/tourism/public/fonts/ttf/iranyekanwebthin.ttf
new file mode 100644
index 000000000..e2bc63773
Binary files /dev/null and b/apps/tourism/public/fonts/ttf/iranyekanwebthin.ttf differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebblack.woff b/apps/tourism/public/fonts/woff/iranyekanwebblack.woff
new file mode 100644
index 000000000..7deeec932
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebblack.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebbold.woff b/apps/tourism/public/fonts/woff/iranyekanwebbold.woff
new file mode 100644
index 000000000..7707c6f1c
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebbold.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebextrablack.woff b/apps/tourism/public/fonts/woff/iranyekanwebextrablack.woff
new file mode 100644
index 000000000..bbd1827a4
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebextrablack.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebextrabold.woff b/apps/tourism/public/fonts/woff/iranyekanwebextrabold.woff
new file mode 100644
index 000000000..bc49fb0a7
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebextrabold.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanweblight.woff b/apps/tourism/public/fonts/woff/iranyekanweblight.woff
new file mode 100644
index 000000000..af6daaa1b
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanweblight.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebmedium.woff b/apps/tourism/public/fonts/woff/iranyekanwebmedium.woff
new file mode 100644
index 000000000..84896bbf8
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebmedium.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebregular.woff b/apps/tourism/public/fonts/woff/iranyekanwebregular.woff
new file mode 100644
index 000000000..bfbe54766
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebregular.woff differ
diff --git a/apps/tourism/public/fonts/woff/iranyekanwebthin.woff b/apps/tourism/public/fonts/woff/iranyekanwebthin.woff
new file mode 100644
index 000000000..c5c9ae117
Binary files /dev/null and b/apps/tourism/public/fonts/woff/iranyekanwebthin.woff differ
diff --git a/apps/tourism/public/images/3-dots.svg b/apps/tourism/public/images/3-dots.svg
new file mode 100644
index 000000000..11ebe1d44
--- /dev/null
+++ b/apps/tourism/public/images/3-dots.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/Back.svg b/apps/tourism/public/images/Back.svg
new file mode 100644
index 000000000..fdfc2e98d
--- /dev/null
+++ b/apps/tourism/public/images/Back.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/CallphoneIcon.svg b/apps/tourism/public/images/CallphoneIcon.svg
new file mode 100644
index 000000000..c97f09332
--- /dev/null
+++ b/apps/tourism/public/images/CallphoneIcon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/CenterMarker.svg b/apps/tourism/public/images/CenterMarker.svg
new file mode 100644
index 000000000..55bb20190
--- /dev/null
+++ b/apps/tourism/public/images/CenterMarker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/CommerceLogo.svg b/apps/tourism/public/images/CommerceLogo.svg
new file mode 100644
index 000000000..aa94e2354
--- /dev/null
+++ b/apps/tourism/public/images/CommerceLogo.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/ENABLE LOCATION.svg b/apps/tourism/public/images/ENABLE LOCATION.svg
new file mode 100644
index 000000000..6056f6ec9
--- /dev/null
+++ b/apps/tourism/public/images/ENABLE LOCATION.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/EmptyInbox.svg b/apps/tourism/public/images/EmptyInbox.svg
new file mode 100644
index 000000000..37883e3cb
--- /dev/null
+++ b/apps/tourism/public/images/EmptyInbox.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/Hamburger1.svg b/apps/tourism/public/images/Hamburger1.svg
new file mode 100644
index 000000000..b65a4e6c3
--- /dev/null
+++ b/apps/tourism/public/images/Hamburger1.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/Home_icon.svg b/apps/tourism/public/images/Home_icon.svg
new file mode 100644
index 000000000..eba1b5dd3
--- /dev/null
+++ b/apps/tourism/public/images/Home_icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/Indicator.svg b/apps/tourism/public/images/Indicator.svg
new file mode 100644
index 000000000..59c5a3233
--- /dev/null
+++ b/apps/tourism/public/images/Indicator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/Kuza-mini.svg b/apps/tourism/public/images/Kuza-mini.svg
new file mode 100644
index 000000000..209d95a00
--- /dev/null
+++ b/apps/tourism/public/images/Kuza-mini.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/KuzaLogo.svg b/apps/tourism/public/images/KuzaLogo.svg
new file mode 100644
index 000000000..08da01c62
--- /dev/null
+++ b/apps/tourism/public/images/KuzaLogo.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/LocateMe.svg b/apps/tourism/public/images/LocateMe.svg
new file mode 100644
index 000000000..291dcb9d7
--- /dev/null
+++ b/apps/tourism/public/images/LocateMe.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/Location.svg b/apps/tourism/public/images/Location.svg
new file mode 100644
index 000000000..4161bac05
--- /dev/null
+++ b/apps/tourism/public/images/Location.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/LocationIcon2.svg b/apps/tourism/public/images/LocationIcon2.svg
new file mode 100644
index 000000000..136855e8c
--- /dev/null
+++ b/apps/tourism/public/images/LocationIcon2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/LoginIcon.svg b/apps/tourism/public/images/LoginIcon.svg
new file mode 100644
index 000000000..51630a1a2
--- /dev/null
+++ b/apps/tourism/public/images/LoginIcon.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/Logo.svg b/apps/tourism/public/images/Logo.svg
new file mode 100755
index 000000000..f1d0341b8
--- /dev/null
+++ b/apps/tourism/public/images/Logo.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/Payment.svg b/apps/tourism/public/images/Payment.svg
new file mode 100644
index 000000000..129527bc1
--- /dev/null
+++ b/apps/tourism/public/images/Payment.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/SearchIcon1.svg b/apps/tourism/public/images/SearchIcon1.svg
new file mode 100644
index 000000000..0064005e6
--- /dev/null
+++ b/apps/tourism/public/images/SearchIcon1.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/SelectedMarker.svg b/apps/tourism/public/images/SelectedMarker.svg
new file mode 100644
index 000000000..3fe4e3b0f
--- /dev/null
+++ b/apps/tourism/public/images/SelectedMarker.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/Star.svg b/apps/tourism/public/images/Star.svg
new file mode 100644
index 000000000..9dd37060e
--- /dev/null
+++ b/apps/tourism/public/images/Star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/Suppliflow_app_logo.svg b/apps/tourism/public/images/Suppliflow_app_logo.svg
new file mode 100644
index 000000000..3258064f2
--- /dev/null
+++ b/apps/tourism/public/images/Suppliflow_app_logo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/Suppliflow_logo.svg b/apps/tourism/public/images/Suppliflow_logo.svg
new file mode 100644
index 000000000..99b57a518
--- /dev/null
+++ b/apps/tourism/public/images/Suppliflow_logo.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/TrackIcon.svg b/apps/tourism/public/images/TrackIcon.svg
new file mode 100644
index 000000000..86a42f6bc
--- /dev/null
+++ b/apps/tourism/public/images/TrackIcon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/about-me.svg b/apps/tourism/public/images/about-me.svg
new file mode 100644
index 000000000..4510b2b9c
--- /dev/null
+++ b/apps/tourism/public/images/about-me.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/tourism/public/images/addShippingBtn.svg b/apps/tourism/public/images/addShippingBtn.svg
new file mode 100644
index 000000000..c5f1d38cb
--- /dev/null
+++ b/apps/tourism/public/images/addShippingBtn.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/backArrow.svg b/apps/tourism/public/images/backArrow.svg
new file mode 100644
index 000000000..34d26add1
--- /dev/null
+++ b/apps/tourism/public/images/backArrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/banners-img/home1.webp b/apps/tourism/public/images/banners-img/home1.webp
new file mode 100644
index 000000000..4cf2cd2e7
Binary files /dev/null and b/apps/tourism/public/images/banners-img/home1.webp differ
diff --git a/apps/tourism/public/images/banners-img/home2.webp b/apps/tourism/public/images/banners-img/home2.webp
new file mode 100644
index 000000000..a3bf3a119
Binary files /dev/null and b/apps/tourism/public/images/banners-img/home2.webp differ
diff --git a/apps/tourism/public/images/benefit-icons/003-cash-on-delivery.webp b/apps/tourism/public/images/benefit-icons/003-cash-on-delivery.webp
new file mode 100644
index 000000000..31c8308f9
Binary files /dev/null and b/apps/tourism/public/images/benefit-icons/003-cash-on-delivery.webp differ
diff --git a/apps/tourism/public/images/benefit-icons/004-headphones.webp b/apps/tourism/public/images/benefit-icons/004-headphones.webp
new file mode 100644
index 000000000..110d1a259
Binary files /dev/null and b/apps/tourism/public/images/benefit-icons/004-headphones.webp differ
diff --git a/apps/tourism/public/images/benefit-icons/005-delivery-truck-2.webp b/apps/tourism/public/images/benefit-icons/005-delivery-truck-2.webp
new file mode 100644
index 000000000..ee8918b55
Binary files /dev/null and b/apps/tourism/public/images/benefit-icons/005-delivery-truck-2.webp differ
diff --git a/apps/tourism/public/images/benefit-icons/006-best-seller.webp b/apps/tourism/public/images/benefit-icons/006-best-seller.webp
new file mode 100644
index 000000000..d8663f3d6
Binary files /dev/null and b/apps/tourism/public/images/benefit-icons/006-best-seller.webp differ
diff --git a/apps/tourism/public/images/benefit-icons/007-return.webp b/apps/tourism/public/images/benefit-icons/007-return.webp
new file mode 100644
index 000000000..95a6a6851
Binary files /dev/null and b/apps/tourism/public/images/benefit-icons/007-return.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/adidas.webp b/apps/tourism/public/images/brand-logo-img/adidas.webp
new file mode 100644
index 000000000..3a2de2337
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/adidas.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/apple.webp b/apps/tourism/public/images/brand-logo-img/apple.webp
new file mode 100644
index 000000000..672bf9c71
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/apple.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/asus.webp b/apps/tourism/public/images/brand-logo-img/asus.webp
new file mode 100644
index 000000000..a0ab3ce4e
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/asus.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/benq.webp b/apps/tourism/public/images/brand-logo-img/benq.webp
new file mode 100644
index 000000000..1e6fce58a
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/benq.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/bvlgari.webp b/apps/tourism/public/images/brand-logo-img/bvlgari.webp
new file mode 100644
index 000000000..b99e72b42
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/bvlgari.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/del.webp b/apps/tourism/public/images/brand-logo-img/del.webp
new file mode 100644
index 000000000..c0f517acf
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/del.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/dior.webp b/apps/tourism/public/images/brand-logo-img/dior.webp
new file mode 100644
index 000000000..8c6284357
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/dior.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/dolce-gabbana.webp b/apps/tourism/public/images/brand-logo-img/dolce-gabbana.webp
new file mode 100644
index 000000000..a8446fba8
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/dolce-gabbana.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/gucci.webp b/apps/tourism/public/images/brand-logo-img/gucci.webp
new file mode 100644
index 000000000..d4284a7e4
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/gucci.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/hp.webp b/apps/tourism/public/images/brand-logo-img/hp.webp
new file mode 100644
index 000000000..37148242d
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/hp.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/lg.webp b/apps/tourism/public/images/brand-logo-img/lg.webp
new file mode 100644
index 000000000..5cbe5f924
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/lg.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/loreal.webp b/apps/tourism/public/images/brand-logo-img/loreal.webp
new file mode 100644
index 000000000..eefddd54c
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/loreal.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/louis-vuitton.webp b/apps/tourism/public/images/brand-logo-img/louis-vuitton.webp
new file mode 100644
index 000000000..119a84ce0
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/louis-vuitton.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/mac.webp b/apps/tourism/public/images/brand-logo-img/mac.webp
new file mode 100644
index 000000000..77f643627
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/mac.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/maybelline.webp b/apps/tourism/public/images/brand-logo-img/maybelline.webp
new file mode 100644
index 000000000..432b93349
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/maybelline.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/msi.webp b/apps/tourism/public/images/brand-logo-img/msi.webp
new file mode 100644
index 000000000..9b8a70d5f
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/msi.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/patek-philippe.webp b/apps/tourism/public/images/brand-logo-img/patek-philippe.webp
new file mode 100644
index 000000000..eddcbe9fa
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/patek-philippe.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/puma.webp b/apps/tourism/public/images/brand-logo-img/puma.webp
new file mode 100644
index 000000000..52f10e3d3
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/puma.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/rolex.webp b/apps/tourism/public/images/brand-logo-img/rolex.webp
new file mode 100644
index 000000000..09e40c503
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/rolex.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/samsung.webp b/apps/tourism/public/images/brand-logo-img/samsung.webp
new file mode 100644
index 000000000..0bebd9942
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/samsung.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/sony.webp b/apps/tourism/public/images/brand-logo-img/sony.webp
new file mode 100644
index 000000000..e1201af40
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/sony.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/toshiba.webp b/apps/tourism/public/images/brand-logo-img/toshiba.webp
new file mode 100644
index 000000000..b7ae263c8
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/toshiba.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/versace.webp b/apps/tourism/public/images/brand-logo-img/versace.webp
new file mode 100644
index 000000000..f6d9b34a2
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/versace.webp differ
diff --git a/apps/tourism/public/images/brand-logo-img/xiaomi.webp b/apps/tourism/public/images/brand-logo-img/xiaomi.webp
new file mode 100644
index 000000000..f0fb4a0ba
Binary files /dev/null and b/apps/tourism/public/images/brand-logo-img/xiaomi.webp differ
diff --git a/apps/tourism/public/images/callCustomer.svg b/apps/tourism/public/images/callCustomer.svg
new file mode 100644
index 000000000..97caacac1
--- /dev/null
+++ b/apps/tourism/public/images/callCustomer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/cancelOrder.svg b/apps/tourism/public/images/cancelOrder.svg
new file mode 100644
index 000000000..20adb8e24
--- /dev/null
+++ b/apps/tourism/public/images/cancelOrder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/cancelled.svg b/apps/tourism/public/images/cancelled.svg
new file mode 100644
index 000000000..3718aabf8
--- /dev/null
+++ b/apps/tourism/public/images/cancelled.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/cancleHomeImg.svg b/apps/tourism/public/images/cancleHomeImg.svg
new file mode 100644
index 000000000..1a1dd297e
--- /dev/null
+++ b/apps/tourism/public/images/cancleHomeImg.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/carouselBox-bg/offersbg.webp b/apps/tourism/public/images/carouselBox-bg/offersbg.webp
new file mode 100644
index 000000000..cd3323725
Binary files /dev/null and b/apps/tourism/public/images/carouselBox-bg/offersbg.webp differ
diff --git a/apps/tourism/public/images/cartIcon.svg b/apps/tourism/public/images/cartIcon.svg
new file mode 100644
index 000000000..ad3dd8f5f
--- /dev/null
+++ b/apps/tourism/public/images/cartIcon.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/cash.svg b/apps/tourism/public/images/cash.svg
new file mode 100644
index 000000000..c8ff1fe72
--- /dev/null
+++ b/apps/tourism/public/images/cash.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/beauty-category.webp b/apps/tourism/public/images/category-icon/beauty-category.webp
new file mode 100644
index 000000000..8c5a23894
Binary files /dev/null and b/apps/tourism/public/images/category-icon/beauty-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/beverages.svg b/apps/tourism/public/images/category-icon/beverages.svg
new file mode 100644
index 000000000..eeccb0cc0
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/beverages.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/dairy.svg b/apps/tourism/public/images/category-icon/dairy.svg
new file mode 100644
index 000000000..f4d02d71a
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/dairy.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/digital-category.webp b/apps/tourism/public/images/category-icon/digital-category.webp
new file mode 100644
index 000000000..3ce128a49
Binary files /dev/null and b/apps/tourism/public/images/category-icon/digital-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/fashion-category.webp b/apps/tourism/public/images/category-icon/fashion-category.webp
new file mode 100644
index 000000000..48bbee6f6
Binary files /dev/null and b/apps/tourism/public/images/category-icon/fashion-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/frozen-food.svg b/apps/tourism/public/images/category-icon/frozen-food.svg
new file mode 100644
index 000000000..e0bdd2cff
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/frozen-food.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/fruits-Vegetable.svg b/apps/tourism/public/images/category-icon/fruits-Vegetable.svg
new file mode 100644
index 000000000..655d9a972
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/fruits-Vegetable.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/house-category.webp b/apps/tourism/public/images/category-icon/house-category.webp
new file mode 100644
index 000000000..c499ddef4
Binary files /dev/null and b/apps/tourism/public/images/category-icon/house-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/meat-and-fish.svg b/apps/tourism/public/images/category-icon/meat-and-fish.svg
new file mode 100644
index 000000000..99ab975c9
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/meat-and-fish.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/snacks.svg b/apps/tourism/public/images/category-icon/snacks.svg
new file mode 100644
index 000000000..d58ae27cd
--- /dev/null
+++ b/apps/tourism/public/images/category-icon/snacks.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-icon/sport-category.webp b/apps/tourism/public/images/category-icon/sport-category.webp
new file mode 100644
index 000000000..5f4914d09
Binary files /dev/null and b/apps/tourism/public/images/category-icon/sport-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/stationery-category.webp b/apps/tourism/public/images/category-icon/stationery-category.webp
new file mode 100644
index 000000000..4922f810a
Binary files /dev/null and b/apps/tourism/public/images/category-icon/stationery-category.webp differ
diff --git a/apps/tourism/public/images/category-icon/toy-category.webp b/apps/tourism/public/images/category-icon/toy-category.webp
new file mode 100644
index 000000000..31c27954b
Binary files /dev/null and b/apps/tourism/public/images/category-icon/toy-category.webp differ
diff --git a/apps/tourism/public/images/category-img/beauty-category.webp b/apps/tourism/public/images/category-img/beauty-category.webp
new file mode 100644
index 000000000..ff40bdc4d
Binary files /dev/null and b/apps/tourism/public/images/category-img/beauty-category.webp differ
diff --git a/apps/tourism/public/images/category-img/beverages.svg b/apps/tourism/public/images/category-img/beverages.svg
new file mode 100644
index 000000000..eeccb0cc0
--- /dev/null
+++ b/apps/tourism/public/images/category-img/beverages.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/dairy.svg b/apps/tourism/public/images/category-img/dairy.svg
new file mode 100644
index 000000000..f4d02d71a
--- /dev/null
+++ b/apps/tourism/public/images/category-img/dairy.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/digital-category.webp b/apps/tourism/public/images/category-img/digital-category.webp
new file mode 100644
index 000000000..603b56c20
Binary files /dev/null and b/apps/tourism/public/images/category-img/digital-category.webp differ
diff --git a/apps/tourism/public/images/category-img/fashion-category.webp b/apps/tourism/public/images/category-img/fashion-category.webp
new file mode 100644
index 000000000..757c50c04
Binary files /dev/null and b/apps/tourism/public/images/category-img/fashion-category.webp differ
diff --git a/apps/tourism/public/images/category-img/frozen-food.svg b/apps/tourism/public/images/category-img/frozen-food.svg
new file mode 100644
index 000000000..e0bdd2cff
--- /dev/null
+++ b/apps/tourism/public/images/category-img/frozen-food.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/fruitsAndVegetables.svg b/apps/tourism/public/images/category-img/fruitsAndVegetables.svg
new file mode 100644
index 000000000..655d9a972
--- /dev/null
+++ b/apps/tourism/public/images/category-img/fruitsAndVegetables.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/house-category.webp b/apps/tourism/public/images/category-img/house-category.webp
new file mode 100644
index 000000000..bea3bbfff
Binary files /dev/null and b/apps/tourism/public/images/category-img/house-category.webp differ
diff --git a/apps/tourism/public/images/category-img/meat-and-fish.svg b/apps/tourism/public/images/category-img/meat-and-fish.svg
new file mode 100644
index 000000000..99ab975c9
--- /dev/null
+++ b/apps/tourism/public/images/category-img/meat-and-fish.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/snacks.svg b/apps/tourism/public/images/category-img/snacks.svg
new file mode 100644
index 000000000..d58ae27cd
--- /dev/null
+++ b/apps/tourism/public/images/category-img/snacks.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/category-img/sport-category.webp b/apps/tourism/public/images/category-img/sport-category.webp
new file mode 100644
index 000000000..b611c1906
Binary files /dev/null and b/apps/tourism/public/images/category-img/sport-category.webp differ
diff --git a/apps/tourism/public/images/category-img/stationery-category.webp b/apps/tourism/public/images/category-img/stationery-category.webp
new file mode 100644
index 000000000..03c8aca22
Binary files /dev/null and b/apps/tourism/public/images/category-img/stationery-category.webp differ
diff --git a/apps/tourism/public/images/category-img/toy-category.webp b/apps/tourism/public/images/category-img/toy-category.webp
new file mode 100644
index 000000000..fbbe2f9aa
Binary files /dev/null and b/apps/tourism/public/images/category-img/toy-category.webp differ
diff --git a/apps/tourism/public/images/completed.svg b/apps/tourism/public/images/completed.svg
new file mode 100644
index 000000000..d81198139
--- /dev/null
+++ b/apps/tourism/public/images/completed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/crossIcon.svg b/apps/tourism/public/images/crossIcon.svg
new file mode 100644
index 000000000..159a26b45
--- /dev/null
+++ b/apps/tourism/public/images/crossIcon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/deliveryAgentBlack.svg b/apps/tourism/public/images/deliveryAgentBlack.svg
new file mode 100644
index 000000000..c2217e88c
--- /dev/null
+++ b/apps/tourism/public/images/deliveryAgentBlack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/deliveryAgentRed.svg b/apps/tourism/public/images/deliveryAgentRed.svg
new file mode 100644
index 000000000..6d52bc571
--- /dev/null
+++ b/apps/tourism/public/images/deliveryAgentRed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/discount-icon/discount.webp b/apps/tourism/public/images/discount-icon/discount.webp
new file mode 100644
index 000000000..671f1a21f
Binary files /dev/null and b/apps/tourism/public/images/discount-icon/discount.webp differ
diff --git a/apps/tourism/public/images/downArrow.svg b/apps/tourism/public/images/downArrow.svg
new file mode 100644
index 000000000..9896fbe95
--- /dev/null
+++ b/apps/tourism/public/images/downArrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/downloadInvoice.svg b/apps/tourism/public/images/downloadInvoice.svg
new file mode 100644
index 000000000..991879465
--- /dev/null
+++ b/apps/tourism/public/images/downloadInvoice.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/emailCustomer.svg b/apps/tourism/public/images/emailCustomer.svg
new file mode 100644
index 000000000..9b5d2b802
--- /dev/null
+++ b/apps/tourism/public/images/emailCustomer.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/feedbackImg.svg b/apps/tourism/public/images/feedbackImg.svg
new file mode 100644
index 000000000..d857ef1e5
--- /dev/null
+++ b/apps/tourism/public/images/feedbackImg.svg
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/filter-btn.svg b/apps/tourism/public/images/filter-btn.svg
new file mode 100644
index 000000000..62c3a663c
--- /dev/null
+++ b/apps/tourism/public/images/filter-btn.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/filter-icon.svg b/apps/tourism/public/images/filter-icon.svg
new file mode 100644
index 000000000..62c3a663c
--- /dev/null
+++ b/apps/tourism/public/images/filter-icon.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/footer.svg b/apps/tourism/public/images/footer.svg
new file mode 100644
index 000000000..b65ffad5a
--- /dev/null
+++ b/apps/tourism/public/images/footer.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/greenVeg.svg b/apps/tourism/public/images/greenVeg.svg
new file mode 100644
index 000000000..390be81cf
--- /dev/null
+++ b/apps/tourism/public/images/greenVeg.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/hamburger.png b/apps/tourism/public/images/hamburger.png
new file mode 100644
index 000000000..dca860c84
Binary files /dev/null and b/apps/tourism/public/images/hamburger.png differ
diff --git a/apps/tourism/public/images/invoiceDetails.svg b/apps/tourism/public/images/invoiceDetails.svg
new file mode 100644
index 000000000..29ea2c56b
--- /dev/null
+++ b/apps/tourism/public/images/invoiceDetails.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/landingPageTourism.svg b/apps/tourism/public/images/landingPageTourism.svg
new file mode 100644
index 000000000..ef2612ddd
--- /dev/null
+++ b/apps/tourism/public/images/landingPageTourism.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/lineBlack.svg b/apps/tourism/public/images/lineBlack.svg
new file mode 100644
index 000000000..b2b10654f
--- /dev/null
+++ b/apps/tourism/public/images/lineBlack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/lineRed.svg b/apps/tourism/public/images/lineRed.svg
new file mode 100644
index 000000000..1f399b1cb
--- /dev/null
+++ b/apps/tourism/public/images/lineRed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/locationIcon.svg b/apps/tourism/public/images/locationIcon.svg
new file mode 100644
index 000000000..9999e96eb
--- /dev/null
+++ b/apps/tourism/public/images/locationIcon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/logo.png b/apps/tourism/public/images/logo.png
new file mode 100644
index 000000000..5e65c1f20
Binary files /dev/null and b/apps/tourism/public/images/logo.png differ
diff --git a/apps/tourism/public/images/masterCard.svg b/apps/tourism/public/images/masterCard.svg
new file mode 100644
index 000000000..ed0896d13
--- /dev/null
+++ b/apps/tourism/public/images/masterCard.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/menuham.svg b/apps/tourism/public/images/menuham.svg
new file mode 100644
index 000000000..4921a9e07
--- /dev/null
+++ b/apps/tourism/public/images/menuham.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/meter.svg b/apps/tourism/public/images/meter.svg
new file mode 100644
index 000000000..5fa44ddec
--- /dev/null
+++ b/apps/tourism/public/images/meter.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/nameIcon.svg b/apps/tourism/public/images/nameIcon.svg
new file mode 100644
index 000000000..1a750d0da
--- /dev/null
+++ b/apps/tourism/public/images/nameIcon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/netbanking.svg b/apps/tourism/public/images/netbanking.svg
new file mode 100644
index 000000000..8822e34fb
--- /dev/null
+++ b/apps/tourism/public/images/netbanking.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/ofdBlack.svg b/apps/tourism/public/images/ofdBlack.svg
new file mode 100644
index 000000000..96a40a1d3
--- /dev/null
+++ b/apps/tourism/public/images/ofdBlack.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/ofdRed.svg b/apps/tourism/public/images/ofdRed.svg
new file mode 100644
index 000000000..6beaf56ef
--- /dev/null
+++ b/apps/tourism/public/images/ofdRed.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/openCommerce.svg b/apps/tourism/public/images/openCommerce.svg
new file mode 100644
index 000000000..16a289432
--- /dev/null
+++ b/apps/tourism/public/images/openCommerce.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/orderConfirmed.svg b/apps/tourism/public/images/orderConfirmed.svg
new file mode 100644
index 000000000..41bef4575
--- /dev/null
+++ b/apps/tourism/public/images/orderConfirmed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/orderConfirmmark.svg b/apps/tourism/public/images/orderConfirmmark.svg
new file mode 100644
index 000000000..7687711ea
--- /dev/null
+++ b/apps/tourism/public/images/orderConfirmmark.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/orderDeliveredBlack.svg b/apps/tourism/public/images/orderDeliveredBlack.svg
new file mode 100644
index 000000000..58db16da9
--- /dev/null
+++ b/apps/tourism/public/images/orderDeliveredBlack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/orderDeliveredRed.svg b/apps/tourism/public/images/orderDeliveredRed.svg
new file mode 100644
index 000000000..1710b8fec
--- /dev/null
+++ b/apps/tourism/public/images/orderDeliveredRed.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/orderDetailsIcon.svg b/apps/tourism/public/images/orderDetailsIcon.svg
new file mode 100644
index 000000000..cddc5910b
--- /dev/null
+++ b/apps/tourism/public/images/orderDetailsIcon.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/retail/public/images/orderHistory.svg b/apps/tourism/public/images/orderHistory.svg
similarity index 100%
rename from apps/retail/public/images/orderHistory.svg
rename to apps/tourism/public/images/orderHistory.svg
diff --git a/apps/tourism/public/images/orderHistoryPageIcon.svg b/apps/tourism/public/images/orderHistoryPageIcon.svg
new file mode 100644
index 000000000..1e740ee25
--- /dev/null
+++ b/apps/tourism/public/images/orderHistoryPageIcon.svg
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/pendingStatus.svg b/apps/tourism/public/images/pendingStatus.svg
new file mode 100644
index 000000000..3c1c490a0
--- /dev/null
+++ b/apps/tourism/public/images/pendingStatus.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/phonePay.svg b/apps/tourism/public/images/phonePay.svg
new file mode 100644
index 000000000..c2d4f197d
--- /dev/null
+++ b/apps/tourism/public/images/phonePay.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/phonePayPayment.svg b/apps/tourism/public/images/phonePayPayment.svg
new file mode 100644
index 000000000..07ca4ebf5
--- /dev/null
+++ b/apps/tourism/public/images/phonePayPayment.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/proceedToPay.svg b/apps/tourism/public/images/proceedToPay.svg
new file mode 100644
index 000000000..be496c472
--- /dev/null
+++ b/apps/tourism/public/images/proceedToPay.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/qrCode.svg b/apps/tourism/public/images/qrCode.svg
new file mode 100644
index 000000000..6f47025ed
--- /dev/null
+++ b/apps/tourism/public/images/qrCode.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/redNonVeg.svg b/apps/tourism/public/images/redNonVeg.svg
new file mode 100644
index 000000000..f7a01522d
--- /dev/null
+++ b/apps/tourism/public/images/redNonVeg.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/rightArrow.svg b/apps/tourism/public/images/rightArrow.svg
new file mode 100644
index 000000000..e3bbfdfb1
--- /dev/null
+++ b/apps/tourism/public/images/rightArrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/search.svg b/apps/tourism/public/images/search.svg
new file mode 100644
index 000000000..1a3542ac3
--- /dev/null
+++ b/apps/tourism/public/images/search.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/searchHome.svg b/apps/tourism/public/images/searchHome.svg
new file mode 100644
index 000000000..a75e5a9eb
--- /dev/null
+++ b/apps/tourism/public/images/searchHome.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/searchIcon.svg b/apps/tourism/public/images/searchIcon.svg
new file mode 100644
index 000000000..1a3542ac3
--- /dev/null
+++ b/apps/tourism/public/images/searchIcon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/searchInput.svg b/apps/tourism/public/images/searchInput.svg
new file mode 100644
index 000000000..5cafa9869
--- /dev/null
+++ b/apps/tourism/public/images/searchInput.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/searchlocationmarker.svg b/apps/tourism/public/images/searchlocationmarker.svg
new file mode 100755
index 000000000..2e0726955
--- /dev/null
+++ b/apps/tourism/public/images/searchlocationmarker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/setLocation.svg b/apps/tourism/public/images/setLocation.svg
new file mode 100644
index 000000000..3eb989e64
--- /dev/null
+++ b/apps/tourism/public/images/setLocation.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/slider-img/Hamburger (1).svg b/apps/tourism/public/images/slider-img/Hamburger (1).svg
new file mode 100644
index 000000000..b65a4e6c3
--- /dev/null
+++ b/apps/tourism/public/images/slider-img/Hamburger (1).svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/slider-img/beauty-banner.webp b/apps/tourism/public/images/slider-img/beauty-banner.webp
new file mode 100644
index 000000000..b7db78507
Binary files /dev/null and b/apps/tourism/public/images/slider-img/beauty-banner.webp differ
diff --git a/apps/tourism/public/images/slider-img/digital-banner.webp b/apps/tourism/public/images/slider-img/digital-banner.webp
new file mode 100644
index 000000000..8ad8149a8
Binary files /dev/null and b/apps/tourism/public/images/slider-img/digital-banner.webp differ
diff --git a/apps/tourism/public/images/slider-img/fashion-banner.webp b/apps/tourism/public/images/slider-img/fashion-banner.webp
new file mode 100644
index 000000000..8f6205461
Binary files /dev/null and b/apps/tourism/public/images/slider-img/fashion-banner.webp differ
diff --git a/apps/tourism/public/images/slider-img/house-banner.webp b/apps/tourism/public/images/slider-img/house-banner.webp
new file mode 100644
index 000000000..f6dca0a52
Binary files /dev/null and b/apps/tourism/public/images/slider-img/house-banner.webp differ
diff --git a/apps/tourism/public/images/slider-img/stationery-banner.webp b/apps/tourism/public/images/slider-img/stationery-banner.webp
new file mode 100644
index 000000000..35d245657
Binary files /dev/null and b/apps/tourism/public/images/slider-img/stationery-banner.webp differ
diff --git a/apps/tourism/public/images/slider-img/toy-banner.webp b/apps/tourism/public/images/slider-img/toy-banner.webp
new file mode 100644
index 000000000..a9edd9bb6
Binary files /dev/null and b/apps/tourism/public/images/slider-img/toy-banner.webp differ
diff --git a/apps/tourism/public/images/speaker.svg b/apps/tourism/public/images/speaker.svg
new file mode 100644
index 000000000..677c65b1b
--- /dev/null
+++ b/apps/tourism/public/images/speaker.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/store-images/1.png b/apps/tourism/public/images/store-images/1.png
new file mode 100644
index 000000000..5fa4e62e9
Binary files /dev/null and b/apps/tourism/public/images/store-images/1.png differ
diff --git a/apps/tourism/public/images/store-images/2.png b/apps/tourism/public/images/store-images/2.png
new file mode 100644
index 000000000..b164465af
Binary files /dev/null and b/apps/tourism/public/images/store-images/2.png differ
diff --git a/apps/tourism/public/images/store-images/3.png b/apps/tourism/public/images/store-images/3.png
new file mode 100644
index 000000000..edf45ecfc
Binary files /dev/null and b/apps/tourism/public/images/store-images/3.png differ
diff --git a/apps/tourism/public/images/store-images/4.png b/apps/tourism/public/images/store-images/4.png
new file mode 100644
index 000000000..7de8e3915
Binary files /dev/null and b/apps/tourism/public/images/store-images/4.png differ
diff --git a/apps/tourism/public/images/store-options/Books.svg b/apps/tourism/public/images/store-options/Books.svg
new file mode 100644
index 000000000..3a13ae37d
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Books.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/store-options/Books_light.svg b/apps/tourism/public/images/store-options/Books_light.svg
new file mode 100644
index 000000000..3fd3026a6
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Books_light.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/store-options/Hospitals.svg b/apps/tourism/public/images/store-options/Hospitals.svg
new file mode 100644
index 000000000..7cde66a9a
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Hospitals.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Hospitals_light.svg b/apps/tourism/public/images/store-options/Hospitals_light.svg
new file mode 100644
index 000000000..6adb4be65
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Hospitals_light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Hotels.svg b/apps/tourism/public/images/store-options/Hotels.svg
new file mode 100644
index 000000000..b440e8022
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Hotels.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Hotels_light.svg b/apps/tourism/public/images/store-options/Hotels_light.svg
new file mode 100644
index 000000000..8fbaea80d
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Hotels_light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Restaurants.svg b/apps/tourism/public/images/store-options/Restaurants.svg
new file mode 100644
index 000000000..80bf3ff5c
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Restaurants.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Restaurants_light.svg b/apps/tourism/public/images/store-options/Restaurants_light.svg
new file mode 100644
index 000000000..c9cfdc4f8
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Restaurants_light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Shopping.svg b/apps/tourism/public/images/store-options/Shopping.svg
new file mode 100644
index 000000000..faf3373ef
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Shopping.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/store-options/Shopping_light.svg b/apps/tourism/public/images/store-options/Shopping_light.svg
new file mode 100644
index 000000000..2a064959e
--- /dev/null
+++ b/apps/tourism/public/images/store-options/Shopping_light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/supFevIcon.svg b/apps/tourism/public/images/supFevIcon.svg
new file mode 100644
index 000000000..723ee8a56
--- /dev/null
+++ b/apps/tourism/public/images/supFevIcon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/threeDots.svg b/apps/tourism/public/images/threeDots.svg
new file mode 100644
index 000000000..f883051c5
--- /dev/null
+++ b/apps/tourism/public/images/threeDots.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/tourismIcon.svg b/apps/tourism/public/images/tourismIcon.svg
new file mode 100644
index 000000000..45babc6de
--- /dev/null
+++ b/apps/tourism/public/images/tourismIcon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/trackOrder.svg b/apps/tourism/public/images/trackOrder.svg
new file mode 100644
index 000000000..f35a31233
--- /dev/null
+++ b/apps/tourism/public/images/trackOrder.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/trackOrderMap.svg b/apps/tourism/public/images/trackOrderMap.svg
new file mode 100644
index 000000000..7c0d292c4
--- /dev/null
+++ b/apps/tourism/public/images/trackOrderMap.svg
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/uparrow.svg b/apps/tourism/public/images/uparrow.svg
new file mode 100644
index 000000000..29eb0181d
--- /dev/null
+++ b/apps/tourism/public/images/uparrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/tourism/public/images/updateOrder.svg b/apps/tourism/public/images/updateOrder.svg
new file mode 100644
index 000000000..dbabeb16a
--- /dev/null
+++ b/apps/tourism/public/images/updateOrder.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/apps/tourism/public/images/user.svg b/apps/tourism/public/images/user.svg
new file mode 100644
index 000000000..0d4dfa851
--- /dev/null
+++ b/apps/tourism/public/images/user.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/tourism/public/images/visa.svg b/apps/tourism/public/images/visa.svg
new file mode 100644
index 000000000..23af3a00a
--- /dev/null
+++ b/apps/tourism/public/images/visa.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/tourism/public/images/zishopBanner.png b/apps/tourism/public/images/zishopBanner.png
new file mode 100644
index 000000000..178bafd1c
Binary files /dev/null and b/apps/tourism/public/images/zishopBanner.png differ
diff --git a/apps/tourism/public/robots.txt b/apps/tourism/public/robots.txt
new file mode 100644
index 000000000..8f081968b
--- /dev/null
+++ b/apps/tourism/public/robots.txt
@@ -0,0 +1,9 @@
+# *
+User-agent: *
+Allow: /
+
+# Host
+Host: undefined
+
+# Sitemaps
+Sitemap: undefined/sitemap.xml
diff --git a/apps/tourism/public/sitemap-0.xml b/apps/tourism/public/sitemap-0.xml
new file mode 100644
index 000000000..befe7bd34
--- /dev/null
+++ b/apps/tourism/public/sitemap-0.xml
@@ -0,0 +1,24 @@
+
+
+undefined 2023-08-28T16:44:22.269Z daily 0.7
+undefined/about 2023-08-28T16:44:22.269Z daily 0.7
+undefined/blank 2023-08-28T16:44:22.269Z daily 0.7
+undefined/cart 2023-08-28T16:44:22.269Z daily 0.7
+undefined/checkoutPage 2023-08-28T16:44:22.269Z daily 0.7
+undefined/favorite 2023-08-28T16:44:22.269Z daily 0.7
+undefined/feedback 2023-08-28T16:44:22.269Z daily 0.7
+undefined/homePage 2023-08-28T16:44:22.269Z daily 0.7
+undefined/login 2023-08-28T16:44:22.269Z daily 0.7
+undefined/mobileOtp 2023-08-28T16:44:22.269Z daily 0.7
+undefined/newestProducts 2023-08-28T16:44:22.269Z daily 0.7
+undefined/offers 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderConfirmation 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderDetails 2023-08-28T16:44:22.269Z daily 0.7
+undefined/orderHistory 2023-08-28T16:44:22.269Z daily 0.7
+undefined/paymentMode 2023-08-28T16:44:22.269Z daily 0.7
+undefined/product 2023-08-28T16:44:22.269Z daily 0.7
+undefined/search 2023-08-28T16:44:22.269Z daily 0.7
+undefined/signUp 2023-08-28T16:44:22.269Z daily 0.7
+undefined/trackOrder 2023-08-28T16:44:22.269Z daily 0.7
+undefined/fa/offers 2023-08-28T16:44:22.269Z daily 0.7
+
\ No newline at end of file
diff --git a/apps/tourism/public/sitemap.xml b/apps/tourism/public/sitemap.xml
new file mode 100644
index 000000000..cdcce6fe3
--- /dev/null
+++ b/apps/tourism/public/sitemap.xml
@@ -0,0 +1,4 @@
+
+
+undefined/sitemap-0.xml
+
\ No newline at end of file
diff --git a/apps/tourism/services/Users.ts b/apps/tourism/services/Users.ts
new file mode 100644
index 000000000..c1ae53fb4
--- /dev/null
+++ b/apps/tourism/services/Users.ts
@@ -0,0 +1,36 @@
+import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query'
+// Assuming User is a type representing the user object in your application
+import type { User } from './types'
+
+const api = createApi({
+ baseQuery: fetchBaseQuery({
+ baseUrl: process.env.NEXT_PUBLIC_STRAPI_URL
+ }),
+ tagTypes: ['User'], // Changed from 'Post' to 'User'
+ endpoints: build => ({
+ // The mutation accepts login credentials and returns user data
+ useSignInMutation: build.mutation({
+ // The query that sends the login credentials to the backend
+ query: credentials => ({
+ url: `signin`, // Endpoint for the sign-in operation
+ method: 'POST', // Changed from 'PATCH' to 'POST'
+ body: credentials // Sends the email and password
+ }),
+ // Transform the response to directly return the user data
+ transformResponse: (response: { data: User }) => {
+ console.log('Dank', response.data)
+ },
+ // Optional: Customize error handling if needed
+ transformErrorResponse: (response: { status: string | number }) => response.status,
+ // Invalidate user-related data as needed, or manage cache/tags based on your app's logic
+ invalidatesTags: ['User'],
+ // Optional: Implement onQueryStarted for optimistic updates or additional side effects
+ async onQueryStarted(arg, { dispatch, queryFulfilled }) {
+ // Example: Handle optimistic updates or trigger additional actions
+ }
+ // Optional: Implement onCacheEntryAdded for cache-related side effects
+ })
+ })
+})
+
+export default api
diff --git a/apps/tourism/services/types.ts b/apps/tourism/services/types.ts
new file mode 100644
index 000000000..2fbcfbc44
--- /dev/null
+++ b/apps/tourism/services/types.ts
@@ -0,0 +1,4 @@
+export type User = {
+ email: string
+ password: string
+}
diff --git a/apps/tourism/store/activeMenuItem-slice.ts b/apps/tourism/store/activeMenuItem-slice.ts
new file mode 100644
index 000000000..d3dc49ee4
--- /dev/null
+++ b/apps/tourism/store/activeMenuItem-slice.ts
@@ -0,0 +1,24 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IActiveMenuItem } from '../lib/types/activeMenuItem'
+
+const initialState: IActiveMenuItem = {
+ activeMenuItemIndex: 0,
+ activeMenuItemText: ''
+}
+
+const activeMenuItemSlice = createSlice({
+ name: 'activeMenuItem',
+ initialState,
+ reducers: {
+ setActiveMenuItemIndex(state, action: PayloadAction) {
+ state.activeMenuItemIndex = action.payload
+ },
+ setActiveMenuItemText(state, action: PayloadAction) {
+ state.activeMenuItemText = action.payload
+ }
+ }
+})
+
+export const activeMenuItemActions = activeMenuItemSlice.actions
+
+export default activeMenuItemSlice.reducer
diff --git a/apps/tourism/store/cart-slice.ts b/apps/tourism/store/cart-slice.ts
new file mode 100644
index 000000000..24084e40c
--- /dev/null
+++ b/apps/tourism/store/cart-slice.ts
@@ -0,0 +1,75 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ICart } from '../lib/types/cart'
+import { RetailItem } from '../lib/types/products'
+import { calculateDiscountPercentage } from '../utilities/calculateDiscountPercentage'
+
+const initialState: ICart = {
+ items: [],
+ totalQuantity: 0,
+ totalAmount: 0
+}
+
+const cartSlice = createSlice({
+ name: 'cart',
+ initialState,
+ reducers: {
+ addItemToCart(
+ state: ICart,
+ action: PayloadAction<{
+ product: RetailItem
+ quantity: number
+ }>
+ ) {
+ const newItem = action.payload.product
+
+ const existingItem = state.items.find(item => item.id === newItem.id)
+
+ state.totalQuantity = state.totalQuantity + action.payload.quantity
+
+ state.totalAmount = state.totalAmount + action.payload.quantity * parseFloat(action.payload.product.price.value)
+
+ if (!existingItem) {
+ const totalPrice = parseFloat(newItem.price.value) * action.payload.quantity
+
+ state.items.push({
+ ...newItem,
+ quantity: action.payload.quantity,
+ totalPrice
+ })
+ } else {
+ const totalPrice =
+ parseFloat(existingItem.price.value) + parseFloat(existingItem.price.value) * action.payload.quantity
+
+ existingItem.quantity += action.payload.quantity
+ existingItem.totalPrice = totalPrice
+ }
+ },
+
+ removeItemFromCart(
+ state: ICart,
+ action: PayloadAction //slug.current as payload
+ ) {
+ const productSlug = action.payload
+ const existingItem = state.items.find(item => item.id === productSlug)
+
+ state.totalQuantity--
+
+ state.totalAmount = state.totalAmount - parseFloat(existingItem?.price.value!)
+
+ if (existingItem?.quantity === 1) {
+ state.items = state.items.filter(item => item.id !== productSlug)
+ } else {
+ existingItem!.quantity--
+ existingItem!.totalPrice = existingItem!.totalPrice - parseFloat(existingItem?.price.value!)
+ }
+ },
+
+ clearCart(state: ICart) {
+ return { ...initialState }
+ }
+ }
+})
+
+export const cartActions = cartSlice.actions
+
+export default cartSlice.reducer
diff --git a/apps/tourism/store/cartUI-slice.ts b/apps/tourism/store/cartUI-slice.ts
new file mode 100644
index 000000000..52ba16626
--- /dev/null
+++ b/apps/tourism/store/cartUI-slice.ts
@@ -0,0 +1,20 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ICartUI } from '../lib/types/cart'
+
+const initialState: ICartUI = {
+ cartBoxIsVisible: false
+}
+
+const cartUiSlice = createSlice({
+ name: 'cartUi',
+ initialState,
+ reducers: {
+ toggleCartBox(state, action: PayloadAction) {
+ state.cartBoxIsVisible = action.payload
+ }
+ }
+})
+
+export const cartUiActions = cartUiSlice.actions
+
+export default cartUiSlice.reducer
diff --git a/apps/tourism/store/favorite-slice.ts b/apps/tourism/store/favorite-slice.ts
new file mode 100644
index 000000000..6ecb362b1
--- /dev/null
+++ b/apps/tourism/store/favorite-slice.ts
@@ -0,0 +1,30 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IFavorite } from '../lib/types/favorite'
+import { RetailItem } from '../lib/types/products'
+
+const initialState: IFavorite = {
+ items: []
+}
+
+const favoriteSlice = createSlice({
+ name: 'favorite',
+ initialState,
+ reducers: {
+ addToFavorite(state, action: PayloadAction) {
+ state.items.push({
+ ...action.payload
+ })
+ },
+ removeFromFavorite(state, action: PayloadAction) {
+ const productSlug = action.payload
+ state.items = state.items.filter(item => item.id !== productSlug)
+ },
+ clearCart(state) {
+ state = initialState
+ }
+ }
+})
+
+export const favoriteActions = favoriteSlice.actions
+
+export default favoriteSlice.reducer
diff --git a/apps/tourism/store/geoMapLocationSearch-slice.ts b/apps/tourism/store/geoMapLocationSearch-slice.ts
new file mode 100644
index 000000000..a868f7f17
--- /dev/null
+++ b/apps/tourism/store/geoMapLocationSearch-slice.ts
@@ -0,0 +1,31 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IGeoLocationSearchPage } from '../lib/types/geoLocationSearchPage'
+
+const initialState: IGeoLocationSearchPage = {
+ geoLocationSearchPageVisible: false,
+ geoAddress: '',
+ geoLatLong: ''
+}
+const geoLocationSearchPage = createSlice({
+ name: 'geoLocationSearchPageUI',
+ initialState,
+ reducers: {
+ toggleLocationSearchPageVisibility(state, action: PayloadAction) {
+ state.geoLocationSearchPageVisible = action.payload
+ },
+ setGeoAddressAndLatLong(
+ state,
+ action: PayloadAction<{
+ geoAddress: string
+ geoLatLong: string
+ }>
+ ) {
+ state.geoAddress = action.payload.geoAddress
+ state.geoLatLong = action.payload.geoLatLong
+ }
+ }
+})
+
+export const { toggleLocationSearchPageVisibility, setGeoAddressAndLatLong } = geoLocationSearchPage.actions
+
+export default geoLocationSearchPage.reducer
diff --git a/apps/tourism/store/index.ts b/apps/tourism/store/index.ts
new file mode 100644
index 000000000..e5fa66036
--- /dev/null
+++ b/apps/tourism/store/index.ts
@@ -0,0 +1,41 @@
+import { configureStore } from '@reduxjs/toolkit'
+import specialOfferProductsReducer from './specialOfferProducts-slice'
+import newestProductReducer from './newestProduct-slice'
+import SortedProductsListReducer from './sortedProductList-slice'
+import cartUiReducer from './cartUI-slice'
+import cartSliceReducer from './cart-slice'
+import userInfoReducer from './user-slice'
+import sideNavBarReducer from './sideNavBar-slice'
+import megaMenuReducer from './megaMenu-slice'
+import activeMenuItemReducer from './activeMenuItem-slice'
+import settingBoxReducer from './settingBox-slice'
+import favoriteReducer from './favorite-slice'
+import responseDataReducer from './responseData-slice'
+import geoMapLocationSearchReducer from './geoMapLocationSearch-slice'
+
+const store = configureStore({
+ reducer: {
+ specialOfferProductsList: specialOfferProductsReducer,
+ newestProductsList: newestProductReducer,
+ sortedProductsList: SortedProductsListReducer,
+ cartUi: cartUiReducer,
+ cart: cartSliceReducer,
+ userInfo: userInfoReducer,
+ sideNavBar: sideNavBarReducer,
+ megaMenu: megaMenuReducer,
+ activeMenuItem: activeMenuItemReducer,
+ settingBox: settingBoxReducer,
+ favorite: favoriteReducer,
+ transactionId: responseDataReducer,
+ quoteResponse: responseDataReducer,
+ customerDetails: responseDataReducer,
+ initResponse: responseDataReducer,
+ geoLocationSearchPageUI: geoMapLocationSearchReducer
+ },
+ middleware: getDefaultMiddleware =>
+ getDefaultMiddleware({
+ serializableCheck: false
+ })
+})
+
+export default store
diff --git a/apps/tourism/store/megaMenu-slice.ts b/apps/tourism/store/megaMenu-slice.ts
new file mode 100644
index 000000000..9e7b0bfb8
--- /dev/null
+++ b/apps/tourism/store/megaMenu-slice.ts
@@ -0,0 +1,23 @@
+import { createSlice } from '@reduxjs/toolkit'
+import { IMegaMenuShow } from '../lib/types/megaMenu'
+
+const initialState: IMegaMenuShow = {
+ isMegaMenuOpen: false
+}
+
+const megaMenuSlice = createSlice({
+ name: 'megaMenu',
+ initialState,
+ reducers: {
+ openMegaMenu(state) {
+ state.isMegaMenuOpen = true
+ },
+ closeMegaMenu(state) {
+ state.isMegaMenuOpen = false
+ }
+ }
+})
+
+export const megaMenuActions = megaMenuSlice.actions
+
+export default megaMenuSlice.reducer
diff --git a/apps/tourism/store/newestProduct-slice.ts b/apps/tourism/store/newestProduct-slice.ts
new file mode 100644
index 000000000..829e9bfcf
--- /dev/null
+++ b/apps/tourism/store/newestProduct-slice.ts
@@ -0,0 +1,22 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { RetailItem } from '../lib/types/products'
+import { IProductList } from '../lib/types/productList'
+
+const initialState: IProductList = {
+ productsList: []
+}
+
+const newestProductsSlice = createSlice({
+ name: 'newestProducts',
+ initialState,
+ reducers: {
+ addProducts(state, action: PayloadAction) {
+ state.productsList = action.payload
+ }
+ }
+})
+
+export const newestProductsActions = newestProductsSlice.actions
+
+export default newestProductsSlice.reducer
diff --git a/apps/tourism/store/responseData-slice.ts b/apps/tourism/store/responseData-slice.ts
new file mode 100644
index 000000000..2ffb14c3c
--- /dev/null
+++ b/apps/tourism/store/responseData-slice.ts
@@ -0,0 +1,33 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { ResponseModel } from '../lib/types/responseModel'
+import { ShippingFormData } from '../pages/checkoutPage'
+
+const initialState = {
+ transactionId: '',
+ quoteResponse: null as (ResponseModel & ResponseModel[]) | null,
+ customerDetails: null as ShippingFormData | null,
+ initResponse: null as (ResponseModel & ResponseModel[]) | null
+}
+
+const responseDataSlice = createSlice({
+ name: 'responseData',
+ initialState,
+ reducers: {
+ addTransactionId(state, action: PayloadAction) {
+ state.transactionId = action.payload
+ },
+ addQuoteResponse(state, action: PayloadAction<(ResponseModel & ResponseModel[]) | null>) {
+ state.quoteResponse = action.payload
+ },
+ addCustomerDetails(state, action: PayloadAction) {
+ state.customerDetails = action.payload
+ },
+ addInitResponse(state, action: PayloadAction<(ResponseModel & ResponseModel[]) | null>) {
+ state.initResponse = action.payload
+ }
+ }
+})
+
+export const responseDataActions = responseDataSlice.actions
+
+export default responseDataSlice.reducer
diff --git a/apps/tourism/store/settingBox-slice.ts b/apps/tourism/store/settingBox-slice.ts
new file mode 100644
index 000000000..77f71a767
--- /dev/null
+++ b/apps/tourism/store/settingBox-slice.ts
@@ -0,0 +1,26 @@
+import { createSlice } from '@reduxjs/toolkit'
+import { ISettingBox } from '../lib/types/settingBox'
+
+const initialState: ISettingBox = {
+ isOpen: false
+}
+
+const settingBoxSlice = createSlice({
+ name: 'settingBox',
+ initialState,
+ reducers: {
+ openSettingBox(state) {
+ state.isOpen = true
+ },
+ closeSettingBox(state) {
+ state.isOpen = false
+ },
+ toggleSettingBox(state) {
+ state.isOpen = !state.isOpen
+ }
+ }
+})
+
+export const settingBoxActions = settingBoxSlice.actions
+
+export default settingBoxSlice.reducer
diff --git a/apps/tourism/store/sideNavBar-slice.ts b/apps/tourism/store/sideNavBar-slice.ts
new file mode 100644
index 000000000..0ba7dff09
--- /dev/null
+++ b/apps/tourism/store/sideNavBar-slice.ts
@@ -0,0 +1,40 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import { IDropDown } from '../lib/types/dropDown'
+import { ISideNavBar } from '../lib/types/sidebar'
+
+const initialState: ISideNavBar = {
+ isSidebarOpen: false,
+ isNavbarOpen: false,
+ dropDownList: []
+}
+
+const sideNavBarSlice = createSlice({
+ name: 'sideNavBar',
+ initialState,
+ reducers: {
+ openSidebar(state) {
+ state.isSidebarOpen = true
+ },
+
+ openNavbar(state) {
+ state.isNavbarOpen = true
+ },
+
+ closeSidebar(state) {
+ state.isSidebarOpen = false
+ },
+
+ closeNavbar(state) {
+ state.isSidebarOpen = false
+ state.isNavbarOpen = false
+ },
+
+ setSidebarEntries(state, action: PayloadAction) {
+ state.dropDownList = action.payload
+ }
+ }
+})
+
+export const sideNavBarActions = sideNavBarSlice.actions
+
+export default sideNavBarSlice.reducer
diff --git a/apps/tourism/store/sortedProductList-slice.ts b/apps/tourism/store/sortedProductList-slice.ts
new file mode 100644
index 000000000..b5c8e0d75
--- /dev/null
+++ b/apps/tourism/store/sortedProductList-slice.ts
@@ -0,0 +1,40 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { IProductList } from '../lib/types/productList'
+import { RetailItem } from '../lib/types/products'
+import { sortByCheapest, sortByExpensive } from '../utilities/sortByCost'
+
+const initialState: IProductList = {
+ productsList: []
+}
+
+const SortedProductsListSlice = createSlice({
+ name: 'sortedProductsList',
+ initialState,
+ reducers: {
+ sortProductsList(
+ state,
+ action: PayloadAction<{
+ productsList: RetailItem[]
+ sortBasedOn: string
+ }>
+ ) {
+ switch (action.payload.sortBasedOn) {
+ case 'all':
+ state.productsList = action.payload.productsList
+ break
+ case 'cheapest': {
+ state.productsList = state.productsList.sort(sortByCheapest)
+ break
+ }
+ case 'expensive': {
+ state.productsList = state.productsList.sort(sortByExpensive)
+ break
+ }
+ }
+ }
+ }
+})
+export const SortedProductsListActions = SortedProductsListSlice.actions
+
+export default SortedProductsListSlice.reducer
diff --git a/apps/tourism/store/specialOfferProducts-slice.ts b/apps/tourism/store/specialOfferProducts-slice.ts
new file mode 100644
index 000000000..67a432fa4
--- /dev/null
+++ b/apps/tourism/store/specialOfferProducts-slice.ts
@@ -0,0 +1,22 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+
+import { IProduct } from '../lib/types/products'
+import { IOfferProducts } from '../lib/types/offerProductsState'
+
+const initialState: IOfferProducts = {
+ specialOfferProducts: []
+}
+
+const specialOfferProductsSlice = createSlice({
+ name: 'specialOfferProducts',
+ initialState,
+ reducers: {
+ addProducts(state, action: PayloadAction) {
+ state.specialOfferProducts = action.payload
+ }
+ }
+})
+
+export const specialOfferProductsActions = specialOfferProductsSlice.actions
+
+export default specialOfferProductsSlice.reducer
diff --git a/apps/tourism/store/user-slice.ts b/apps/tourism/store/user-slice.ts
new file mode 100644
index 000000000..a4f8c8c61
--- /dev/null
+++ b/apps/tourism/store/user-slice.ts
@@ -0,0 +1,23 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit'
+import Cookies from 'js-cookie'
+import { IUser, IUserInfo } from '../lib/types/user'
+
+const initialState: IUserInfo = {
+ userInformation: Cookies.get('userInfo') ? JSON.parse(Cookies.get('userInfo')!) : null
+}
+
+const userInfoSlice = createSlice({
+ name: 'userInfo',
+ initialState,
+ reducers: {
+ userLogin(state, action: PayloadAction) {
+ state.userInformation = action.payload
+ },
+ userLogout(state) {
+ state.userInformation = null
+ }
+ }
+})
+export const userInfoActions = userInfoSlice.actions
+
+export default userInfoSlice.reducer
diff --git a/apps/tourism/styles/globals.css b/apps/tourism/styles/globals.css
new file mode 100644
index 000000000..16e213107
--- /dev/null
+++ b/apps/tourism/styles/globals.css
@@ -0,0 +1,103 @@
+@layer base {
+ :root {
+ --color-primary: 167, 27, 74; /* #A71B4A*/
+ --color-secondary: 74, 76, 90; /* #4a4c5a*/
+
+ --color-bg: 243, 244, 245; /* #f3f4f5*/
+ --color-bg-side: 252, 251, 255; /* #fcfdff*/
+ --color-bg-black: 0, 0, 0;
+ --digital-category-bgc: #ade8f4;
+ --fashion-category-bgc: #ffddd2;
+ --beauty-category-bgc: #ddd92a;
+ --sport-category-bgc: #ffd60a;
+ --house-category-bgc: #ccd5ae;
+ --toy-category-bgc: #cce3de;
+ --stationery-category-bgc: #fbb13c;
+ --disabled-btn-color: 234, 207, 219; /*"#EACFDB"*/
+
+ --color-text-base: 66, 71, 80; /* #424750*/
+ --color-text-muted: 107, 114, 128; /*#6b7280*/
+ --color-text-side: 255, 231, 231; /*#fff*/
+ --text-color: 255, 255, 255; /* #fff added for white color */
+ --pending-status-color: 189, 148, 43, 1; /*#BD942B*/
+ --delivered-status-color: 80, 201, 23, 1; /*#50C917*/
+ --font-family: iranyekan, 'IRANSans', 'Tahoma';
+ }
+
+ .dark {
+ --color-bg: 15, 23, 42; /* #0f172a*/
+ --color-bg-side: 30, 41, 59; /* #1e293b*/
+ --digital-category-bgc: #0d4c76;
+ --fashion-category-bgc: #892a19;
+ --beauty-category-bgc: #6d305f;
+ --sport-category-bgc: #650606;
+ --house-category-bgc: #164c4b;
+ --toy-category-bgc: #6d3d4b;
+ --stationery-category-bgc: #6a4202;
+
+ --color-text-base: 226, 232, 240; /*#e2e8f0*/
+ --color-text-muted: 140, 154, 175; /*#8c9aaf*/
+ --color-text-side: 255, 231, 231; /*#fff*/
+ }
+
+ html[dir='ltr'] {
+ --font-family: 'Poppins', 'Roboto', 'sans-serif';
+ }
+}
+
+html,
+body {
+ margin: 0;
+ padding: 0;
+ font-family: var(--font-family);
+ background-color: rgb(var(--color-bg));
+ color: rgb(var(--color-text-base));
+}
+.hideScroll::-webkit-scrollbar {
+ display: none;
+}
+.order_status_progress {
+ padding: 20px;
+ padding-left: unset;
+}
+
+.chakra-text.order_status_text_completed {
+ color: #5ec401;
+}
+.chakra-text.order_status_text_pending {
+ color: #bd942b;
+}
+.chakra-button.checkout_btn {
+ border: 1px solid;
+}
+.chakra-button.checkout_btn:last-child:active {
+ background: transparent;
+}
+select.chakra-select {
+ padding-inline-start: unset;
+ padding-inline-end: unset;
+}
+.chakra-form__label.dropDown_label {
+ margin: unset;
+ font-weight: unset;
+ padding: unset;
+}
+.chakra-button.assembly_details_btn {
+ position: absolute;
+ bottom: 20px;
+ width: 90%;
+}
+.css-1ydjfm6[aria-checked='true'],
+.css-1ydjfm6[data-checked] {
+ background: #0560fa !important;
+ border-color: #0560fa !important;
+}
+.chakra-button.social_btn {
+ color: #717070;
+ border: 1px solid;
+ border-color: var(--chakra-colors-primary-100);
+}
+.product_card_retail {
+ display: flex;
+ flex-wrap: wrap;
+}
diff --git a/apps/tourism/tsconfig.json b/apps/tourism/tsconfig.json
new file mode 100644
index 000000000..ef38f2c3d
--- /dev/null
+++ b/apps/tourism/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "jsx": "preserve",
+ "paths": {
+ "@components/*": ["./components/*"],
+ "@hooks/*": ["./hooks/*"],
+ "@services/*": ["./services/*"],
+ "@lib/*": ["./lib/*"],
+ "@pages/*": ["./pages/*"],
+ "@store/*": ["./store/*"],
+ "@utils/*": ["./utilities/*"],
+ "@styles/*": ["./styles/*"],
+ "@public/*": ["./public/*"],
+ "@locales/*": ["./locales/*"],
+ "@modals/*": ["./modals/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/apps/tourism/types/confirm.types.ts b/apps/tourism/types/confirm.types.ts
new file mode 100644
index 000000000..2dbb4428c
--- /dev/null
+++ b/apps/tourism/types/confirm.types.ts
@@ -0,0 +1,170 @@
+interface Location {
+ gps: string
+ address: string
+ city: {
+ name: string
+ }
+ country: {
+ code: string
+ }
+ area_code: string
+ state: {
+ name: string
+ }
+}
+
+interface Contact {
+ email?: string
+ phone: string
+}
+
+interface Person {
+ name: string
+}
+
+interface Stop {
+ location: Location
+ contact: Contact
+}
+
+interface Descriptor {
+ code: string
+ name: string
+}
+
+interface State {
+ descriptor: Descriptor
+}
+
+interface Fulfillment {
+ id: string
+ type: string
+ customer: {
+ contact: Contact
+ person: Person
+ }
+ stops: Stop[]
+ state: State
+ tracking: boolean
+}
+
+interface Price {
+ currency: string
+ value: string
+}
+
+interface QuoteBreakup {
+ title: string
+ price: Price
+}
+
+interface Quote {
+ price: Price
+ breakup: QuoteBreakup[]
+}
+
+interface Billing {
+ name: string
+ address: string
+ state: {
+ name: string
+ }
+ city: {
+ name: string
+ }
+ email: string
+ phone: string
+}
+
+interface PaymentParams {
+ amount: string
+ currency: string
+ bank_account_number: string
+ bank_code: string
+ bank_account_name: string
+}
+
+interface Payment {
+ collected_by: string
+ params: PaymentParams
+ status: string
+ type: string
+ transaction_id: string
+}
+
+interface CancellationTerm {
+ fulfillment_state: {
+ descriptor: {
+ code: string
+ }
+ }
+ cancellation_fee: {
+ percentage: string
+ }
+ external_ref: {
+ mimetype: string
+ url: string
+ }
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ name: string
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Item {
+ id: string
+ name: string
+ code: string
+ price: Price
+ quantity: {
+ selected: {
+ measure: {
+ value: string
+ unit: string
+ }
+ }
+ }
+}
+
+interface Provider {
+ id: string
+ name: string
+ short_desc: string
+ images: {
+ url: string
+ }[]
+}
+
+interface Message {
+ orderId: string
+ provider: Provider
+ items: Item[]
+ fulfillments: Fulfillment[]
+ quote: Quote
+ billing: Billing
+ payments: Payment[]
+ cancellation_terms: CancellationTerm[]
+}
+
+export interface ConfirmResponseModel {
+ context: Context
+ message: Message
+}
diff --git a/apps/tourism/types/init.types.ts b/apps/tourism/types/init.types.ts
new file mode 100644
index 000000000..1af064c31
--- /dev/null
+++ b/apps/tourism/types/init.types.ts
@@ -0,0 +1,152 @@
+type ProductInfo = {
+ code: string
+ name: string
+ display: boolean
+ list: Array<{
+ name: string
+ value: string
+ }>
+}
+
+type ImageInfo = {
+ url: string
+ size_type: string
+}
+
+type ItemInfo = {
+ id: string
+ name: string
+ price: {
+ currency: string
+ value: string
+ }
+ tags: Array
+}
+
+type ContactInfo = {
+ email: string
+ phone: string
+}
+
+type LocationInfo = {
+ gps: string
+ address: string
+ city: {
+ name: string
+ }
+ country: {
+ code: string
+ }
+ area_code: string
+ state: {
+ name: string
+ }
+}
+
+type StopInfo = {
+ type: string
+ location: LocationInfo
+ contact: {
+ phone: string
+ }
+}
+
+type FulfillmentInfo = {
+ id: string
+ customer: {
+ contact: ContactInfo
+ person: {
+ name: string
+ }
+ }
+ stops: Array
+ tracking: boolean
+}
+
+type QuoteBreakupInfo = {
+ price: {
+ currency: string
+ value: string
+ }
+ title: string
+}
+
+type QuoteInfo = {
+ breakup: Array
+ price: {
+ currency: string
+ value: string
+ }
+}
+
+type BillingInfo = {
+ name: string
+ address: string
+ state: {
+ name: string
+ }
+ city: {
+ name: string
+ }
+ email: string
+ phone: string
+}
+
+type PaymentInfo = {
+ collected_by: string
+ params: {
+ amount: string
+ currency: string
+ bank_account_number: string
+ bank_code: string
+ bank_account_name: string
+ }
+ status: string
+ type: string
+}
+
+type OrderInfo = {
+ type: string
+ provider: {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ images: ImageInfo
+ }
+ items: ItemInfo
+ fulfillments: Array
+ quote: QuoteInfo
+ billing: BillingInfo
+ payments: Array
+}
+
+type ContextInfo = {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+type MessageInfo = {
+ order: OrderInfo
+}
+
+export type InitResponseModel = {
+ context: ContextInfo
+ message: MessageInfo
+}
diff --git a/apps/tourism/types/order-details.types.ts b/apps/tourism/types/order-details.types.ts
new file mode 100644
index 000000000..1a211a62b
--- /dev/null
+++ b/apps/tourism/types/order-details.types.ts
@@ -0,0 +1,24 @@
+import { ConfirmResponseModel } from './confirm.types'
+import { StatusResponseModel, SupportModel } from './status.types'
+
+export interface UIState {
+ isProceedDisabled: boolean
+ isLoading: boolean
+ isLoadingForTrackAndSupport: boolean
+ isMenuModalOpen: boolean
+ isCancelMenuModalOpen: boolean
+ isLoadingForCancel: boolean
+}
+
+export interface DataState {
+ confirmData: ConfirmResponseModel[] | null
+ statusData: StatusResponseModel[]
+ trackUrl: string | null
+ supportData: SupportModel | null
+}
+
+export interface ProcessState {
+ apiCalled: boolean
+ allOrderDelivered: boolean
+ radioValue: string
+}
diff --git a/apps/tourism/types/order-history.types.ts b/apps/tourism/types/order-history.types.ts
new file mode 100644
index 000000000..8bd3974af
--- /dev/null
+++ b/apps/tourism/types/order-history.types.ts
@@ -0,0 +1,67 @@
+interface Descriptor {
+ name: string
+ short_desc: string
+}
+
+interface Tag {
+ code: string
+ list: { name: string; value: string }[]
+ name: string
+ display: boolean
+}
+
+interface Item {
+ id: string
+ name: string
+ tags: Tag[]
+ price: {
+ value: string
+ currency: string
+ }
+ long_desc: string
+ short_desc: string
+}
+
+type QuoteBreakupInfo = {
+ price: {
+ currency: string
+ value: string
+ }
+ title: string
+}
+
+type QuoteInfo = {
+ breakup: Array
+ price: {
+ currency: string
+ value: string
+ }
+}
+
+interface Attributes {
+ order_id: string
+ bpp_id: string
+ bpp_uri: string
+ currency: string
+ delivery_status: string
+ descriptor: Descriptor
+ price: number
+ billing: null
+ fulfillments: null
+ created_date: null
+ last_updated_date: null
+ quote: QuoteInfo
+ transaction_id: string
+ message_id: null
+ payments: null
+ items: Item
+ createdAt: string
+ updatedAt: string
+ publishedAt: string
+ domain: null
+}
+
+export interface orderHistoryData {
+ id: number
+ attributes: Attributes
+}
diff --git a/apps/tourism/types/search.types.ts b/apps/tourism/types/search.types.ts
new file mode 100644
index 000000000..fb06d67fd
--- /dev/null
+++ b/apps/tourism/types/search.types.ts
@@ -0,0 +1,112 @@
+import { Coordinate } from '@utils/homePage.utils'
+
+interface Location {
+ id: string
+ city: {
+ code: string
+ name: string
+ }
+ gps: string
+}
+
+interface Price {
+ value: string
+ currency: string
+}
+
+interface Tag {
+ code: string
+ name: string
+ display: boolean
+ list?: Array<{
+ name: string
+ value: string
+ }>
+}
+
+interface Fulfillment {
+ id: string
+ type: string
+ tracking: boolean
+ tags: Tag[]
+}
+
+interface Image {
+ url: string
+ size_type: string
+}
+
+interface Item {
+ long_desc: string
+ short_desc: string
+ id: string
+ name: string
+ price: Price
+ locations: Location[]
+ fulfillments: Fulfillment[]
+ images: Image[]
+ tags: Tag[]
+}
+
+interface LocationProvider {
+ id: string
+ name: string
+ rating: string
+ locations: Location[]
+ items: Item[]
+ images: Image[]
+}
+
+interface Message {
+ name: string
+ providers: LocationProvider[]
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+export interface SearchResponseModel {
+ context: Context
+ message: Message
+}
+
+export interface ParsedItemModel {
+ id: string
+ bppId: string
+ bppUri: string
+ domain: string
+ transactionId: string
+ providerId: string
+ providerName: string
+ item: Item
+ rating: string
+ providerCoordinates: Coordinate
+}
+
+export interface AssemblyData {
+ type: string
+ colour: string
+ shape: string
+ length: string
+ width: string
+ quantity?: number
+ weight: string
+}
diff --git a/apps/tourism/types/select.types.ts b/apps/tourism/types/select.types.ts
new file mode 100644
index 000000000..65801e8d0
--- /dev/null
+++ b/apps/tourism/types/select.types.ts
@@ -0,0 +1,75 @@
+interface Price {
+ currency: string
+ value: string
+}
+
+interface Image {
+ url: string
+ size_type: string
+}
+
+interface Tag {
+ code: string
+ name: string
+ display: boolean
+ list?: Array<{
+ name: string
+ value: string
+ }>
+}
+
+interface Item {
+ id: string
+ name: string
+ price: Price
+ tags: Tag[]
+}
+
+interface Provider {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ images: Image
+}
+
+interface Quote {
+ price: Price
+}
+
+interface Order {
+ type: string
+ quote: Quote
+ provider: Provider
+ items: Item[]
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: {
+ country: {
+ code: string
+ }
+ }
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Message {
+ order: Order
+}
+
+export interface SelectResponseModel {
+ context: Context
+ message: Message
+}
diff --git a/apps/tourism/types/status.types.ts b/apps/tourism/types/status.types.ts
new file mode 100644
index 000000000..88d746fa2
--- /dev/null
+++ b/apps/tourism/types/status.types.ts
@@ -0,0 +1,175 @@
+interface Location {
+ country: {
+ code: string
+ }
+}
+
+interface Images {
+ url: string
+ size_type: string
+}
+
+interface Provider {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ images: Images
+}
+
+interface Price {
+ currency: string
+ value: string
+}
+
+interface Tag {
+ code: string
+ name: string
+ display: boolean
+ list: { name: string; value: string }[]
+}
+
+interface Item {
+ id: string
+ name: string
+ short_desc: string
+ long_desc: string
+ price: Price
+ tags: Tag[]
+}
+
+interface StateDescriptor {
+ code: string
+ short_desc: string
+}
+
+interface State {
+ descriptor: StateDescriptor
+ updated_at: string
+}
+
+interface CustomerContact {
+ email: string
+ phone: string
+}
+
+interface Person {
+ name: string
+}
+
+interface Customer {
+ contact: CustomerContact
+ person: Person
+}
+
+interface LocationInfo {
+ gps: string
+ address: string
+ city: { name: string }
+ country: { code: string }
+ area_code: string
+ state: { name: string }
+}
+
+interface Contact {
+ phone: string
+}
+
+interface Stop {
+ type: string
+ location: LocationInfo
+ contact: Contact
+}
+
+interface Fulfillment {
+ id: string
+ state: State
+ customer: Customer
+ stops: Stop[]
+ tracking: boolean
+}
+
+interface Breakup {
+ price: Price
+ title: string
+}
+
+interface Quote {
+ breakup: Breakup[]
+ price: Price
+}
+
+interface Billing {
+ name: string
+ address: string
+ state: { name: string }
+ city: { name: string }
+ email: string
+ phone: string
+}
+
+interface Params {
+ amount: string
+ currency: string
+ bank_account_number: string
+ bank_code: string
+ bank_account_name: string
+}
+
+interface Payment {
+ collected_by: string
+ params: Params
+ status: string
+ type: string
+ transaction_id: string
+}
+
+interface CancellationTerms {
+ cancellation_fee: {
+ amount: Price
+ }
+}
+
+interface Order {
+ id: string
+ provider: Provider
+ items: Item
+ fulfillments: Fulfillment[]
+ quote: Quote
+ billing: Billing
+ payments: Payment[]
+ cancellation_terms: CancellationTerms[]
+ type: string
+}
+
+interface Context {
+ domain: string
+ action: string
+ version: string
+ bpp_id: string
+ bpp_uri: string
+ country: string
+ city: string
+ location: Location
+ bap_id: string
+ bap_uri: string
+ transaction_id: string
+ message_id: string
+ ttl: string
+ timestamp: string
+}
+
+interface Message {
+ order: Order
+}
+
+export interface StatusResponseModel {
+ length: number
+ context: Context
+ message: Message
+}
+
+export interface SupportModel {
+ phone: string
+ email: string
+}
diff --git a/apps/tourism/utilities/auth.ts b/apps/tourism/utilities/auth.ts
new file mode 100644
index 000000000..297ebe0ea
--- /dev/null
+++ b/apps/tourism/utilities/auth.ts
@@ -0,0 +1,8 @@
+import jwt from 'jsonwebtoken'
+import { IUser } from '../lib/types/user'
+
+export const signToken = (user: IUser) => {
+ return jwt.sign(user, process.env.JWT_SECRET as string, {
+ expiresIn: '30d'
+ })
+}
diff --git a/apps/tourism/utilities/calculateDiscountPercentage.ts b/apps/tourism/utilities/calculateDiscountPercentage.ts
new file mode 100644
index 000000000..147ff5c3c
--- /dev/null
+++ b/apps/tourism/utilities/calculateDiscountPercentage.ts
@@ -0,0 +1,3 @@
+export const calculateDiscountPercentage = (price: number, discountPercentage: number) => {
+ return price - price * (discountPercentage * 0.01)
+}
diff --git a/apps/tourism/utilities/cart-utils.ts b/apps/tourism/utilities/cart-utils.ts
new file mode 100644
index 000000000..a5b3b5656
--- /dev/null
+++ b/apps/tourism/utilities/cart-utils.ts
@@ -0,0 +1,75 @@
+import { CartItemForRequest, CartRetailItem, DataPerBpp } from '../lib/types/cart'
+import { ResponseModel } from '../lib/types/responseModel'
+
+export const getCartItemsPerBpp = (cart: CartItemForRequest[]) => {
+ const itemsPerBpp = {}
+
+ cart.map((item: CartItemForRequest) => {
+ const bppId = item.bpp_id
+
+ if (itemsPerBpp[bppId]) {
+ itemsPerBpp[bppId].push(item)
+ } else {
+ itemsPerBpp[bppId] = [item]
+ }
+ })
+
+ return itemsPerBpp
+}
+
+export const getPayloadForQuoteRequest = (
+ cartItemsPerBppPerProvider: DataPerBpp,
+ transactionId: { transactionId: string }
+) => {
+ const payload: any = {
+ selectRequestDto: []
+ }
+
+ Object.keys(cartItemsPerBppPerProvider).forEach(bppId => {
+ const cartItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: cartItemsPerBppPerProvider[bppId][0].bpp_uri,
+ domain: 'retail'
+ },
+ message: {
+ order: {
+ items: [],
+ provider: {
+ id: cartItemsPerBppPerProvider[bppId][0].providerId
+ },
+ locations: cartItemsPerBppPerProvider[bppId][0].locations
+ }
+ }
+ }
+ cartItemsPerBppPerProvider[bppId].forEach((item: any) => {
+ if (item.bpp_id === bppId) {
+ const itemObject = {
+ quantity: {
+ count: item.quantity
+ },
+ id: item.id
+ }
+ cartItem.message.order.items.push(itemObject)
+ }
+ })
+
+ payload.selectRequestDto.push(cartItem)
+ })
+ return payload
+}
+
+export const getItemsForCart = (quoteData: ResponseModel[]) => {
+ const items: CartRetailItem[] = []
+
+ quoteData.forEach(data => {
+ const { catalogs } = data.message
+ const { order } = catalogs
+ const { items: orderItems } = order
+
+ items.push(...orderItems)
+ })
+
+ return items
+}
diff --git a/apps/tourism/utilities/changeNumbersFormatEnToFa.ts b/apps/tourism/utilities/changeNumbersFormatEnToFa.ts
new file mode 100644
index 000000000..21c22c33e
--- /dev/null
+++ b/apps/tourism/utilities/changeNumbersFormatEnToFa.ts
@@ -0,0 +1,2 @@
+export const changeNumbersFormatEnToFa = (number: number | string) =>
+ number.toString().replace(/\d/g, index => '۰۱۲۳۴۵۶۷۸۹'[index])
diff --git a/apps/tourism/utilities/checkout-utils.ts b/apps/tourism/utilities/checkout-utils.ts
new file mode 100644
index 000000000..c528456d2
--- /dev/null
+++ b/apps/tourism/utilities/checkout-utils.ts
@@ -0,0 +1,198 @@
+import { ParsedItemModel } from '../types/search.types'
+import { InitResponseModel } from '../types/init.types'
+import { StatusResponseModel } from '../types/status.types'
+
+export const getPayloadForSelectRequest = (selectedProduct: ParsedItemModel) => {
+ const {
+ bppId,
+ bppUri,
+ transactionId,
+ domain,
+ providerId,
+ item: { id, fulfillments, tags }
+ } = selectedProduct
+
+ const selectPayload = {
+ data: [
+ {
+ context: {
+ transaction_id: transactionId,
+ bpp_id: bppId,
+ bpp_uri: bppUri,
+ domain: domain
+ },
+ message: {
+ orders: [
+ {
+ provider: {
+ id: providerId
+ },
+ items: [
+ {
+ id
+ }
+ ],
+ fulfillments,
+ tags: [
+ {
+ descriptor: {
+ name: 'select-1'
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+
+ return selectPayload
+}
+
+const extractAddressComponents = (result: any) => {
+ let country = null,
+ state = null,
+ city = null
+
+ for (const component of result.address_components) {
+ if (component.types.includes('country')) {
+ country = component.long_name
+ } else if (component.types.includes('administrative_area_level_1')) {
+ state = component.long_name
+ } else if (component.types.includes('locality')) {
+ city = component.long_name
+ }
+ }
+ return { country, state, city }
+}
+
+const geocodeFromPincode = async (pincode: any) => {
+ const geocoder = new window.google.maps.Geocoder()
+ try {
+ const response = await geocoder.geocode({ address: pincode })
+ console.log('respnse from the map', response)
+ if (response.results.length > 0) {
+ const { country, state, city } = extractAddressComponents(response.results[0])
+ return { country, state, city }
+ } else {
+ console.log('No results found')
+ }
+ } catch (error) {
+ console.error(error)
+ }
+}
+
+export const getPayloadForInitRequest = async (selectData: ParsedItemModel, shippingDetails: any, billingData: any) => {
+ try {
+ const { providerId, bppId, bppUri, domain, transactionId, item } = selectData
+ const { fulfillments } = item
+ const { name, address, email, mobileNumber, pinCode } = shippingDetails
+ const {
+ name: billingname,
+ address: billingAddress,
+ email: billingEmail,
+ mobileNumber: billingMobileNumber,
+ pinCode: billingPinCode
+ } = billingData
+
+ const cityData = await geocodeFromPincode(pinCode)
+
+ console.log('geocodeFromPincode(pinCode)', cityData)
+
+ const initPayload = {
+ data: [
+ {
+ context: {
+ transaction_id: transactionId,
+ bpp_id: bppId,
+ bpp_uri: bppUri,
+ domain: domain
+ },
+ message: {
+ orders: [
+ {
+ provider: {
+ id: providerId
+ },
+ items: [item],
+ fulfillments: [
+ {
+ id: fulfillments[0].id,
+ customer: {
+ contact: {
+ email,
+ mobileNumber
+ },
+ person: {
+ name
+ }
+ },
+ stops: [
+ {
+ type: 'end',
+ location: {
+ gps: '1.3806217468119772, 103.74636438437074',
+ address: address,
+ city: {
+ name: cityData?.city
+ },
+ country: {
+ code: ''
+ },
+ area_code: pinCode,
+ state: {
+ name: cityData?.state
+ }
+ },
+ contact: {
+ phone: mobileNumber
+ }
+ }
+ ]
+ }
+ ],
+ // fulfillments: fulfillments,
+ billing: {
+ name: billingname,
+ address: billingAddress,
+ state: {
+ name: cityData?.state
+ },
+ city: {
+ name: cityData?.city
+ },
+ email: billingEmail,
+ phone: billingMobileNumber
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+
+ return initPayload
+ } catch (error) {
+ console.error(error)
+ }
+}
+
+export const getPaymentBreakDown = (initData: InitResponseModel[] | StatusResponseModel[]) => {
+ const quote = initData[0].message.order.quote
+ const breakUp = quote.breakup
+ const totalPricewithCurrent = `${quote.price.currency} ${quote.price.value}`
+
+ const breakUpMap: Record = {}
+
+ breakUp.forEach(item => {
+ const {
+ title,
+ price: { currency, value }
+ } = item
+
+ breakUpMap[title] = `${currency} ${value} `
+ })
+
+ return { breakUpMap, totalPricewithCurrent }
+}
diff --git a/apps/tourism/utilities/common-utils.ts b/apps/tourism/utilities/common-utils.ts
new file mode 100644
index 000000000..0ca62856b
--- /dev/null
+++ b/apps/tourism/utilities/common-utils.ts
@@ -0,0 +1,40 @@
+export const toBinary = (objectString: string) => {
+ const codeUnits = Uint16Array.from({ length: objectString.length }, (element, index) =>
+ objectString.charCodeAt(index)
+ )
+ const charCodes = new Uint8Array(codeUnits.buffer)
+
+ let result = ''
+ charCodes.forEach(char => {
+ result += String.fromCharCode(char)
+ })
+ return result
+}
+
+export const fromBinary = (binary: string) => {
+ const bytes = Uint8Array.from({ length: binary.length }, (element, index) => binary.charCodeAt(index))
+ const charCodes = new Uint16Array(bytes.buffer)
+
+ let result = ''
+ charCodes.forEach(char => {
+ result += String.fromCharCode(char)
+ })
+ return result
+}
+
+export const areObjectPropertiesEqual = (obj1: any, obj2: any) => {
+ const keys1 = Object.keys(obj1)
+ const keys2 = Object.keys(obj2)
+
+ if (keys1.length !== keys2.length) {
+ return false
+ }
+
+ for (let key of keys1) {
+ if (obj1[key] !== obj2[key]) {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/apps/tourism/utilities/confirm-utils.ts b/apps/tourism/utilities/confirm-utils.ts
new file mode 100644
index 000000000..15de52678
--- /dev/null
+++ b/apps/tourism/utilities/confirm-utils.ts
@@ -0,0 +1,195 @@
+import { ConfirmResponseModel } from '../types/confirm.types'
+import { InitResponseModel } from '../types/init.types'
+
+export const getPayloadForTrackRequest = (
+ confirmOrderMetaDataPerBpp: any,
+ transactionId: { transactionId: string }
+) => {
+ const payload: any = {
+ trackRequestDto: []
+ }
+
+ Object.keys(confirmOrderMetaDataPerBpp).forEach(bppId => {
+ const statusItem: any = {
+ context: {
+ transaction_id: transactionId.transactionId,
+ bpp_id: bppId,
+ bpp_uri: confirmOrderMetaDataPerBpp[bppId].bpp_uri,
+ domain: 'retail'
+ },
+
+ message: {
+ order_id: confirmOrderMetaDataPerBpp[bppId].id
+ }
+ }
+
+ payload.trackRequestDto.push(statusItem)
+ })
+
+ return payload
+}
+
+export const getOrderPlacementTimeline = (timeStamp: string) => {
+ const localDateAndTime = new Date(timeStamp)
+ const localTime = localDateAndTime.toLocaleTimeString()
+ const localDate = localDateAndTime.toDateString()
+ const localDateWithoutDay = localDate.split(' ').slice(1).join(' ')
+
+ return `${localDateWithoutDay}, ${localTime}`
+}
+
+export const getPayloadForConfirm = (initResponse: InitResponseModel[]) => {
+ const {
+ context,
+ message: {
+ order: { billing, fulfillments, items, payments, provider, quote, type }
+ }
+ } = initResponse[0]
+ const { transaction_id, bpp_id, bpp_uri, domain } = context
+
+ const payload = {
+ data: [
+ {
+ context: {
+ transaction_id: transaction_id,
+ bpp_id: bpp_id,
+ bpp_uri: bpp_uri,
+ domain: domain
+ },
+ message: {
+ orders: [
+ {
+ provider: {
+ id: provider.id
+ },
+ items: items,
+ fulfillments: fulfillments,
+ billing: billing,
+ payments: payments
+ }
+ ]
+ }
+ }
+ ]
+ }
+
+ return payload
+}
+
+export const getPayloadForOrderStatus = (confirmResponse: ConfirmResponseModel[]) => {
+ const {
+ context: { transaction_id, bpp_id, bpp_uri, domain },
+ message: { orderId }
+ } = confirmResponse[0]
+ const payLoad = {
+ data: [
+ {
+ context: {
+ transaction_id: transaction_id,
+ bpp_id: bpp_id,
+ bpp_uri: bpp_uri,
+ domain: domain
+ },
+ message: {
+ order_id: orderId
+ }
+ }
+ ]
+ }
+
+ return payLoad
+}
+
+export const getPayloadForOrderHistoryPost = (confirmData: ConfirmResponseModel[]) => {
+ const { bpp_id, bpp_uri, transaction_id } = confirmData[0].context
+ const {
+ orderId,
+ provider: { id, name, short_desc },
+ items,
+ quote,
+ payments
+ } = confirmData[0].message
+
+ const ordersPayload = {
+ context: {
+ bpp_id,
+ bpp_uri,
+ transaction_id
+ },
+ message: {
+ order: {
+ id: orderId,
+ provider: {
+ id,
+ descriptor: {
+ name,
+ short_desc
+ }
+ },
+ items,
+ quote,
+ payments
+ }
+ },
+ category: {
+ set: [5]
+ }
+ }
+
+ return ordersPayload
+}
+
+export function convertTimestampToDdMmYyyyHhMmPM(timestamp: string) {
+ const date = new Date(timestamp)
+
+ const day = date.getDate()
+ const month = date.getMonth() + 1
+ const year = date.getFullYear()
+
+ let hour = date.getHours()
+ const minute = date.getMinutes()
+ const second = date.getSeconds()
+
+ const ampm = hour >= 12 ? 'pm' : 'am'
+ hour = hour % 12
+ if (hour === 0) {
+ hour = 12
+ }
+
+ const formattedTimestamp = `${day}/${month}/${year}, ${hour}:${minute} ${ampm}`
+
+ return formattedTimestamp
+}
+
+function getOrdinalSuffix(day: number) {
+ if (day >= 11 && day <= 13) {
+ return 'th'
+ }
+ switch (day % 10) {
+ case 1:
+ return 'st'
+ case 2:
+ return 'nd'
+ case 3:
+ return 'rd'
+ default:
+ return 'th'
+ }
+}
+
+export function formatTimestamp(timestamp: string) {
+ const date = new Date(timestamp)
+
+ const day = date.getDate()
+ const month = date.toLocaleString('default', { month: 'short' })
+ const year = date.getFullYear()
+ const hours = date.getHours() % 12 || 12
+ const minutes = date.getMinutes()
+ const period = date.getHours() < 12 ? 'am' : 'pm'
+
+ const ordinalSuffix = getOrdinalSuffix(day)
+
+ const formattedDate = `${day}${ordinalSuffix} ${month} ${year}, ${hours}.${minutes}${period}`
+
+ return formattedDate
+}
diff --git a/apps/tourism/utilities/currencyFormat.ts b/apps/tourism/utilities/currencyFormat.ts
new file mode 100644
index 000000000..00012cd95
--- /dev/null
+++ b/apps/tourism/utilities/currencyFormat.ts
@@ -0,0 +1,9 @@
+// Rial currency format
+export const irrCurrencyFormat = (price: number | undefined) => {
+ return price ? new Intl.NumberFormat('fa-IR').format(price) : null
+}
+
+//pound currency format
+export const gbpCurrencyFormat = (price: number | undefined) => {
+ return price ? new Intl.NumberFormat('en-GB').format(price) : null
+}
diff --git a/apps/tourism/utilities/error.ts b/apps/tourism/utilities/error.ts
new file mode 100644
index 000000000..1f5b60102
--- /dev/null
+++ b/apps/tourism/utilities/error.ts
@@ -0,0 +1,4 @@
+const getError = (err: any) =>
+ err.response && err.response.data && err.response.data.message ? err.response.data.message : err.message
+
+export { getError }
diff --git a/apps/tourism/utilities/form-utils.ts b/apps/tourism/utilities/form-utils.ts
new file mode 100644
index 000000000..0a71c41fc
--- /dev/null
+++ b/apps/tourism/utilities/form-utils.ts
@@ -0,0 +1,104 @@
+import { SignInPropsModel, SignUpPropsModel } from '../components/signIn/SignIn.types'
+import { ShippingFormData } from '../pages/checkoutPage'
+
+export interface FormErrors {
+ name?: string
+ mobileNumber?: string
+ email?: string
+ address?: string
+ zipCode?: string
+ password?: string
+}
+
+export const validateForm = (formData: ShippingFormData): FormErrors => {
+ const errors: FormErrors = {}
+
+ if (formData.name.trim() === '') {
+ errors.name = 'errorName'
+ }
+
+ if (formData.mobileNumber.trim() === '') {
+ errors.mobileNumber = 'errorNumber'
+ } else if (!/^\d{10}$/.test(formData.mobileNumber)) {
+ errors.mobileNumber = 'errorNumber2'
+ }
+
+ if (formData.email.trim() === '') {
+ errors.email = 'errorEmail'
+ } else if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(formData.email)) {
+ errors.email = 'errorEmail2'
+ }
+
+ if (formData.address.trim() === '') {
+ errors.address = 'errorAddress'
+ }
+
+ if (formData.zipCode.trim() === '') {
+ errors.zipCode = 'errorZipcode'
+ } else if (!/^\d{6}$/.test(formData.zipCode)) {
+ errors.zipCode = 'errorZipcode2'
+ }
+
+ return errors
+}
+
+export const signInValidateForm = (formData: SignInPropsModel): FormErrors => {
+ const errors: FormErrors = {}
+
+ if (formData.email.trim() === '') {
+ errors.email = 'errorEmail'
+ } else if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(formData.email)) {
+ errors.email = 'errorEmail'
+ }
+ if (formData.password.trim() === '') {
+ errors.password = 'errorPassword'
+ } else if (formData.password.length < 8) {
+ errors.password = 'errorPassword2'
+ } else if (!/[A-Z]/.test(formData.password)) {
+ errors.password = 'errorPassword3'
+ } else if (!/[$&+,:;=?@#|'<>.^*()%!-]/.test(formData.password)) {
+ errors.password = 'errorPassword4'
+ } else if (/^\d+$/.test(formData.password)) {
+ errors.password = 'errorPassword5'
+ } else if (!/[0-9]/.test(formData.password)) {
+ errors.password = 'errorPassword6'
+ }
+
+ return errors
+}
+export const signUpValidateForm = (formData: SignUpPropsModel): FormErrors => {
+ const errors: FormErrors = {}
+
+ if (formData.name.trim() === '') {
+ errors.name = 'errorName'
+ } else if (!/^[A-Za-z\s]*$/.test(formData.name)) {
+ errors.name = 'errorName2'
+ } else if (formData.name.length < 3) {
+ errors.name = 'errorName3'
+ }
+
+ if (formData.email.trim() === '') {
+ errors.email = 'errorEmail'
+ } else if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(formData.email)) {
+ errors.email = 'errorEmail'
+ }
+ if (formData.password.trim() === '') {
+ errors.password = 'errorPassword'
+ } else if (formData.password.length < 8) {
+ errors.password = 'errorPassword2'
+ } else if (/^\d+$/.test(formData.password)) {
+ errors.password = 'errorPassword3'
+ } else if (!/[A-Z]/.test(formData.password)) {
+ errors.password = 'errorPassword4'
+ } else if (!/[$&+,:;=?@#|'<>.^*()%!-]/.test(formData.password)) {
+ errors.password = 'errorPassword5'
+ } else if (!/[0-9]/.test(formData.password)) {
+ errors.password = 'errorPassword6'
+ }
+ if (formData.mobileNumber.trim() === '') {
+ errors.mobileNumber = 'errorNumber'
+ } else if (!/^\d{10}$/.test(formData.mobileNumber)) {
+ errors.mobileNumber = 'errorNumber2'
+ }
+ return errors
+}
diff --git a/apps/tourism/utilities/homePage.utils.ts b/apps/tourism/utilities/homePage.utils.ts
new file mode 100644
index 000000000..c25227384
--- /dev/null
+++ b/apps/tourism/utilities/homePage.utils.ts
@@ -0,0 +1,27 @@
+export interface Coordinate {
+ latitude: number
+ longitude: number
+}
+
+const toRadians = (degrees: number): number => {
+ return (degrees * Math.PI) / 180
+}
+
+export const calculateDistance = (coord1: Coordinate, coord2: Coordinate): number => {
+ const R = 6371
+
+ const dLat = toRadians(coord2.latitude - coord1.latitude)
+ const dLon = toRadians(coord2.longitude - coord1.longitude)
+
+ const a =
+ Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+ Math.cos(toRadians(coord1.latitude)) *
+ Math.cos(toRadians(coord2.latitude)) *
+ Math.sin(dLon / 2) *
+ Math.sin(dLon / 2)
+
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
+ const distance = R * c
+
+ return distance
+}
diff --git a/apps/tourism/utilities/orderDetails-utils.ts b/apps/tourism/utilities/orderDetails-utils.ts
new file mode 100644
index 000000000..7d82e79e4
--- /dev/null
+++ b/apps/tourism/utilities/orderDetails-utils.ts
@@ -0,0 +1,65 @@
+import { ResponseModel } from '../lib/types/responseModel'
+
+const generateRandomID = () => {
+ var id = ''
+
+ for (var i = 0; i < 6; i++) {
+ var randomDigit = Math.floor(Math.random() * 10)
+ id += randomDigit
+ }
+
+ return id
+}
+
+export const storeOrderDetails = (orderDetails: ResponseModel[]) => {
+ const emptyArr = []
+ const orders = localStorage.getItem('orders')
+
+ const orderPerId = {}
+ if (!orders) {
+ orderPerId[generateRandomID()] = orderDetails
+ emptyArr.push(orderPerId)
+ return localStorage.setItem('orders', JSON.stringify(emptyArr))
+ }
+
+ orderPerId[generateRandomID()] = orderDetails
+ const existingOrders = JSON.parse(orders)
+ let updatedOrders = [...existingOrders, orderPerId]
+
+ return localStorage.setItem('orders', JSON.stringify(updatedOrders))
+}
+
+export const getDataPerBpp = (confirmData: ResponseModel[]) => {
+ const responsesPerBpp = {}
+
+ confirmData.map(data => {
+ const bppId = data.context.bpp_id
+ responsesPerBpp[bppId] = {
+ ...data.message.responses[0].message.order
+ }
+ })
+
+ return responsesPerBpp
+}
+
+export const generateAlphanumericID = (function () {
+ const length = 6
+ const characters = '0123456789'
+ let cachedID: any = null
+
+ return function () {
+ if (cachedID) {
+ return cachedID
+ }
+
+ let id = ''
+
+ for (let i = 0; i < length; i++) {
+ const randomIndex = Math.floor(Math.random() * characters.length)
+ id += characters[randomIndex]
+ }
+
+ cachedID = id
+ return id
+ }
+})()
diff --git a/apps/tourism/utilities/orderHistory-utils.ts b/apps/tourism/utilities/orderHistory-utils.ts
new file mode 100644
index 000000000..3d8f2439e
--- /dev/null
+++ b/apps/tourism/utilities/orderHistory-utils.ts
@@ -0,0 +1,27 @@
+export const getTotalQuantityOfSingleOrder = (orderArray: any) => {
+ let totalQuantity = 0
+ orderArray.map((res: any) => {
+ const itemsLength: number = res.message.responses[0].message.order.items.length
+ totalQuantity += itemsLength
+ })
+ return totalQuantity
+}
+
+export const getTotalPriceOfSingleOrder = (orderArray: any) => {
+ let totalPrice = 0
+ orderArray.map((res: any) => {
+ const price: number = parseFloat(res.message.responses[0].message.order.payment.params.amount)
+ totalPrice += price
+ })
+ return totalPrice
+}
+
+export const retrieveArrayById = (id: string, data: any) => {
+ for (const item of data) {
+ const itemId = Object.keys(item)[0]
+ if (itemId === id.toString()) {
+ return item[itemId]
+ }
+ }
+ return []
+}
diff --git a/apps/tourism/utilities/search-results.utils.ts b/apps/tourism/utilities/search-results.utils.ts
new file mode 100644
index 000000000..ddf19e70e
--- /dev/null
+++ b/apps/tourism/utilities/search-results.utils.ts
@@ -0,0 +1,45 @@
+import { ParsedItemModel, SearchResponseModel } from '../types/search.types'
+
+export const parsedSearchlist = (data: SearchResponseModel[]) => {
+ const itemsarray: ParsedItemModel[] = []
+ data.forEach(entry => {
+ const context = entry.context
+ const message = entry.message
+ const domain = context.domain
+ const transactionId = context.transaction_id
+ const bppId = context.bpp_id
+ const bppUri = context.bpp_uri
+
+ message.providers.forEach(provider => {
+ const stringifiedLatLong = provider.locations[0].gps
+ const [stringifiedLatitude, stringifiedLongitude] = stringifiedLatLong.split(', ')
+
+ const latitude = parseFloat(stringifiedLatitude)
+ const longitude = parseFloat(stringifiedLongitude)
+
+ const providerCoordinates = {
+ latitude,
+ longitude
+ }
+
+ const providerId = provider.id
+ const rating = provider.rating
+
+ provider.items.forEach(item => {
+ itemsarray.push({
+ bppId: bppId,
+ bppUri: bppUri,
+ domain,
+ transactionId,
+ providerId: providerId,
+ providerName: provider.name,
+ item,
+ rating,
+ providerCoordinates
+ })
+ })
+ })
+ })
+
+ return itemsarray
+}
diff --git a/apps/tourism/utilities/sortByCost.ts b/apps/tourism/utilities/sortByCost.ts
new file mode 100644
index 000000000..ea06410d1
--- /dev/null
+++ b/apps/tourism/utilities/sortByCost.ts
@@ -0,0 +1,9 @@
+import { RetailItem } from '../lib/types/products'
+
+export const sortByExpensive = (product1: RetailItem, product2: RetailItem): number => {
+ return parseFloat(product2.price.value) - parseFloat(product1.price.value)
+}
+
+export const sortByCheapest = (product1: RetailItem, product2: RetailItem): number => {
+ return parseFloat(product1.price.value) - parseFloat(product2.price.value)
+}
diff --git a/apps/tourism/utilities/sortByPopularity.ts b/apps/tourism/utilities/sortByPopularity.ts
new file mode 100644
index 000000000..f6753420d
--- /dev/null
+++ b/apps/tourism/utilities/sortByPopularity.ts
@@ -0,0 +1,10 @@
+// import { IProduct, RetailItem } from "../lib/types/products";
+
+// export const sortByPoPularity = (
+// product1: RetailItem,
+// product2: RetailItem
+// ): number => {
+// return product2.starRating - product1.starRating;
+// };
+
+export {}
diff --git a/apps/tourism/utilities/sortByTimeStamp.ts b/apps/tourism/utilities/sortByTimeStamp.ts
new file mode 100644
index 000000000..ddfd6137d
--- /dev/null
+++ b/apps/tourism/utilities/sortByTimeStamp.ts
@@ -0,0 +1,28 @@
+// import { IProduct, RetailItem } from "../lib/types/products";
+
+// export function getTimeStamp(date: string) {
+// const creationProductDate = new Date(date);
+// return creationProductDate.getTime();
+// }
+
+// export const sortByTimeStamp = (
+// product1: IProduct,
+// product2: IProduct
+// ): number => {
+// if (product2?.timeStamp && product1?.timeStamp) {
+// return product2?.timeStamp - product1?.timeStamp;
+// }
+// return 0;
+// };
+
+// export const newestProductsFn = (products: RetailItem[]) => {
+// const productsWithTimeStamp = products.map((product) => {
+// return {
+// ...product,
+// timeStamp: getTimeStamp(product.registerDate!),
+// };
+// });
+// return productsWithTimeStamp.sort(sortByTimeStamp);
+// };
+
+export {}
diff --git a/package.json b/package.json
index 4a0fac5b4..f50de4e63 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,12 @@
"dev:retail": "yarn workspace @beckn-ui/retail dev",
"build:retail": "yarn workspace @beckn-ui/retail build",
"start:retail": "yarn workspace @beckn-ui/retail start",
+ "dev:mobility-bap": "yarn workspace @beckn-ui/mobility-bap dev",
+ "build:mobility-bap": "yarn workspace @beckn-ui/mobility-bap build",
+ "start:mobility-bap": "yarn workspace @beckn-ui/mobility-bap start",
+ "dev:tourism": "yarn workspace @beckn-ui/tourism dev",
+ "build:tourism": "yarn workspace @beckn-ui/tourism build",
+ "start:tourism": "yarn workspace @beckn-ui/tourism start",
"test": "jest",
"lint:fix": "eslint --fix",
"lint": "eslint",
diff --git a/packages/becknified-components/src/components/cart/cart-item.module.css b/packages/becknified-components/src/components/cart/cart-item.module.css
index 7afe221e7..5e9a97b2d 100644
--- a/packages/becknified-components/src/components/cart/cart-item.module.css
+++ b/packages/becknified-components/src/components/cart/cart-item.module.css
@@ -22,7 +22,7 @@
}
@media (min-width: 640px) {
- min-width: 290px;
+ /* min-width: 480px; */
}
}
@@ -33,6 +33,9 @@
@media (min-width: 640px) {
flex-wrap: nowrap;
}
+ @media (min-width: 640px) and (max-width: 1024px) {
+ display: block;
+ }
justify-content: center;
align-items: center;
@@ -41,8 +44,11 @@
.product_image_container {
width: 80px;
- height: 80px;
- margin-bottom: 5px;
+ height: 100%;
+ margin-bottom: 20px;
+ @media (min-width: 640px) and (max-width: 1024px) {
+ margin: 0 auto;
+ }
}
.product_name {
@@ -59,7 +65,7 @@
padding-top: 0.25rem;
@media (min-width: 640px) {
- margin-bottom: 0;
+ margin-bottom: 8px;
}
}
diff --git a/packages/becknified-components/src/components/cart/cart-item.tsx b/packages/becknified-components/src/components/cart/cart-item.tsx
index 2b462082b..4ca5c08bd 100644
--- a/packages/becknified-components/src/components/cart/cart-item.tsx
+++ b/packages/becknified-components/src/components/cart/cart-item.tsx
@@ -1,9 +1,9 @@
-import { Image, Box, Divider } from '@chakra-ui/react'
+import { Image } from '@chakra-ui/react'
import React, { useState } from 'react'
import { HiMinusSm, HiOutlinePlusSm, HiOutlineTrash } from 'react-icons/hi'
+import ProductPrice from '../product-price'
// Custom modules
-import ProductPrice from './product-price'
import Styles from './cart-item.module.css'
import { CartItemProps } from './cart.types'
@@ -22,12 +22,12 @@ const CartItem: React.FC = ({
function increment() {
setCounter(prev => ++prev!)
- handleIncrement()
+ handleIncrement(id)
}
function decrement() {
setCounter(prev => --prev!)
- handleDecrement()
+ handleDecrement(id)
}
function onInputNumberChangeHandler(e: React.ChangeEvent) {
@@ -88,8 +88,8 @@ const CartItem: React.FC = ({
diff --git a/packages/becknified-components/src/components/cart/cart-list.tsx b/packages/becknified-components/src/components/cart/cart-list.tsx
index 3396c1c87..74e0f75c7 100644
--- a/packages/becknified-components/src/components/cart/cart-list.tsx
+++ b/packages/becknified-components/src/components/cart/cart-list.tsx
@@ -7,7 +7,7 @@ import Styles from './cart-list.module.css'
const CartList: React.FC = ({ cartItems }) => {
return (
-
+
{cartItems.length !== 0
? cartItems.map((cartItem: CartItemProps) => {
diff --git a/packages/becknified-components/src/components/cart/cart.module.css b/packages/becknified-components/src/components/cart/cart.module.css
index cb6310bfa..ba9c821e3 100644
--- a/packages/becknified-components/src/components/cart/cart.module.css
+++ b/packages/becknified-components/src/components/cart/cart.module.css
@@ -9,12 +9,12 @@
display: flex;
justify-content: center;
flex-direction: column;
- align-items: flex-start;
+ align-items: center;
position: relative;
- max-width: 2100px;
+ max-width: 131.25rem;
margin: 0 auto;
@media (min-width: 768px) {
- flex-direction: row;
+ max-width: 60%;
}
}
diff --git a/packages/becknified-components/src/components/cart/cart.tsx b/packages/becknified-components/src/components/cart/cart.tsx
index a2544e0b6..00e52aaed 100644
--- a/packages/becknified-components/src/components/cart/cart.tsx
+++ b/packages/becknified-components/src/components/cart/cart.tsx
@@ -16,7 +16,16 @@ const Cart: React.FC
= ({
className
}) => {
if (isLoading) {
- return
+ return (
+
+
+
+ )
}
if (cartItems.length == 0) {
diff --git a/packages/becknified-components/src/components/cart/cart.types.ts b/packages/becknified-components/src/components/cart/cart.types.ts
index ed9700cd6..86a62ea16 100644
--- a/packages/becknified-components/src/components/cart/cart.types.ts
+++ b/packages/becknified-components/src/components/cart/cart.types.ts
@@ -1,5 +1,5 @@
import { LoaderProps, TypographyProps, ButtonProps } from '@beckn-ui/molecules'
-import { ProductPriceProps } from '../types'
+import { CurrencyType, ProductPriceProps } from '../types'
export interface RetailItem {
extended_attributes?: any
price: {
@@ -46,9 +46,9 @@ export interface CartItemProps {
name: string
image: string
price: number
- symbol: string
- handleIncrement: () => void
- handleDecrement: () => void
+ symbol: CurrencyType
+ handleIncrement: (id: string) => void
+ handleDecrement: (id: string) => void
className?: string
}
@@ -60,6 +60,7 @@ export interface OrderSummaryProps {
totalQuantity: TypographyProps
totalAmount: ProductPriceProps
pageCTA: ButtonProps
+ currency: string
}
export interface CartProps {
diff --git a/packages/becknified-components/src/components/cart/order-summary.module.css b/packages/becknified-components/src/components/cart/order-summary.module.css
index 1536eaa42..6a22da987 100644
--- a/packages/becknified-components/src/components/cart/order-summary.module.css
+++ b/packages/becknified-components/src/components/cart/order-summary.module.css
@@ -5,7 +5,9 @@
left: 0;
right: 0;
top: 9rem;
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ box-shadow:
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1),
+ 0 4px 6px -2px rgba(0, 0, 0, 0.05);
background-color: #fcfbfe;
border-width: 2px;
border-radius: 0.5rem;
@@ -17,13 +19,11 @@
margin-right: -1rem;
width: 98vw;
min-width: 300px;
- max-width: 400px;
- margin-top: 15px;
- z-index: 9;
+ max-width: 100%;
+ margin-top: 15px;
+ z-index: 9;
}
-
-
.orderSummaryDetails {
flex-direction: column;
margin-top: 1rem;
@@ -37,10 +37,9 @@
justify-content: space-between;
margin-top: 1rem;
margin-bottom: 1rem;
+ padding-right: 10px;
}
-
-
.orderSummaryQuantity {
margin-left: 0.25rem; /* rtl:ml-1 */
margin-right: 0.25rem; /* ltr:mr-1 */
@@ -54,7 +53,7 @@
padding-bottom: 0.75rem;
text-align: center;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); */
- margin-top: 15px;
+ margin-top: 15px;
}
/* Additional styles for different screen sizes can be added using media queries */
diff --git a/packages/becknified-components/src/components/checkout/checkout-item-details.tsx b/packages/becknified-components/src/components/checkout/checkout-item-details.tsx
index 7a94a9a0e..06ae84180 100644
--- a/packages/becknified-components/src/components/checkout/checkout-item-details.tsx
+++ b/packages/becknified-components/src/components/checkout/checkout-item-details.tsx
@@ -1,40 +1,61 @@
import React from 'react'
-import { Text, Box, Flex, Divider } from '@chakra-ui/react'
+import { Text, Box, Flex, Divider, Image } from '@chakra-ui/react'
import { Typography } from '@beckn-ui/molecules'
import { ItemDetailProps } from './checkout.types'
+import { useBreakpoint } from '@chakra-ui/react'
+import ProductPrice from '../product-price/product-price'
+
+const ItemDetails: React.FC = ({ title, quantity, price, currency, description, image }) => {
+ const breakpoint = useBreakpoint()
+ const mobileBreakpoints = ['base', 'sm', 'md']
+ const isLargeScreen = !mobileBreakpoints.includes(breakpoint)
-const ItemDetails: React.FC = ({ title, quantity, priceWithSymbol }) => {
return (
<>
-
-
-
-
-
-
-
-
-
+
+ {isLargeScreen && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
>
diff --git a/packages/becknified-components/src/components/checkout/checkout.tsx b/packages/becknified-components/src/components/checkout/checkout.tsx
index 5afc3dd83..61dcdc58c 100644
--- a/packages/becknified-components/src/components/checkout/checkout.tsx
+++ b/packages/becknified-components/src/components/checkout/checkout.tsx
@@ -1,6 +1,6 @@
import React, { useState } from 'react'
-import { Box } from '@chakra-ui/react'
-import { FormField, Typography, Loader, Button } from '@beckn-ui/molecules'
+import { Box, useBreakpoint } from '@chakra-ui/react'
+import { FormField, Typography, Loader, Button, LoaderWithMessage } from '@beckn-ui/molecules'
import DetailsCard from './details-card'
import ItemDetails from './checkout-item-details'
import ShippingSection from './shipping-section'
@@ -12,14 +12,27 @@ const Checkout: React.FC> = ({
isLoading = false,
hasInitResult = false
}) => {
- if (isLoading) return
-
+ if (isLoading)
+ return (
+
+
+
+ )
const { disabled, ...restButtonProps } = pageCTA
const [shippingData, setShippingData] = useState(
shipping.shippingForm.values || ({} as ShippingFormInitialValuesType)
)
+ const breakpoint = useBreakpoint()
+ const mobileBreakpoints = ['base', 'sm', 'md']
+ const isLargeScreen = !mobileBreakpoints.includes(breakpoint)
+
return (
<>
@@ -38,7 +51,9 @@ const Checkout: React.FC> = ({
title={item.title}
description={item.description}
quantity={item.quantity}
- priceWithSymbol={item.priceWithSymbol}
+ price={item.price}
+ currency={item.currency}
+ image={item.image}
/>
>
)
@@ -64,10 +79,15 @@ const Checkout: React.FC> = ({
>
)}
-
+
+
+
>
)
diff --git a/packages/becknified-components/src/components/checkout/checkout.types.ts b/packages/becknified-components/src/components/checkout/checkout.types.ts
index 7df068954..06fd445b9 100644
--- a/packages/becknified-components/src/components/checkout/checkout.types.ts
+++ b/packages/becknified-components/src/components/checkout/checkout.types.ts
@@ -1,4 +1,4 @@
-import { FormData, FormField, ButtonProps, LoaderProps } from '@beckn-ui/molecules'
+import { FormData, FormField, ButtonProps, LoaderProps, LoaderWithMessagePropsModel } from '@beckn-ui/molecules'
export type ShippingFormInitialValuesType = {
name: string
@@ -25,13 +25,18 @@ export interface ShippingSectionProps {
showDetails?: boolean
isBilling?: boolean
addButtonImage?: string
+ isChecked?: boolean
+ onCheckChange?: () => void
}
export interface ItemDetailProps {
+ currency: any
+ price: any
title: string
description: string
quantity: number
priceWithSymbol: string
+ image?: string
}
export interface ShippingDetailsProps {
@@ -45,6 +50,8 @@ export interface PaymentDetailsProps {
paymentBreakDown: Record
totalText: string
totalValueWithSymbol: string
+ title?: string
+ hasBoxShadow?: boolean
}
export interface CheckoutProps {
diff --git a/packages/becknified-components/src/components/checkout/payment-details.tsx b/packages/becknified-components/src/components/checkout/payment-details.tsx
index f87f00754..fe9e7c758 100644
--- a/packages/becknified-components/src/components/checkout/payment-details.tsx
+++ b/packages/becknified-components/src/components/checkout/payment-details.tsx
@@ -4,44 +4,66 @@ import { Typography } from '@beckn-ui/molecules'
import { PaymentDetailsProps } from './checkout.types'
const PaymentDetails: React.FC = props => {
+ // const boxShadowProp = props.hasBoxShadow ?
return (
- {Object.entries(props.paymentBreakDown).map(([property, value]) => (
+ {props.title && (
+
+
+
+ )}
+
+ {Object.entries(props.paymentBreakDown).map(([property, value]) => (
+
+
+
+
+ ))}
+
+
-
-
-
- ))}
-
-
-
-
-
-
-
+
+
+
+
+
)
}
diff --git a/packages/becknified-components/src/components/checkout/shipping-section.tsx b/packages/becknified-components/src/components/checkout/shipping-section.tsx
index 734944b96..acc23e320 100644
--- a/packages/becknified-components/src/components/checkout/shipping-section.tsx
+++ b/packages/becknified-components/src/components/checkout/shipping-section.tsx
@@ -1,7 +1,9 @@
import React, { useState } from 'react'
import { Box, Flex, Image, useDisclosure, Checkbox } from '@chakra-ui/react'
import DetailsCard from './details-card'
+import useResponsive from '../../hooks/useResponsive'
import ShippingForm from './shipping-form'
+import { PlusSquareIcon } from '@chakra-ui/icons'
import { ShippingFormProps, ShippingSectionProps, ShippingFormInitialValuesType } from './checkout.types'
import AddShippingButtonImage from '../../../public/images/addShippingBtn.svg'
@@ -18,10 +20,13 @@ const ShippingSection: React.FC> = ({
showDetails = false,
isBilling = false,
shippingDetails,
- addButtonImage = AddShippingButtonImage
+ addButtonImage = AddShippingButtonImage,
+ isChecked = true,
+ onCheckChange
}) => {
const { isOpen, onClose, onOpen } = useDisclosure()
- const [isChecked, setIsChecked] = useState(true)
+ // const [isChecked, setIsChecked] = useState(true)
+ const { isDesktop, isTablet } = useResponsive()
return (
@@ -45,11 +50,14 @@ const ShippingSection: React.FC> = ({
{isBilling ? (
setIsChecked(!isChecked)}
+ defaultChecked={isChecked}
+ defaultValue={isChecked}
+ onChange={() => onCheckChange && onCheckChange()}
>
Same as shipping address
@@ -60,7 +68,8 @@ const ShippingSection: React.FC> = ({
alignItems={'center'}
onClick={onOpen}
>
-
+ {/* */}
+
> = ({
title={formTitle}
isOpen={isOpen}
onClose={onClose}
+ responsive={isTablet || isDesktop}
>
diff --git a/packages/becknified-components/src/components/detail-card/detail-card.tsx b/packages/becknified-components/src/components/detail-card/detail-card.tsx
index e19c0179c..b150204d3 100644
--- a/packages/becknified-components/src/components/detail-card/detail-card.tsx
+++ b/packages/becknified-components/src/components/detail-card/detail-card.tsx
@@ -13,7 +13,10 @@ const DetailCard: React.FC = props => {
= ({
+ currency,
+ totalPrice,
+ handleDecrement,
+ handleIncrement,
+ counter,
+ cta
+}) => {
+ const theme = useTheme()
+ const { isMobile } = useResponsive()
+
+ return (
+
+ {isMobile && (
+
+ )}
+
+
+
+
+
+
+ -
+
+
+ {counter}
+
+
+ +
+
+
+
+
+
+
+ )
+}
+
+export default ProductCta
diff --git a/packages/becknified-components/src/components/product-Cta/product-cta.types.ts b/packages/becknified-components/src/components/product-Cta/product-cta.types.ts
new file mode 100644
index 000000000..4c0719569
--- /dev/null
+++ b/packages/becknified-components/src/components/product-Cta/product-cta.types.ts
@@ -0,0 +1,9 @@
+import { ButtonProps } from '@beckn-ui/molecules'
+export interface ProductCtaProps {
+ currency: string
+ totalPrice: string
+ handleIncrement: () => void
+ handleDecrement: () => void
+ counter: number
+ cta: ButtonProps
+}
diff --git a/packages/becknified-components/src/components/product-card/product-card.tsx b/packages/becknified-components/src/components/product-card/product-card.tsx
index b51673b60..9e945cef8 100644
--- a/packages/becknified-components/src/components/product-card/product-card.tsx
+++ b/packages/becknified-components/src/components/product-card/product-card.tsx
@@ -6,7 +6,15 @@ import ProductPrice from '../product-price'
import ProductRating from '../product-rating'
const ProductCard: React.FC = props => {
- const { product, productInfoDataSource, ComponentRenderer, productClickHandler, dataSource, className = '' } = props
+ const {
+ product,
+ productInfoDataSource,
+ ComponentRenderer,
+ productClickHandler,
+ dataSource,
+ className = '',
+ currency
+ } = props
if (ComponentRenderer) {
return
@@ -23,6 +31,9 @@ const ProductCard: React.FC = props => {
backgroundColor={'#fff'}
borderRadius={'1rem'}
display={'flex'}
+ cursor="pointer"
+ _hover={{ transform: 'translate(2%,-2%)' }}
+ transition="0.5s all"
position={'relative'}
boxShadow={'0 20px 25px rgba(0, 0, 0, 0.1),0 8px 10px rgba(0, 0, 0, 0.05)'}
>
@@ -34,13 +45,14 @@ const ProductCard: React.FC = props => {
= props => {
>
@@ -72,8 +84,8 @@ const ProductCard: React.FC = props => {
>
= props => {
+
+
+ {product.shortDesc}
+
+
+
{productInfoDataSource &&
Object.entries(productInfoDataSource).map(([key, value]) => (
= props => {
bottom={'11px'}
width={'calc(100% - 30px)'}
>
-
+
{product.rating && (
productClickHandler?: React.MouseEventHandler