From 163ad655b6580cee851d2f428367eb7adf46c62c Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Tue, 24 Jun 2025 22:03:56 +0200 Subject: [PATCH 01/11] copy1 --- src/App.tsx | 15 +- src/Layout/Layout.scss | 30 ++ src/Layout/Layout.tsx | 40 ++ src/Layout/index.ts | 1 + src/components/CartItem/CartItem.scss | 147 +++++++ src/components/CartItem/CartItem.tsx | 79 ++++ src/components/CartItem/index.ts | 1 + .../PicturesSlider/PicturesSlider.scss | 165 ++++++++ .../PicturesSlider/PicturesSlider.tsx | 167 ++++++++ src/components/PicturesSlider/index.ts | 1 + .../ProductContentBottom.scss | 131 ++++++ .../ProductContentBottom.tsx | 84 ++++ src/components/ProductContentBottom/index.ts | 1 + .../ProductContentTop/ProductContentTop.scss | 390 ++++++++++++++++++ .../ProductContentTop/ProductContentTop.tsx | 261 ++++++++++++ src/components/ProductContentTop/index.ts | 1 + .../ShopByCategory/ShopByCategory.scss | 93 +++++ .../ShopByCategory/ShopByCategory.tsx | 86 ++++ src/components/ShopByCategory/index.ts | 1 + src/constants/colors.ts | 22 + src/constants/icons.ts | 174 ++++++++ src/constants/navLinks.ts | 11 + src/context/GlobalContext.tsx | 183 ++++++++ src/hooks/useLocaleStorage.tsx | 29 ++ src/hooks/useTheme.tsx | 17 + src/icons/Close.svg | 3 + src/icons/Home.svg | 4 + src/icons/Menu.svg | 5 + src/icons/Minus.svg | 3 + src/icons/MinusDarkDisabled.svg | 3 + src/icons/Plus.svg | 3 + src/icons/PlusDark.png | Bin 0 -> 229 bytes src/icons/PlusDark.svg | 3 + src/icons/Union.svg | 3 + src/icons/arrow_down_dark.svg | 3 + src/icons/arrow_left.svg | 3 + src/icons/arrow_left__disabled.svg | 3 + src/icons/arrow_left_dark.svg | 3 + src/icons/arrow_left_dark__disabled.svg | 3 + src/icons/arrow_right.svg | 3 + src/icons/arrow_right__disabled.svg | 3 + src/icons/arrow_right_dark.svg | 3 + src/icons/arrow_right_dark__disabled.svg | 3 + src/icons/close__disabled.svg | 3 + src/icons/close_dark.svg | 3 + src/icons/favorites.svg | 3 + src/icons/favorites__filled.svg | 3 + src/icons/favorites_dark.svg | 3 + src/icons/home_dark.svg | 4 + src/icons/menu_dark.svg | 5 + src/icons/minus__disabled.svg | 3 + src/icons/minus_dark.svg | 3 + src/icons/minus_dark__disabled.svg | 4 + src/icons/plus_dark.svg | 4 + src/icons/plus_dark1.png | 0 src/icons/search.svg | 3 + src/icons/search_dark.svg | 3 + src/icons/shopping_cart.svg | 5 + src/icons/shopping_cart_dark.svg | 5 + src/images/favicon.svg | 9 + src/images/logo.svg | 25 ++ src/images/logo_dark.svg | 25 ++ src/pages/FavoritesPage/FavoritesPage.scss | 36 ++ src/pages/FavoritesPage/FavoritesPage.tsx | 57 +++ src/pages/FavoritesPage/index.ts | 1 + src/pages/HomePage/HomePage.scss | 26 ++ src/pages/HomePage/HomePage.tsx | 79 ++++ src/pages/HomePage/index.ts | 1 + src/pages/NotFoundPage/NotFoundPage.scss | 7 + src/pages/NotFoundPage/NotFoundPage.tsx | 10 + src/pages/NotFoundPage/index.ts | 1 + .../ProductDetailsPage.scss | 36 ++ .../ProductDetailsPage/ProductDetailsPage.tsx | 152 +++++++ src/pages/ProductDetailsPage/index.ts | 1 + src/pages/ProductPage/ProductPage.scss | 98 +++++ src/pages/ProductPage/ProductPage.tsx | 213 ++++++++++ src/pages/ProductPage/index.ts | 1 + .../ShoppingCartPage/ShoppingCartPage.scss | 128 ++++++ .../ShoppingCartPage/ShoppingCartPage.tsx | 87 ++++ src/pages/ShoppingCartPage/index.ts | 1 + src/routes/Routes.tsx | 47 +++ src/routes/index.ts | 1 + src/routes/lazyLoad.ts | 35 ++ src/shared/Breadcrumbs/Breadcrumbs.scss | 43 ++ src/shared/Breadcrumbs/Breadcrumbs.tsx | 55 +++ src/shared/Breadcrumbs/index.ts | 1 + src/shared/ButtonBack/ButtonBack.scss | 22 + src/shared/ButtonBack/ButtonBack.tsx | 24 ++ src/shared/ButtonBack/index.ts | 1 + src/shared/Dropdown/Dropdown.scss | 88 ++++ src/shared/Dropdown/Dropdown.tsx | 94 +++++ src/shared/Dropdown/index.ts | 1 + src/shared/Filter/Filter.scss | 59 +++ src/shared/Filter/Filter.tsx | 107 +++++ src/shared/Filter/index.ts | 1 + src/shared/Footer/Footer.scss | 108 +++++ src/shared/Footer/Footer.tsx | 72 ++++ src/shared/Footer/index.ts | 1 + src/shared/Header/Header.scss | 296 +++++++++++++ src/shared/Header/Header.tsx | 196 +++++++++ src/shared/Header/index.ts | 1 + src/shared/Icon/Icon.scss | 7 + src/shared/Icon/Icon.tsx | 12 + src/shared/Icon/index.ts | 1 + src/shared/Loader/Loader.scss | 31 ++ src/shared/Loader/Loader.tsx | 24 ++ src/shared/Loader/index.ts | 1 + src/shared/Menu/Menu.scss | 69 ++++ src/shared/Menu/Menu.tsx | 40 ++ src/shared/Menu/index.ts | 1 + src/shared/Pagination/Pagination.scss | 87 ++++ src/shared/Pagination/Pagination.tsx | 91 ++++ src/shared/Pagination/index.ts | 1 + src/shared/ProductCard/ProductCard.scss | 163 ++++++++ src/shared/ProductCard/ProductCard.tsx | 123 ++++++ src/shared/ProductCard/index.ts | 1 + src/shared/ProductsList/ProductsList.scss | 33 ++ src/shared/ProductsList/ProductsList.tsx | 18 + src/shared/ProductsList/index.ts | 1 + src/shared/ProductsSlider/ProductsSlider.scss | 114 +++++ src/shared/ProductsSlider/ProductsSlider.tsx | 119 ++++++ src/shared/ProductsSlider/index.ts | 1 + src/styles/main.scss | 3 + src/types/Cart.ts | 7 + src/types/Product.ts | 14 + src/types/ProductDetails.ts | 26 ++ src/types/index.ts | 2 + src/utils/_fonts.scss | 17 + src/utils/_variables.scss | 32 ++ src/utils/api.ts | 26 ++ src/utils/capitalize.ts | 7 + src/utils/getSearchWith.ts | 24 ++ src/utils/index.ts | 1 + src/utils/mixins.scss | 48 +++ src/utils/prepareProductList.ts | 25 ++ src/utils/searchHelper.ts | 24 ++ 136 files changed, 5676 insertions(+), 3 deletions(-) create mode 100644 src/Layout/Layout.scss create mode 100644 src/Layout/Layout.tsx create mode 100644 src/Layout/index.ts create mode 100644 src/components/CartItem/CartItem.scss create mode 100644 src/components/CartItem/CartItem.tsx create mode 100644 src/components/CartItem/index.ts create mode 100644 src/components/PicturesSlider/PicturesSlider.scss create mode 100644 src/components/PicturesSlider/PicturesSlider.tsx create mode 100644 src/components/PicturesSlider/index.ts create mode 100644 src/components/ProductContentBottom/ProductContentBottom.scss create mode 100644 src/components/ProductContentBottom/ProductContentBottom.tsx create mode 100644 src/components/ProductContentBottom/index.ts create mode 100644 src/components/ProductContentTop/ProductContentTop.scss create mode 100644 src/components/ProductContentTop/ProductContentTop.tsx create mode 100644 src/components/ProductContentTop/index.ts create mode 100644 src/components/ShopByCategory/ShopByCategory.scss create mode 100644 src/components/ShopByCategory/ShopByCategory.tsx create mode 100644 src/components/ShopByCategory/index.ts create mode 100644 src/constants/colors.ts create mode 100644 src/constants/icons.ts create mode 100644 src/constants/navLinks.ts create mode 100644 src/context/GlobalContext.tsx create mode 100644 src/hooks/useLocaleStorage.tsx create mode 100644 src/hooks/useTheme.tsx create mode 100644 src/icons/Close.svg create mode 100644 src/icons/Home.svg create mode 100644 src/icons/Menu.svg create mode 100644 src/icons/Minus.svg create mode 100644 src/icons/MinusDarkDisabled.svg create mode 100644 src/icons/Plus.svg create mode 100644 src/icons/PlusDark.png create mode 100644 src/icons/PlusDark.svg create mode 100644 src/icons/Union.svg create mode 100644 src/icons/arrow_down_dark.svg create mode 100644 src/icons/arrow_left.svg create mode 100644 src/icons/arrow_left__disabled.svg create mode 100644 src/icons/arrow_left_dark.svg create mode 100644 src/icons/arrow_left_dark__disabled.svg create mode 100644 src/icons/arrow_right.svg create mode 100644 src/icons/arrow_right__disabled.svg create mode 100644 src/icons/arrow_right_dark.svg create mode 100644 src/icons/arrow_right_dark__disabled.svg create mode 100644 src/icons/close__disabled.svg create mode 100644 src/icons/close_dark.svg create mode 100644 src/icons/favorites.svg create mode 100644 src/icons/favorites__filled.svg create mode 100644 src/icons/favorites_dark.svg create mode 100644 src/icons/home_dark.svg create mode 100644 src/icons/menu_dark.svg create mode 100644 src/icons/minus__disabled.svg create mode 100644 src/icons/minus_dark.svg create mode 100644 src/icons/minus_dark__disabled.svg create mode 100644 src/icons/plus_dark.svg create mode 100644 src/icons/plus_dark1.png create mode 100644 src/icons/search.svg create mode 100644 src/icons/search_dark.svg create mode 100644 src/icons/shopping_cart.svg create mode 100644 src/icons/shopping_cart_dark.svg create mode 100644 src/images/favicon.svg create mode 100644 src/images/logo.svg create mode 100644 src/images/logo_dark.svg create mode 100644 src/pages/FavoritesPage/FavoritesPage.scss create mode 100644 src/pages/FavoritesPage/FavoritesPage.tsx create mode 100644 src/pages/FavoritesPage/index.ts create mode 100644 src/pages/HomePage/HomePage.scss create mode 100644 src/pages/HomePage/HomePage.tsx create mode 100644 src/pages/HomePage/index.ts create mode 100644 src/pages/NotFoundPage/NotFoundPage.scss create mode 100644 src/pages/NotFoundPage/NotFoundPage.tsx create mode 100644 src/pages/NotFoundPage/index.ts create mode 100644 src/pages/ProductDetailsPage/ProductDetailsPage.scss create mode 100644 src/pages/ProductDetailsPage/ProductDetailsPage.tsx create mode 100644 src/pages/ProductDetailsPage/index.ts create mode 100644 src/pages/ProductPage/ProductPage.scss create mode 100644 src/pages/ProductPage/ProductPage.tsx create mode 100644 src/pages/ProductPage/index.ts create mode 100644 src/pages/ShoppingCartPage/ShoppingCartPage.scss create mode 100644 src/pages/ShoppingCartPage/ShoppingCartPage.tsx create mode 100644 src/pages/ShoppingCartPage/index.ts create mode 100644 src/routes/Routes.tsx create mode 100644 src/routes/index.ts create mode 100644 src/routes/lazyLoad.ts create mode 100644 src/shared/Breadcrumbs/Breadcrumbs.scss create mode 100644 src/shared/Breadcrumbs/Breadcrumbs.tsx create mode 100644 src/shared/Breadcrumbs/index.ts create mode 100644 src/shared/ButtonBack/ButtonBack.scss create mode 100644 src/shared/ButtonBack/ButtonBack.tsx create mode 100644 src/shared/ButtonBack/index.ts create mode 100644 src/shared/Dropdown/Dropdown.scss create mode 100644 src/shared/Dropdown/Dropdown.tsx create mode 100644 src/shared/Dropdown/index.ts create mode 100644 src/shared/Filter/Filter.scss create mode 100644 src/shared/Filter/Filter.tsx create mode 100644 src/shared/Filter/index.ts create mode 100644 src/shared/Footer/Footer.scss create mode 100644 src/shared/Footer/Footer.tsx create mode 100644 src/shared/Footer/index.ts create mode 100644 src/shared/Header/Header.scss create mode 100644 src/shared/Header/Header.tsx create mode 100644 src/shared/Header/index.ts create mode 100644 src/shared/Icon/Icon.scss create mode 100644 src/shared/Icon/Icon.tsx create mode 100644 src/shared/Icon/index.ts create mode 100644 src/shared/Loader/Loader.scss create mode 100644 src/shared/Loader/Loader.tsx create mode 100644 src/shared/Loader/index.ts create mode 100644 src/shared/Menu/Menu.scss create mode 100644 src/shared/Menu/Menu.tsx create mode 100644 src/shared/Menu/index.ts create mode 100644 src/shared/Pagination/Pagination.scss create mode 100644 src/shared/Pagination/Pagination.tsx create mode 100644 src/shared/Pagination/index.ts create mode 100644 src/shared/ProductCard/ProductCard.scss create mode 100644 src/shared/ProductCard/ProductCard.tsx create mode 100644 src/shared/ProductCard/index.ts create mode 100644 src/shared/ProductsList/ProductsList.scss create mode 100644 src/shared/ProductsList/ProductsList.tsx create mode 100644 src/shared/ProductsList/index.ts create mode 100644 src/shared/ProductsSlider/ProductsSlider.scss create mode 100644 src/shared/ProductsSlider/ProductsSlider.tsx create mode 100644 src/shared/ProductsSlider/index.ts create mode 100644 src/styles/main.scss create mode 100644 src/types/Cart.ts create mode 100644 src/types/Product.ts create mode 100644 src/types/ProductDetails.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/_fonts.scss create mode 100644 src/utils/_variables.scss create mode 100644 src/utils/api.ts create mode 100644 src/utils/capitalize.ts create mode 100644 src/utils/getSearchWith.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/mixins.scss create mode 100644 src/utils/prepareProductList.ts create mode 100644 src/utils/searchHelper.ts diff --git a/src/App.tsx b/src/App.tsx index 372e4b42066..39f2a16ed8d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,16 @@ -import './App.scss'; +// import './App.scss'; +import { AppRoutes } from './routes'; +import { GlobalProvider } from './context/GlobalContext'; -export const App = () => ( +/*export const App = () => (

Product Catalog

-); +);*/ +export const App = () => { + return ( + + + + ); +}; diff --git a/src/Layout/Layout.scss b/src/Layout/Layout.scss new file mode 100644 index 00000000000..7ad1ce27df8 --- /dev/null +++ b/src/Layout/Layout.scss @@ -0,0 +1,30 @@ +@import 'src/styles/main'; + +* { + margin: 0; + padding: 0; +} + +.Layout { + display: flex; + flex-direction: column; + min-height: 100vh; + position: relative; + min-width: 320px; + + scroll-behavior: smooth; +} + +.Layout__content { + flex-grow: 1; +} + +.Layout__header { + position: sticky; + top: 0; + z-index: 10; +} + +body.theme_dark { + background-color: var(--color-bg); +} diff --git a/src/Layout/Layout.tsx b/src/Layout/Layout.tsx new file mode 100644 index 00000000000..1de55a7681b --- /dev/null +++ b/src/Layout/Layout.tsx @@ -0,0 +1,40 @@ +import { Outlet, useLocation } from 'react-router-dom'; +import '/src/styles/main.scss'; +import './Layout.scss'; +import { Suspense, useEffect } from 'react'; +import { Header } from '../shared/Header'; +import { Menu } from '../shared/Menu'; +import { Footer } from '../shared/Footer'; + +export const Layout = () => { + const location = useLocation(); + + useEffect(() => { + window.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }, [location.pathname]); + + return ( +
+
+
+
+ +
+ +
+ +
+ + + +
+ +
+
+
+
+ ); +}; diff --git a/src/Layout/index.ts b/src/Layout/index.ts new file mode 100644 index 00000000000..9877e7f4ae2 --- /dev/null +++ b/src/Layout/index.ts @@ -0,0 +1 @@ +export * from './Layout'; diff --git a/src/components/CartItem/CartItem.scss b/src/components/CartItem/CartItem.scss new file mode 100644 index 00000000000..3dfe60ad11b --- /dev/null +++ b/src/components/CartItem/CartItem.scss @@ -0,0 +1,147 @@ +@import '../../styles/main'; + +.cartItem { + padding: 16px; + display: flex; + flex-direction: column; + gap: 16px; + border: 1px solid var(--color-gray-elements); + transition: border-color 0.3s ease; + justify-content: space-between; + + @include on-tablet { + flex-direction: row; + padding: 24px; + } + &:hover { + border: 1px solid var(--color-gray-primary); + transition: border-color 0.3s ease; + } + &__wrapperTop { + display: flex; + gap: 16px; + + align-items: center; + + @include on-tablet { + gap: 24px; + } + } + &__wrapperBottom { + display: flex; + + align-items: center; + justify-content: space-between; + + @include on-tablet { + gap: 24px; + } + } + &__icon-close { + border: none; + background-color: var(--color-bg); + cursor: pointer; + width: 16px; + height: 16px; + background-image: url(../../icons/close__disabled.svg); + &:hover { + background-image: url(../../icons/Close.svg); + } + } + + &__link { + display: flex; + align-items: center; + text-decoration: none; + } + + &__title { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + line-height: 21px; + color: var(--color-gray-primary); + } + &__counter-container { + display: flex; + } + &__price { + width: 80px; + text-align: right; + font-family: Mont-Bold, sans-serif; + font-size: 22px; + font-weight: 800; + color: var(--color-gray-primary); + } + &__counter { + width: 32px; + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + text-align: center; + line-height: 32px; + } + &__button { + border: 1px solid var(--color-gray-icons-placeholders); + border-radius: 50%; + background-color: #fff; + width: 32px; + height: 32px; + cursor: pointer; + transition: border 0.3s ease; + &--disabled { + border: 1px solid var(--color-gray-elements); + cursor: not-allowed; + } + &:not(.cartItem__button--disabled):hover { + background-color: var(--color-gray-icons-placeholders); + border: none; + } + } + &__image { + height: 80px; + width: 80px; + object-fit: contain; + transition: transform 0.3s ease; + &:hover { + transform: scale(1.05); + + } + } + +} + +body.theme_dark .cartItem__counter { + color: var(--color-gray-primary); +} + +body.theme_dark .cartItem__button { + background-color: var(--color-surface-2); + border: none; + + &--disabled { + background-color: var(--color-bg); + border: 1px solid var(--color-gray-elements); + } + + &:not(.cartItem__button--disabled):hover { + background-color: var(--color-gray-elements); + border: none; + } +} + + +body.theme_dark .cartItem__icon-close { + border: none; + background-color: var(--color-bg); + cursor: pointer; + width: 16px; + height: 16px; + background-image: url(../../icons/Close.svg); + + &:hover { + background-image: url(../../icons/close__disabled.svg); + } +} + + diff --git a/src/components/CartItem/CartItem.tsx b/src/components/CartItem/CartItem.tsx new file mode 100644 index 00000000000..20acabfc69f --- /dev/null +++ b/src/components/CartItem/CartItem.tsx @@ -0,0 +1,79 @@ +import './CartItem.scss'; +import classNames from 'classnames'; +import { FC, memo, useContext, useMemo } from 'react'; +import { Cart } from '../../types/Cart'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Icon } from '../../shared/Icon'; +import { icons } from '../../constants/icons'; +import { Link } from 'react-router-dom'; + +type Props = { + cartProduct: Cart; +}; + +export const CartItem: FC = memo( + ({ + cartProduct: { + id, + product: { name, price, image, category }, + quantity, + }, + }) => { + const { updateQuantity, theme } = useContext(GlobalContext); + + const totalProductPrice = useMemo( + () => price * quantity, + [price, quantity], + ); + + return ( +
+
+ + + + Image product +
{name}
+ +
+ +
+
+ +
{quantity}
+ +
+ +
{`$${totalProductPrice}`}
+
+
+ ); + }, +); + +CartItem.displayName = 'CartItem'; diff --git a/src/components/CartItem/index.ts b/src/components/CartItem/index.ts new file mode 100644 index 00000000000..37a05535402 --- /dev/null +++ b/src/components/CartItem/index.ts @@ -0,0 +1 @@ +export * from './CartItem'; diff --git a/src/components/PicturesSlider/PicturesSlider.scss b/src/components/PicturesSlider/PicturesSlider.scss new file mode 100644 index 00000000000..f1afa9a3d67 --- /dev/null +++ b/src/components/PicturesSlider/PicturesSlider.scss @@ -0,0 +1,165 @@ +@import '../../styles/main.scss'; +p { + font-family: Mont-Bold, sans-serif; + color: #fff; +} + +.picturesSlider { + margin-bottom: 56px; + + @include on-tablet { + @include content-padding-inline; + + margin-bottom: 64px; + } + + @include on-desktop { + margin-bottom: 80px; + } + + &__container { + display: flex; + justify-content: center; + width: 100%; + + &-image { + position: relative; + width: 100%; + aspect-ratio: 1 / 1; + flex: 1; + + @include on-tablet { + min-height: 189px; + max-height: 400px; + aspect-ratio: 400 / 189; + } + } + } + + &__content { + display: flex; + padding: 16px; + margin-inline: 16px; + background-color: #000; + width: 100%; + } + + &__aside { + display: none; + flex: 1; + justify-content: space-between; + flex-direction: column; + background-color: #222; + border-radius: 16px; + padding: 16px; + + @include on-tablet { + display: flex; + } + + &-title { + font-family: Mont-Bold, sans-serif; + color: #fff; + background-image: linear-gradient(90deg, #7c4af4, #d862ff); + background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 32px; + line-height: 1; + } + + &-description { + font-family: Mont-Regular, sans-serif; + color: #aeaeae; + margin-top: 8px; + font-size: 12px; + } + + &-action { + font-family: Mont-Bold, sans-serif; + width: fit-content; + border: 1px solid #444; + padding: 12px 16px; + border-radius: 16px; + text-decoration: none; + color: #fff; + font-size: 12px; + } + } + + &__image { + width: 100%; + height: 100%; + object-fit: contain; + + position: absolute; + top: 0; + left: 0; + transition: opacity 0.5s ease-in-out; + opacity: 0; + + &--active { + opacity: 1; + } + } + + &__button { + display: none; + + transition: + border-color 0.3s ease, + background-color 0.3s ease; + + @include on-tablet { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-icons-placeholders); + cursor: pointer; + } + + &:hover { + border-color: var(--color-gray-primary); + background-color: var(--color-hover); + } + } + + &__dots { + height: 24px; + display: flex; + margin: 0 auto; + justify-content: center; + } + + &__dot { + width: 24px; + height: 24px; + cursor: pointer; + position: relative; + + &::after { + content: ''; + position: absolute; + width: 14px; + height: 4px; + background-color: var(--color-gray-elements); + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + &--active::after { + background-color: var(--color-gray-primary); + } + } +} + +body.theme_dark .picturesSlider__button { + border: none; + background-color: var(--color-surface-2); +} + +body.theme_dark .picturesSlider__button:hover { + background-color: var(--color-gray-icons-placeholders); +} diff --git a/src/components/PicturesSlider/PicturesSlider.tsx b/src/components/PicturesSlider/PicturesSlider.tsx new file mode 100644 index 00000000000..fe4a974a6fd --- /dev/null +++ b/src/components/PicturesSlider/PicturesSlider.tsx @@ -0,0 +1,167 @@ +import { + useState, + useEffect, + useRef, + useContext, + FC, + useCallback, +} from 'react'; +import './PicturesSlider.scss'; +import { Icon } from '../../shared/Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Link } from 'react-router-dom'; +import { Product } from '../../types/Product'; +type Props = { + allNewestProducts: Product[]; +}; +export const PicturesSlider: FC = ({ allNewestProducts }) => { + const images = allNewestProducts.map(el => el.image); + /*const images = [ + 'img/phones/apple-iphone-14/midnight/00.webp', + 'img/phones/apple-iphone-14-pro/gold/00.webp', + 'img/phones/apple-iphone-xr/coral/00.webp', + ];*/ + const names = allNewestProducts.map(el => el.name); + const imagesUrl: Record = allNewestProducts.map( + el => el.category + '/' + el.itemId, + ); + + /*const imagesUrl: Record = { + //0: images[0].split('/', 4).join('/').slice(4), + 0: 'phones/apple-iphone-14-128gb-midnight', + 1: 'phones/apple-iphone-14-pro-128gb-gold', + 2: 'phones/apple-iphone-xr-128gb-coral', + };*/ + + const [currentSlide, setCurrentSlide] = useState(0); + const { theme } = useContext(GlobalContext); + + const intervalRef = useRef(null); + + const nextSlide = useCallback( + () => setCurrentSlide(prev => (prev + 1) % images.length), + [images.length], + ); + + const prevSlide = useCallback( + () => setCurrentSlide(prev => (prev - 1 + images.length) % images.length), + [images.length], + ); + + useEffect(() => { + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + + intervalRef.current = setInterval(nextSlide, 3000); + + return () => { + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleDotClick = useCallback( + (index: number) => { + setCurrentSlide(index); + + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + + intervalRef.current = setInterval(nextSlide, 3000); + }, + [nextSlide], + ); + + const handleNextButton = useCallback(() => { + nextSlide(); + + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + + intervalRef.current = setInterval(nextSlide, 3000); + }, [nextSlide]); + + const handlePrevButton = useCallback(() => { + prevSlide(); + + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + + intervalRef.current = setInterval(nextSlide, 3000); + }, [nextSlide, prevSlide]); + + return ( +
+
+
+ +
+ +
+
+
+
+
Now available
+
in our store!
+
+ +
+ Be the first +
+
+ + + Order now + +

{names[currentSlide]}

+
+ +
+ {images.map((src, index) => ( + Slide + ))} +
+
+ +
+ +
+
+ +
+ {images.map((_, index) => ( +
handleDotClick(index)} + >
+ ))} + + {/*split('/', 4).join('/').slice(4)*/} +
+
+ ); +}; diff --git a/src/components/PicturesSlider/index.ts b/src/components/PicturesSlider/index.ts new file mode 100644 index 00000000000..81a373f3aa1 --- /dev/null +++ b/src/components/PicturesSlider/index.ts @@ -0,0 +1 @@ +export * from './PicturesSlider'; diff --git a/src/components/ProductContentBottom/ProductContentBottom.scss b/src/components/ProductContentBottom/ProductContentBottom.scss new file mode 100644 index 00000000000..6bf3f9b900b --- /dev/null +++ b/src/components/ProductContentBottom/ProductContentBottom.scss @@ -0,0 +1,131 @@ +@import '../../styles/main'; + +.detailsPage { + &__content-buttom { + gap: 32px; + display: flex; + flex-direction: column; + + margin-bottom: 56px; + + @include on-tablet { + margin-bottom: 64px; + } + + @include on-desktop { + margin-block: 80px; + + @include page-grid; + } + } + + &__block { + &-about { + width: 100%; + + @include on-desktop { + grid-column: 1 / 13; + } + } + + &-techSpecs { + width: 100%; + + @include on-desktop { + grid-column: 14 / -1; + } + } + + &-title { + font-family: Mont-Bold, sans-serif; + font-size: 20px; + font-weight: 700; + line-height: 25.56px; + color: var(--color-gray-primary); + + @include on-tablet { + font-size: 22px; + font-weight: 800; + line-height: 30.8px; + } + } + } + + &__line-bottom { + width: 100%; + height: 1px; + background-color: var(--color-gray-elements); + margin-top: 16px; + } + + &__description { + margin-top: 32px; + display: flex; + flex-direction: column; + gap: 32px; + } + + &__section { + display: flex; + flex-direction: column; + gap: 16px; + + &-title { + font-family: Mont-SemiBold, sans-serif; + font-size: 16px; + font-weight: 700; + line-height: 20.45px; + color: var(--color-gray-primary); + + @include on-tablet { + font-size: 20px; + font-weight: 700; + line-height: 25.56px; + } + + &--bottom { + margin-top: 80px; + margin-bottom: 24px; + } + } + + &-description { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + line-height: 21px; + color: var(--color-gray-secondary); + } + } + + &__techSpecs { + &-content { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 25px; + } + + &-block { + display: flex; + justify-content: space-between; + gap: 20px; + } + + &-title { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 500; + line-height: 21px; + color: var(--color-gray-secondary); + } + + &-value { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 500; + line-height: 21px; + color: var(--color-gray-primary); + } + } +} diff --git a/src/components/ProductContentBottom/ProductContentBottom.tsx b/src/components/ProductContentBottom/ProductContentBottom.tsx new file mode 100644 index 00000000000..be6046c0a22 --- /dev/null +++ b/src/components/ProductContentBottom/ProductContentBottom.tsx @@ -0,0 +1,84 @@ +import './ProductContentBottom.scss'; +import { ProductDetails } from '../../types/ProductDetails'; + +type Props = { + selectedProduct: ProductDetails; +}; + +export const ProductContentBottom: React.FC = ({ selectedProduct }) => { + return ( +
+
+

About

+
+ +
+ {selectedProduct.description.map((chunk, index) => ( +
+ {chunk.title} + + {chunk.text} + +
+ ))} +
+
+ +
+

Tech specs

+
+ +
+
+ Screen + + {selectedProduct.screen} + +
+
+ Resolution + + {selectedProduct.resolution} + +
+
+ Processor + + {selectedProduct.processor} + +
+
+ RAM + + {selectedProduct.ram} + +
+
+ Capacity + + {selectedProduct.capacity} + +
+
+ Camera + + {selectedProduct.camera} + +
+
+ Zoom + + {selectedProduct.zoom} + +
+
+ Cell + + {selectedProduct.cell.join(', ')} + +
+
+
+
+ ); +}; diff --git a/src/components/ProductContentBottom/index.ts b/src/components/ProductContentBottom/index.ts new file mode 100644 index 00000000000..a67cc2f37c4 --- /dev/null +++ b/src/components/ProductContentBottom/index.ts @@ -0,0 +1 @@ +export * from './ProductContentBottom'; diff --git a/src/components/ProductContentTop/ProductContentTop.scss b/src/components/ProductContentTop/ProductContentTop.scss new file mode 100644 index 00000000000..1544d121117 --- /dev/null +++ b/src/components/ProductContentTop/ProductContentTop.scss @@ -0,0 +1,390 @@ +@import '../../styles/main'; + +.detailsPage { + &__image { + width: 100%; + height: 100%; + object-fit: contain; + + position: absolute; + opacity: 0; + transition: opacity 0.3s ease; + z-index: -1; + + &.detailsPage__image--active { + opacity: 1; + } + } + + &__content-top { + display: flex; + flex-direction: column; + width: 100%; + + @include on-tablet { + flex-direction: row; + grid-column: 1 / -1; + + @include page-grid; + } + } + + &__container { + &-imageSlider { + order: 2; + display: flex; + gap: 8px; + margin-bottom: 40px; + + @include on-tablet { + grid-column: 1 / 2; + flex-direction: column; + justify-content: flex-start; + gap: 16px; + margin: 0; + } + + @include on-desktop { + grid-column: span 2; + } + } + + &-photos { + padding: 2px; + border: 1px solid var(--color-gray-elements); + transition: border 0.3s ease; + + display: flex; + align-items: center; + justify-content: center; + + &--active { + border: 1px solid var(--color-gray-primary); + } + } + + &-price { + display: flex; + gap: 8px; + margin-top: 32px; + align-items: center; + } + + &-specifications { + display: flex; + flex-direction: column; + padding-block: 8px; + gap: 8px; + margin-top: 32px; + } + + &-buttons { + margin-top: 16px; + width: 100%; + display: flex; + gap: 8px; + } + } + + &__photo { + width: 100%; + aspect-ratio: 1 / 1; + object-fit: contain; + cursor: pointer; + + &-mask { + order: 1; + aspect-ratio: 1 / 1; + margin-bottom: 16px; + + position: relative; + + @include on-tablet { + order: 2; + grid-column: span 6; + margin-bottom: 0; + } + + @include on-desktop { + grid-column: span 10; + } + } + } + + &__characteristics { + order: 3; + + width: 100%; + margin-right: 16px; + display: flex; + flex-direction: column; + + @include on-tablet { + grid-column: span 5; + } + + @include on-desktop { + grid-column: 14 / 21; + } + } + + &__colors { + display: flex; + flex-direction: column; + gap: 8px; + + &-list { + list-style: none; + display: flex; + gap: 5px; + } + } + + &__color { + &-item { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + width: 32px; + height: 32px; + border: 1px solid var(--color-gray-elements); + border-radius: 50%; + transition: border 0.3s; + + &--selected { + border: 1px solid var(--color-gray-primary); + } + } + + &-circle { + width: 30px; + height: 30px; + box-sizing: border-box; + border-radius: 50%; + border: 2px solid var(--color-bg); + } + } + + &__line { + height: 1px; + background-color: var(--color-gray-elements); + margin-top: 24px; + + &-bottom { + margin-top: 16px; + } + } + + &__capacity { + margin-top: 24px; + display: flex; + flex-direction: column; + gap: 8px; + + &-list { + display: flex; + gap: 8px; + list-style: none; + } + + &-block { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 500; + color: var(--color-gray-primary); + + &--selected { + color: var(--color-bg); + } + } + + &-item { + padding: 6px; + border: 1px solid var(--color-gray-icons-placeholders); + cursor: pointer; + + @include hover(border-color, var(--color-gray-primary)); + + &--selected { + background-color: var(--color-gray-primary); + } + } + } + + &__price { + &-regular { + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-secondary); + font-size: 22px; + font-weight: 500; + text-decoration-line: line-through; + } + + &-discount { + font-family: Mont-Bold, sans-serif; + color: var(--color-gray-primary); + font-size: 32px; + font-weight: 800; + line-height: 41px; + letter-spacing: -0.01em; + } + } + + &__block { + width: 100%; + height: 15px; + display: flex; + justify-content: space-between; + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 600; + + &-about { + width: 560px; + } + + &-techSpecs { + width: 512px; + } + + &-title { + font-family: Mont-Bold, sans-serif; + font-size: 22px; + font-weight: 800; + line-height: 30.8px; + color: var(--color-gray-primary); + } + } + + &__button { + border: none; + cursor: pointer; + background-color: var(--color-bg); + + font-family: Mont-Regular, sans-serif; + color: var(--color-bg); + font-size: 14px; + font-weight: 700; + line-height: 21px; + height: 40px; + + display: flex; + align-items: center; + justify-content: center; + + &-card { + background-color: var(--color-gray-primary); + width: 100%; + + @include hover(box-shadow, 0 3px 13px 0 #17203166); + } + + &-card--active { + background-color: var(--color-bg); + color: var(--color-green); + border: 1px solid var(--color-gray-elements); + } + + &-favorites { + width: 40px; + flex-shrink: 0; + border: 1px solid var(--color-gray-icons-placeholders); + } + + &-favorites--active { + border: 1px solid var(--color-gray-elements); + } + } + + &__info { + color: var(--color-gray-secondary); + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 600; + } + + &__value { + color: var(--color-gray-primary); + } + + &__content-buttom { + display: flex; + gap: 64px; + margin-top: 80px; + } + + &__description { + margin-top: 32px; + display: flex; + flex-direction: column; + gap: 32px; + } + + &__section { + display: flex; + flex-direction: column; + gap: 16px; + + &-title { + font-family: Mont-SemiBold, sans-serif; + font-size: 20px; + font-weight: 700; + line-height: 25.56px; + color: var(--color-gray-primary); + } + + &-description { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 500; + line-height: 21px; + color: var(--color-gray-secondary); + } + } + + &__techSpecs { + display: flex; + flex-direction: column; + gap: 8px; + + &-content { + display: flex; + flex-direction: column; + gap: 24px; + } + + &-title { + color: var(--color-gray-primary); + } + + &-list { + list-style: none; + display: flex; + flex-direction: column; + gap: 8px; + } + + &-item { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 500; + line-height: 21px; + color: var(--color-gray-primary); + + &-description { + color: var(--color-gray-secondary); + } + } + } +} + +.detailsPage__container-photos:not( + .detailsPage__container-photos--active + ):hover { + border: 1px solid var(--color-gray-icons-placeholders); +} + +.detailsPage__color-item:not(.detailsPage__color-item--selected):hover { + border: 1px solid var(--color-gray-icons-placeholders); +} diff --git a/src/components/ProductContentTop/ProductContentTop.tsx b/src/components/ProductContentTop/ProductContentTop.tsx new file mode 100644 index 00000000000..a84a4c35b19 --- /dev/null +++ b/src/components/ProductContentTop/ProductContentTop.tsx @@ -0,0 +1,261 @@ +import './ProductContentTop.scss'; +import { NavLink } from 'react-router-dom'; +import { ProductDetails } from '../../types/ProductDetails'; +import { FC, useCallback, useContext, useMemo, useState } from 'react'; +import { Colors, colors } from '../../constants/colors'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Icon } from '../../shared/Icon'; +import { icons } from '../../constants/icons'; +import { Product } from '../../types/Product'; +import classNames from 'classnames'; + +const getProductBySelectedProductId = ( + products: Product[], + selectedProductId: string, +) => { + return products.find(product => product.itemId === selectedProductId); +}; + +type Props = { + selectedProduct: ProductDetails; + specificProducts: ProductDetails[]; +}; + +export const ProductContentTop: FC = ({ + selectedProduct, + specificProducts, +}) => { + const { allProducts, cart, favorites, toggleFavorites, addToCart, theme } = + useContext(GlobalContext); + + const [selectedPhoto, setSelectedPhoto] = useState(0); + + const handleShoppingCard = useCallback( + (currentProduct: ProductDetails) => { + const productToAdd = getProductBySelectedProductId( + allProducts, + currentProduct.id, + ); + + if (productToAdd) { + addToCart(productToAdd); + } + }, + [addToCart, allProducts], + ); + + const handleFavorites = useCallback( + (currentProduct: ProductDetails) => { + const favoriteProduct = getProductBySelectedProductId( + allProducts, + currentProduct.id, + ); + + if (favoriteProduct) { + toggleFavorites(favoriteProduct); + } + }, + [allProducts, toggleFavorites], + ); + + const getLink = useCallback( + (option: string, value: string) => { + const { + color: itemColor, + namespaceId: itemNamespaceId, + capacity: itemCapacity, + } = selectedProduct; + + const el = specificProducts.find(({ color, namespaceId, capacity }) => { + return ( + namespaceId === itemNamespaceId && + ((option === 'color' && + color === value && + capacity === itemCapacity) || + (option === 'capacity' && + capacity === value && + color === itemColor)) + ); + }); + + return el?.id ?? ''; + }, + [selectedProduct, specificProducts], + ); + + const isInCart = useMemo( + () => cart.some(item => item.id === selectedProduct.id), + [cart, selectedProduct.id], + ); + + const isFavorites = useMemo( + () => favorites.some(item => item.itemId === selectedProduct.id), + [favorites, selectedProduct.id], + ); + + return ( +
+
+ {selectedProduct.images.map((image, index) => ( +
+ {`Thumbnail setSelectedPhoto(index)} + /> +
+ ))} +
+ +
+ {selectedProduct.images.map((image, index) => ( + {`Selected + ))} +
+ +
+
+ + Available colors + +
    + {selectedProduct.colorsAvailable.map(color => ( + +
  • + +
  • +
    + ))} +
+
+ +
+ +
+ + Select capacity + +
    + {selectedProduct.capacityAvailable.map(capacity => ( + +
  • + + {capacity.split('GB').join(' GB')} + +
  • +
    + ))} +
+
+ +
+ +
+ + {`$${selectedProduct.priceDiscount}`} + + + {`$${selectedProduct.priceRegular}`} + +
+ +
+ + + +
+ +
+
+ Screen + {selectedProduct.screen} +
+
+ Resolution + + {selectedProduct.resolution} + +
+
+ Processor + + {selectedProduct.processor} + +
+
+ RAM + {selectedProduct.ram} +
+
+
+
+ ); +}; diff --git a/src/components/ProductContentTop/index.ts b/src/components/ProductContentTop/index.ts new file mode 100644 index 00000000000..e58da14a108 --- /dev/null +++ b/src/components/ProductContentTop/index.ts @@ -0,0 +1 @@ +export * from './ProductContentTop'; diff --git a/src/components/ShopByCategory/ShopByCategory.scss b/src/components/ShopByCategory/ShopByCategory.scss new file mode 100644 index 00000000000..d8715afbaec --- /dev/null +++ b/src/components/ShopByCategory/ShopByCategory.scss @@ -0,0 +1,93 @@ +@import '../../styles/main'; + +.shopByCategory__container { + margin-block: 56px; + + @include content-padding-inline; + + @include on-tablet { + margin-block: 64px; + } +} + +.shopByCategory { + &__title { + font-family: Mont-Bold, sans-serif; + font-size: 22px; + font-weight: 800; + line-height: 30.8px; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + margin-bottom: 24px; + + @include on-tablet { + font-family: Mont-Bold, sans-serif; + font-size: 32px; + line-height: 41px; + } + } + + &__content { + gap: 32px; + + @include page-grid; + } + + &__link { + text-decoration: none; + + grid-column: 1 / -1; + + @include on-tablet { + grid-column: span 4; + } + + @include on-desktop { + grid-column: span 8; + + } + } + + &__block { + display: flex; + flex-direction: column; + //justify-content: space-between; + //justify-items: end; + align-items:center; + //align-content: end; + + &-image { + display: block; + max-width:auto; + height:400px; + border: 0; + transform: translate(10px, 5px); + @include hover(transform, scale(1.05)); + + @include on-tablet { + max-width: 100%; + } + } + + &-title { + margin-top: 24px; + + font-family: Mont-SemiBold, sans-serif; + font-size: 20px; + font-weight: 700; + line-height: 25.56px; + color: var(--color-gray-primary); + } + + &-description { + + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-secondary); + font-size: 14px; + font-weight: 600; + line-height: 21px; + margin-top: 4px; + + } + } +} diff --git a/src/components/ShopByCategory/ShopByCategory.tsx b/src/components/ShopByCategory/ShopByCategory.tsx new file mode 100644 index 00000000000..e8640216e2c --- /dev/null +++ b/src/components/ShopByCategory/ShopByCategory.tsx @@ -0,0 +1,86 @@ +import './ShopByCategory.scss'; +import { useContext, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import { GlobalContext } from '../../context/GlobalContext'; + +export const ShopByCategory: React.FC = () => { + const { allProducts } = useContext(GlobalContext); + + const { phonesLength, tabletsLength, accessoriesLength } = useMemo(() => { + const phones = []; + const tablets = []; + const accessories = []; + + allProducts.forEach(product => { + if (product.category === 'phones') { + phones.push(product.id); + } + + if (product.category === 'tablets') { + tablets.push(product.id); + } + + if (product.category === 'accessories') { + accessories.push(product.id); + } + }); + + return { + phonesLength: phones.length, + tabletsLength: tablets.length, + accessoriesLength: accessories.length, + }; + }, [allProducts]); + + return ( +
+
+

Shop by category

+ +
+ +
+ Category Phones +

Mobile phones

+ + {`${phonesLength} models`} + +
+ + + +
+ Category Tablets +

Tablets

+ + {`${tabletsLength} models`} + +
+ + + +
+ Category Accessories +

Accessories

+ + {`${accessoriesLength} models`} + +
+ +
+
+
+ ); +}; diff --git a/src/components/ShopByCategory/index.ts b/src/components/ShopByCategory/index.ts new file mode 100644 index 00000000000..8081526324a --- /dev/null +++ b/src/components/ShopByCategory/index.ts @@ -0,0 +1 @@ +export * from './ShopByCategory'; diff --git a/src/constants/colors.ts b/src/constants/colors.ts new file mode 100644 index 00000000000..6dc742055b7 --- /dev/null +++ b/src/constants/colors.ts @@ -0,0 +1,22 @@ +export const colors = { + graphite: '#383838', + gold: '#FFD700', + sierrablue: '#6CABDD', + black: '#000000', + rosegold: '#B76E79', + silver: '#C0C0C0', + spacegray: '#4B4F54', + white: '#FFFFFF', + yellow: '#FFFF00', + red: '#FF0000', + coral: '#FF7F50', + midnight: '#2C3E50', + purple: '#800080', + spaceblack: '#1D1D1D', + blue: '#0000FF', + pink: '#FFC0CB', + green: '#008000', + midnightgreen: '#004953', +}; + +export type Colors = typeof colors; diff --git a/src/constants/icons.ts b/src/constants/icons.ts new file mode 100644 index 00000000000..ad1ccc202b5 --- /dev/null +++ b/src/constants/icons.ts @@ -0,0 +1,174 @@ +type Icon = Record<'light' | 'dark', { title: string; path: string }>; +export const icons: Record = { + logo: { + light: { + title: 'Logo icon', + path: '../../src/images/logo.svg', + }, + dark: { + title: 'Logo dark icon', + path: '../../src/images/logo_dark.svg', + }, + }, + close: { + light: { + title: 'Close icon', + path: '../../src/icons/Close.svg', + }, + dark: { + title: 'Close dark icon', + path: '../../src/icons/close_dark.svg', + }, + }, + close__disabled: { + light: { + title: 'Close icon', + path: '../../src/icons/close__disabled.svg', + }, + dark: { + title: 'Close dark icon', + path: '../../src/icons/close__disabled.svg', + }, + }, + menu: { + light: { + title: 'Menu icon', + path: '../../src/icons/Menu.svg', + }, + dark: { + title: 'Menu dark icon', + path: '../../src/icons/menu_dark.svg', + }, + }, + search: { + light: { + title: 'Search icon', + path: '../../src/icons/search.svg', + }, + dark: { + title: 'Search dark icon', + path: '../../src/icons/search_dark.svg', + }, + }, + favorites: { + light: { + title: 'Favorites icon', + path: '../../src/icons/favorites.svg', + }, + dark: { + title: 'Favorites dark icon', + path: '../../src/icons/favorites_dark.svg', + }, + }, + favorites__filled: { + light: { + title: 'Favorites filled icon', + path: '../../src/icons/favorites__filled.svg', + }, + dark: { + title: 'Favorites filled dark icon', + path: '../../src/icons/favorites__filled.svg', + }, + }, + shopping_cart: { + light: { + title: 'Shopping cart icon', + path: '../../src/icons/shopping_cart.svg', + }, + dark: { + title: 'Shopping cart dark icon', + path: '../../src/icons/shopping_cart_dark.svg', + }, + }, + arrow_left: { + light: { + title: 'Arrow left icon', + path: '../../src/icons/arrow_left.svg', + }, + dark: { + title: 'Arrow left dark icon', + path: '../../src/icons/arrow_left_dark.svg', + }, + }, + arrow_left__disabled: { + light: { + title: 'Arrow left disabled icon', + path: '../../src/icons/arrow_left__disabled.svg', + }, + dark: { + title: 'Arrow left disabled dark icon', + path: '../../src/icons/arrow_left_dark__disabled.svg', + }, + }, + arrow_right: { + light: { + title: 'Arrow right icon', + path: '../../src/icons/arrow_right.svg', + }, + dark: { + title: 'Arrow right dark icon', + path: '../../src/icons/arrow_right_dark.svg', + }, + }, + arrow_right__disabled: { + light: { + title: 'Arrow right disabled icon', + path: '../../src/icons/arrow_right__disabled.svg', + }, + dark: { + title: 'Arrow right disabled dark icon', + path: '../../src/icons/arrow_right_dark__disabled.svg', + }, + }, + arrow_down: { + light: { + title: 'Arrow down icon', + path: '../../src/icons/arrow_down_dark.svg', + }, + dark: { + title: 'Arrow down dark icon', + path: '../../src/icons/arrow_down_dark.svg', + }, + }, + home: { + light: { + title: 'Home icon', + path: '../../src/icons/Home.svg', + }, + dark: { + title: 'Home dark icon', + path: '../../src/icons/home_dark.svg', + }, + }, + + plus: { + light: { + title: 'Plus icon', + path: '../../src/icons/Plus.svg', + }, + dark: { + title: 'Plus dark icon', + path: '../../src/icons/Union.svg', + }, + }, + minus: { + light: { + title: 'Minus icon', + path: '../../src/icons/Minus.svg', + }, + dark: { + title: 'Minus dark icon', + path: '../../src/icons/minus_dark.svg', + }, + }, + minus__disabled: { + light: { + title: 'Minus icon', + path: '../../src/icons/minus__disabled.svg', + }, + dark: { + title: 'Minus dark icon', + path: '../../src/icons/MinusDarkDisabled.svg', + }, + }, +}; diff --git a/src/constants/navLinks.ts b/src/constants/navLinks.ts new file mode 100644 index 00000000000..9785cd869b5 --- /dev/null +++ b/src/constants/navLinks.ts @@ -0,0 +1,11 @@ +type NavLink = { + title: string; + path: string; +}; + +export const navLinks: NavLink[] = [ + { title: 'Home', path: '/' }, + { title: 'Phones', path: '/phones' }, + { title: 'Tablets', path: '/tablets' }, + { title: 'Accessories', path: '/accessories' }, +]; diff --git a/src/context/GlobalContext.tsx b/src/context/GlobalContext.tsx new file mode 100644 index 00000000000..fca155e41fe --- /dev/null +++ b/src/context/GlobalContext.tsx @@ -0,0 +1,183 @@ +import { + createContext, + Dispatch, + FC, + ReactNode, + SetStateAction, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; +import { Product } from '../types/Product'; +import { Cart } from '../types/Cart'; +import { getAllProducts } from '../utils/api'; +import { useLocalStorage } from '../hooks/useLocaleStorage'; +import { useTheme } from '../hooks/useTheme'; +import { Theme } from '../types'; + +type GlobalContextType = { + allProducts: Product[]; + setAllProducts: Dispatch>; + cart: Cart[]; + setCart: Dispatch>; + favorites: Product[]; + setFavorites: Dispatch>; + updateQuantity: (id: string, newQuantity: number) => void; + clearShoppingCart: () => void; + isMenuOpen: boolean; + setIsMenuOpen: Dispatch>; + toggleMenu: () => void; + toggleFavorites: (currentProduct: Product) => void; + addToCart: (currentProduct: Product) => void; + theme: Theme; + toggleTheme: () => void; +}; + +export const GlobalContext = createContext({ + allProducts: [] as Product[], + setAllProducts: () => {}, + cart: [] as Cart[], + setCart: () => {}, + favorites: [] as Product[], + setFavorites: () => {}, + updateQuantity: () => {}, + clearShoppingCart: () => {}, + isMenuOpen: false, + setIsMenuOpen: () => {}, + toggleMenu: () => {}, + toggleFavorites: () => {}, + addToCart: () => {}, + theme: 'light', + toggleTheme: () => {}, +}); + +type Props = { + children: ReactNode; +}; + +export const GlobalProvider: FC = ({ children }) => { + const { theme, toggleTheme } = useTheme(); + + const [allProducts, setAllProducts] = useState([]); + const [cart, setCart] = useLocalStorage('shoppingCart', []); + const [favorites, setFavorites] = useLocalStorage('favorites', []); + const [isMenuOpen, setIsMenuOpen] = useState(false); + + useEffect(() => { + getAllProducts().then(fetchedProducts => setAllProducts(fetchedProducts)); + }, []); + + const updateQuantity = useCallback( + (id: string, newQuantity: number) => { + setCart(prevCart => + prevCart + .map(item => + item.id === id ? { ...item, quantity: newQuantity } : item, + ) + .filter(item => item.quantity > 0), + ); + }, + [setCart], + ); + + const toggleMenu = useCallback( + () => setIsMenuOpen(prevState => !prevState), + [], + ); + + useEffect(() => { + const overflowStyle = isMenuOpen ? 'hidden' : 'auto'; + + document.body.style.overflow = overflowStyle; + + return () => { + document.body.style.overflow = 'auto'; + }; + }, [isMenuOpen]); + + const addToCart = useCallback( + (product: Product) => { + if (product) { + const isInCart = cart.some( + item => item.product.itemId === product.itemId, + ); + + if (!isInCart) { + const newProduct: Cart = { + id: product.itemId, + quantity: 1, + product: product, + }; + + setCart(prevCart => [...prevCart, newProduct]); + } + } + }, + [cart, setCart], + ); + + const toggleFavorites = useCallback( + (currentProduct: Product) => { + const isInFavorites = favorites.some( + item => item.itemId === currentProduct.itemId, + ); + + setFavorites(prevFavorites => { + if (isInFavorites) { + return prevFavorites.filter( + item => item.itemId !== currentProduct.itemId, + ); + } else { + return [...prevFavorites, currentProduct]; + } + }); + }, + [favorites, setFavorites], + ); + + const clearShoppingCart = useCallback(() => { + setCart([]); + }, [setCart]); + + const data = useMemo( + () => ({ + allProducts, + setAllProducts, + cart, + setCart, + favorites, + setFavorites, + updateQuantity, + clearShoppingCart, + isMenuOpen, + setIsMenuOpen, + toggleMenu, + toggleFavorites, + addToCart, + theme, + toggleTheme, + }), + [ + allProducts, + cart, + favorites, + setAllProducts, + setCart, + setFavorites, + clearShoppingCart, + updateQuantity, + isMenuOpen, + setIsMenuOpen, + toggleMenu, + toggleFavorites, + addToCart, + theme, + toggleTheme, + ], + ); + + return ( + {children} + ); +}; diff --git a/src/hooks/useLocaleStorage.tsx b/src/hooks/useLocaleStorage.tsx new file mode 100644 index 00000000000..bd5b0e7ed5b --- /dev/null +++ b/src/hooks/useLocaleStorage.tsx @@ -0,0 +1,29 @@ +import { useEffect, useState } from 'react'; + +export function useLocalStorage(key: string, initialValue: T) { + //: [T, (v: T) => void] + + const [value, setValue] = useState(() => { + try { + const item = localStorage.getItem(key); + + return item ? (JSON.parse(item) as T) : initialValue; + } catch (error) { + localStorage.removeItem(key); + // eslint-disable-next-line no-console + console.warn(`Error reading localStorage key "${key}": ${error}`); + + return initialValue; + } + }); + + useEffect(() => { + try { + localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + throw new Error(`Error saving to localStorage key "${key}": ${error}`); + } + }, [key, value]); + + return [value, setValue] as const; +} diff --git a/src/hooks/useTheme.tsx b/src/hooks/useTheme.tsx new file mode 100644 index 00000000000..82eabf40485 --- /dev/null +++ b/src/hooks/useTheme.tsx @@ -0,0 +1,17 @@ +import { useEffect, useCallback } from 'react'; +import { useLocalStorage } from './useLocaleStorage'; +import { Theme } from '../types'; + +export const useTheme = () => { + const [theme, setTheme] = useLocalStorage('theme', 'light'); + + useEffect(() => { + document.body.classList.toggle('theme_dark', theme === 'dark'); + }, [theme]); + + const toggleTheme = useCallback(() => { + setTheme(theme === 'light' ? 'dark' : 'light'); + }, [theme, setTheme]); + + return { theme, toggleTheme }; +}; diff --git a/src/icons/Close.svg b/src/icons/Close.svg new file mode 100644 index 00000000000..aadcc91fb1f --- /dev/null +++ b/src/icons/Close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/Home.svg b/src/icons/Home.svg new file mode 100644 index 00000000000..474476cb027 --- /dev/null +++ b/src/icons/Home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/Menu.svg b/src/icons/Menu.svg new file mode 100644 index 00000000000..2c535f4586b --- /dev/null +++ b/src/icons/Menu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/icons/Minus.svg b/src/icons/Minus.svg new file mode 100644 index 00000000000..97c41038ac7 --- /dev/null +++ b/src/icons/Minus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/MinusDarkDisabled.svg b/src/icons/MinusDarkDisabled.svg new file mode 100644 index 00000000000..8c83f33c1a0 --- /dev/null +++ b/src/icons/MinusDarkDisabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/Plus.svg b/src/icons/Plus.svg new file mode 100644 index 00000000000..ab3c34061b5 --- /dev/null +++ b/src/icons/Plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/PlusDark.png b/src/icons/PlusDark.png new file mode 100644 index 0000000000000000000000000000000000000000..ff63737c4c9d3e133e071b74c7446d41d3073401 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBewC+-V@L(#-AQLT8w_|_?ua69aGwucP*GO#bE!cU-v#ude1(= zxh2)`*sL8d9gTe~DWM4f#70z# literal 0 HcmV?d00001 diff --git a/src/icons/PlusDark.svg b/src/icons/PlusDark.svg new file mode 100644 index 00000000000..261391440ac --- /dev/null +++ b/src/icons/PlusDark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/Union.svg b/src/icons/Union.svg new file mode 100644 index 00000000000..e92846042b8 --- /dev/null +++ b/src/icons/Union.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_down_dark.svg b/src/icons/arrow_down_dark.svg new file mode 100644 index 00000000000..63aabd66391 --- /dev/null +++ b/src/icons/arrow_down_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_left.svg b/src/icons/arrow_left.svg new file mode 100644 index 00000000000..ac494c7a55e --- /dev/null +++ b/src/icons/arrow_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_left__disabled.svg b/src/icons/arrow_left__disabled.svg new file mode 100644 index 00000000000..5093d9b94dd --- /dev/null +++ b/src/icons/arrow_left__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_left_dark.svg b/src/icons/arrow_left_dark.svg new file mode 100644 index 00000000000..e2016da355b --- /dev/null +++ b/src/icons/arrow_left_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_left_dark__disabled.svg b/src/icons/arrow_left_dark__disabled.svg new file mode 100644 index 00000000000..983c07a6c3b --- /dev/null +++ b/src/icons/arrow_left_dark__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_right.svg b/src/icons/arrow_right.svg new file mode 100644 index 00000000000..b4f46876718 --- /dev/null +++ b/src/icons/arrow_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_right__disabled.svg b/src/icons/arrow_right__disabled.svg new file mode 100644 index 00000000000..a15457b9ad6 --- /dev/null +++ b/src/icons/arrow_right__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_right_dark.svg b/src/icons/arrow_right_dark.svg new file mode 100644 index 00000000000..3609b14bd62 --- /dev/null +++ b/src/icons/arrow_right_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/arrow_right_dark__disabled.svg b/src/icons/arrow_right_dark__disabled.svg new file mode 100644 index 00000000000..6e938ce2452 --- /dev/null +++ b/src/icons/arrow_right_dark__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/close__disabled.svg b/src/icons/close__disabled.svg new file mode 100644 index 00000000000..61e7a408321 --- /dev/null +++ b/src/icons/close__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/close_dark.svg b/src/icons/close_dark.svg new file mode 100644 index 00000000000..925e5fce497 --- /dev/null +++ b/src/icons/close_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/favorites.svg b/src/icons/favorites.svg new file mode 100644 index 00000000000..ca57cfedd8a --- /dev/null +++ b/src/icons/favorites.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/favorites__filled.svg b/src/icons/favorites__filled.svg new file mode 100644 index 00000000000..c0a8e3d8b5b --- /dev/null +++ b/src/icons/favorites__filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/favorites_dark.svg b/src/icons/favorites_dark.svg new file mode 100644 index 00000000000..8fb5abef51d --- /dev/null +++ b/src/icons/favorites_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/home_dark.svg b/src/icons/home_dark.svg new file mode 100644 index 00000000000..e16ca7d7943 --- /dev/null +++ b/src/icons/home_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/menu_dark.svg b/src/icons/menu_dark.svg new file mode 100644 index 00000000000..c8c52c08a95 --- /dev/null +++ b/src/icons/menu_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/icons/minus__disabled.svg b/src/icons/minus__disabled.svg new file mode 100644 index 00000000000..762e04664ee --- /dev/null +++ b/src/icons/minus__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/minus_dark.svg b/src/icons/minus_dark.svg new file mode 100644 index 00000000000..7ca53e577aa --- /dev/null +++ b/src/icons/minus_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/minus_dark__disabled.svg b/src/icons/minus_dark__disabled.svg new file mode 100644 index 00000000000..a89c12e2a17 --- /dev/null +++ b/src/icons/minus_dark__disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/plus_dark.svg b/src/icons/plus_dark.svg new file mode 100644 index 00000000000..a1506bb27d0 --- /dev/null +++ b/src/icons/plus_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/plus_dark1.png b/src/icons/plus_dark1.png new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/icons/search.svg b/src/icons/search.svg new file mode 100644 index 00000000000..801f11a5482 --- /dev/null +++ b/src/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/search_dark.svg b/src/icons/search_dark.svg new file mode 100644 index 00000000000..56a317c46f9 --- /dev/null +++ b/src/icons/search_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/shopping_cart.svg b/src/icons/shopping_cart.svg new file mode 100644 index 00000000000..4b8ebce70e6 --- /dev/null +++ b/src/icons/shopping_cart.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/icons/shopping_cart_dark.svg b/src/icons/shopping_cart_dark.svg new file mode 100644 index 00000000000..425ee639766 --- /dev/null +++ b/src/icons/shopping_cart_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/images/favicon.svg b/src/images/favicon.svg new file mode 100644 index 00000000000..e1eb131d6dd --- /dev/null +++ b/src/images/favicon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/logo.svg b/src/images/logo.svg new file mode 100644 index 00000000000..44e264fcc9e --- /dev/null +++ b/src/images/logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/logo_dark.svg b/src/images/logo_dark.svg new file mode 100644 index 00000000000..d59f941639c --- /dev/null +++ b/src/images/logo_dark.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/pages/FavoritesPage/FavoritesPage.scss b/src/pages/FavoritesPage/FavoritesPage.scss new file mode 100644 index 00000000000..432de035ed6 --- /dev/null +++ b/src/pages/FavoritesPage/FavoritesPage.scss @@ -0,0 +1,36 @@ +@import '../../styles/main'; + +.favoritesPage { + @include content-padding-inline; +} + +.favoritesPage__empty-content { + margin-top: 40px; + font-family: Mont-SemiBold, sans-serif; + font-size: 48px; + font-weight: 500; + color: var(--color-gray-secondary); + display: flex; + align-items: center; + justify-content: center; +} + +.favoritesPage__title { + margin-top: 16px; + margin-bottom: 40px; + + font-family: Mont-Bold, sans-serif; + font-weight: 800; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + font-size: 48px; + line-height: 56px; +} + +.favoritesPage__description { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + line-height: 21px; + color: var(--color-gray-secondary); +} diff --git a/src/pages/FavoritesPage/FavoritesPage.tsx b/src/pages/FavoritesPage/FavoritesPage.tsx new file mode 100644 index 00000000000..0a30b83e3d9 --- /dev/null +++ b/src/pages/FavoritesPage/FavoritesPage.tsx @@ -0,0 +1,57 @@ +/* eslint-disable prettier/prettier */ +import './FavoritesPage.scss'; +import { FC, useContext, useMemo } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { GlobalContext } from '../../context/GlobalContext'; +import { ProductsList } from '../../shared/ProductsList'; +import { Breadcrumbs } from '../../shared/Breadcrumbs'; + +export const FavoritesPage: FC = () => { + const { favorites } = useContext(GlobalContext); + + // const { pathname } = useLocation(); + + const [searchParams] = useSearchParams(); + const query = searchParams.get('query') || ''; + + // const normalizeProductsType = useMemo( + // () => pathname.slice(1, 2).toUpperCase() + pathname.slice(2), + // [pathname], + // ); + + const filteredFavorites = useMemo( + () => + query.length + ? favorites.filter(({ name }) => + name.toLowerCase().includes(query.toLowerCase().trim()), + ) + : favorites, + [favorites, query], + ); + + return ( +
+ +

Favorites

+ + + {`${filteredFavorites.length} ${filteredFavorites.length === 1 ? 'model' : 'models'}`} + + + {filteredFavorites.length ? ( +
+ +
+ ) : ( +
+ {query.length + ? `No favorites match your query` + : 'Your favorites list is empty'} +
+ )} +
+ ); +}; diff --git a/src/pages/FavoritesPage/index.ts b/src/pages/FavoritesPage/index.ts new file mode 100644 index 00000000000..b3a884b1889 --- /dev/null +++ b/src/pages/FavoritesPage/index.ts @@ -0,0 +1 @@ +export * from './FavoritesPage'; diff --git a/src/pages/HomePage/HomePage.scss b/src/pages/HomePage/HomePage.scss new file mode 100644 index 00000000000..e295473e517 --- /dev/null +++ b/src/pages/HomePage/HomePage.scss @@ -0,0 +1,26 @@ +@import '../../styles/main'; + +.homePage { + &__title { + margin-block: 24px; + font-family: Mont-Bold, sans-serif; + color: var(--color-gray-primary); + font-size: 32px; + font-weight: 800; + line-height: 41px; + letter-spacing: -0.01em; + + @include content-padding-inline; + + + @include on-tablet { + font-size: 48px; + line-height: 56px; + margin-block: 32px; + } + + @include on-desktop { + margin-block: 56px; + } + } +} diff --git a/src/pages/HomePage/HomePage.tsx b/src/pages/HomePage/HomePage.tsx new file mode 100644 index 00000000000..61eadc4d6a9 --- /dev/null +++ b/src/pages/HomePage/HomePage.tsx @@ -0,0 +1,79 @@ +import './HomePage.scss'; +import { FC, useContext, useMemo } from 'react'; +import { PicturesSlider } from '../../components/PicturesSlider'; +import { ShopByCategory } from '../../components/ShopByCategory'; +import { GlobalContext } from '../../context/GlobalContext'; +import { ProductsSlider } from '../../shared/ProductsSlider'; +import { Product } from '../../types/Product'; + +export const HomePage: FC = () => { + const { allProducts } = useContext(GlobalContext); + let newestProducts: Product[] = []; + const newestPhones = useMemo( + () => + [...allProducts] + .filter(product => product.category === 'phones') + .sort((phone1, phone2) => phone2.year - phone1.year) + .slice(0, 20), + [allProducts], + ); + + const newestTablets = useMemo( + () => + [...allProducts] + .filter(product => product.category === 'tablets') + .sort((p1, p2) => p2.year - p1.year) + .slice(0, 20), + [allProducts], + ); + + const newestAccessories = useMemo( + () => + [...allProducts] + .filter(product => product.category === 'accessories') + .sort((p1, p2) => p2.year - p1.year) + .slice(0, 20), + [allProducts], + ); + + newestProducts = [ + ...newestPhones.slice(0, 3), + ...newestTablets.slice(0, 3), + ...newestAccessories.slice(0, 3), + ]; + + const hotPricesProducts = useMemo( + () => + [...allProducts] + .map(product => ({ + ...product, + discount: + ((product.fullPrice - product.price) / product.fullPrice) * 100, + })) + .sort((product1, product2) => product2.discount - product1.discount) + .slice(0, 20), + [allProducts], + ); + + return ( +
+

Welcome to Nice Gadgets store!

+ + + + + + + + +
+ ); +}; diff --git a/src/pages/HomePage/index.ts b/src/pages/HomePage/index.ts new file mode 100644 index 00000000000..11e53da674c --- /dev/null +++ b/src/pages/HomePage/index.ts @@ -0,0 +1 @@ +export * from './HomePage'; diff --git a/src/pages/NotFoundPage/NotFoundPage.scss b/src/pages/NotFoundPage/NotFoundPage.scss new file mode 100644 index 00000000000..f97d8e5723f --- /dev/null +++ b/src/pages/NotFoundPage/NotFoundPage.scss @@ -0,0 +1,7 @@ +.container { + text-align: center; + margin-top: 40px; + font-family: Mont-SemiBold, sans-serif; + color: var(--color-gray-primary); + font-size: 48px; +} diff --git a/src/pages/NotFoundPage/NotFoundPage.tsx b/src/pages/NotFoundPage/NotFoundPage.tsx new file mode 100644 index 00000000000..e8d3847a97a --- /dev/null +++ b/src/pages/NotFoundPage/NotFoundPage.tsx @@ -0,0 +1,10 @@ +import './NotFoundPage.scss'; +import { FC } from 'react'; +import { Link } from 'react-router-dom'; + +export const NotFoundPage: FC = () => ( +
+

Page not found

+ Go to HomePage +
+); diff --git a/src/pages/NotFoundPage/index.ts b/src/pages/NotFoundPage/index.ts new file mode 100644 index 00000000000..6197aa75aa8 --- /dev/null +++ b/src/pages/NotFoundPage/index.ts @@ -0,0 +1 @@ +export * from './NotFoundPage'; diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.scss b/src/pages/ProductDetailsPage/ProductDetailsPage.scss new file mode 100644 index 00000000000..79359ad5b6f --- /dev/null +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.scss @@ -0,0 +1,36 @@ +@import '../../styles/main'; + +.detailsPage { + @include content-padding-inline; + + &__title { + margin-bottom: 32px; + font-size: 22px; + font-family: Mont-Bold, sans-serif; + + font-weight: 800; + line-height: 41px; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + + @include on-tablet { + margin-bottom: 40px; + font-size: 32px; + } + } + + &__error-message { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + margin-top: 40px; + font-family: Mont-SemiBold, sans-serif; + font-weight: 800; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + font-size: 48px; + line-height: 56px; + } +} diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx new file mode 100644 index 00000000000..3e0abe193bf --- /dev/null +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -0,0 +1,152 @@ +import './ProductDetailsPage.scss'; +import { useContext, useState, useEffect, FC } from 'react'; +import { Link, useLocation, useParams } from 'react-router-dom'; +import { Breadcrumbs } from '../../shared/Breadcrumbs'; +import { ProductDetails } from '../../types/ProductDetails'; +import { ProductContentTop } from '../../components/ProductContentTop'; +import { ProductContentBottom } from '../../components/ProductContentBottom'; +import { GlobalContext } from '../../context/GlobalContext'; +import { ProductsSlider } from '../../shared/ProductsSlider'; +import { ButtonBack } from '../../shared/ButtonBack'; +import { getSpecificProducts } from '../../utils/api'; +import { Loader } from '../../shared/Loader'; +import { Product } from '../../types/Product'; + +const getSuggestedProducts = ( + allProducts: Product[], + currentCategory: string, + productItemId: string, +) => { + return allProducts + .filter( + prod => + prod.category === currentCategory && prod.itemId !== productItemId, + ) + .sort(() => 0.5 - Math.random()); +}; + +export const ProductDetailsPage: FC = () => { + const { allProducts } = useContext(GlobalContext); + + const { productId = '' } = useParams(); + + const [product, setProduct] = useState(null); + const [productsArray, setProductsArray] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [errorMessage, setErrorMessage] = useState(''); + + const currentCategory = useLocation().pathname.split('/')[1]; + + useEffect(() => { + setIsLoading(true); + setErrorMessage(''); + + const timeout = setTimeout(() => { + getSpecificProducts(currentCategory) + .then(fetchedSpecificProducts => { + setProductsArray(fetchedSpecificProducts); + + const currentProduct = fetchedSpecificProducts.find( + prod => prod.id === productId, + ); + + if (currentProduct) { + setProduct(currentProduct); + setErrorMessage(''); + } else { + setProduct(null); + setErrorMessage('Product not found'); + } + }) + .catch(e => { + setErrorMessage(` + Error loading products: The product category "${currentCategory}" does not exist. ${e.name}`); + }) + .finally(() => { + setIsLoading(false); + }); + }, 500); + + return () => clearTimeout(timeout); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentCategory]); + + useEffect(() => { + if (!productId || !productsArray.length) { + return; + } + + const currentProduct = productsArray.find( + currProduct => currProduct.id === productId, + ); + + if (currentProduct) { + setProduct(currentProduct); + setErrorMessage(''); + } else { + setProduct(null); + setErrorMessage('Product not found'); + } + }, [productId, productsArray]); + + const suggestedProducts = productId + ? getSuggestedProducts(allProducts, currentCategory, productId) + : []; + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (errorMessage && !isLoading) { + return ( +
+
+ {errorMessage} + + Go to HomePage + +
+
+ ); + } + + if (!product) { + return; + } + + return ( +
+ {/* {errorMessage && !isLoading && ( +
+ {errorMessage} + Go to HomePage +
+ )}*/} + + + + + +

{product.name}

+ + + + + +
+ +
+
+ ); +}; diff --git a/src/pages/ProductDetailsPage/index.ts b/src/pages/ProductDetailsPage/index.ts new file mode 100644 index 00000000000..6615089e5ec --- /dev/null +++ b/src/pages/ProductDetailsPage/index.ts @@ -0,0 +1 @@ +export * from './ProductDetailsPage'; diff --git a/src/pages/ProductPage/ProductPage.scss b/src/pages/ProductPage/ProductPage.scss new file mode 100644 index 00000000000..6a00189fe8e --- /dev/null +++ b/src/pages/ProductPage/ProductPage.scss @@ -0,0 +1,98 @@ +@import '../../styles/main'; +.buttonUp { + position: sticky; + top: 70px; + cursor: pointer; + width: 32px; + height: 32px; + border: 1px solid var(--color-gray-icons-placeholders); + background-color: var(--color-bg); + transform: rotate(90deg); + + transition: border-color 0.3s ease; + + &:hover { + border: 1px solid var(--color-gray-primary); + background-color: var(--color-hover); + } + + +} + + +body.theme_dark .buttonUp { +border: 1px solid var(--color-gray-icons-placeholders); +background-color: none;// var(--color-surface-2); + +@include hover(background-color, var(--color-gray-icons-placeholders)); +} + +.productPage { + @include content-padding-inline; + + &__title { + font-family: Mont-Bold, sans-serif; + font-size: 32px; + font-weight: 800; + line-height: 41px; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + margin-bottom: 8px; + + @include on-tablet { + font-size: 48px; + line-height: 56px; + } + } + + &__description { + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + line-height: 21px; + color: var(--color-gray-secondary); + } + + &__dropdown { + margin-top: 32px; + gap: 16px; + + @include page-grid; + + @include on-tablet { + margin-top: 40px; + } + + &--sortBy { + grid-column: span 2; + + @include on-tablet { + grid-column: span 4; + } + } + + &--itemsPerPage { + grid-column: span 2; + + @include on-tablet { + grid-column: span 3; + } + } + } + + &__content { + display: flex; + flex-wrap: wrap; + gap: 40px 16px; + margin-top: 24px; + } + + &__no-products { + margin-top: 40px; + font-family: Mont-SemiBold, sans-serif; + font-size: 48px; + font-weight: 500; + color: var(--color-gray-secondary); + text-align: center; + } +} diff --git a/src/pages/ProductPage/ProductPage.tsx b/src/pages/ProductPage/ProductPage.tsx new file mode 100644 index 00000000000..0bf352e5ceb --- /dev/null +++ b/src/pages/ProductPage/ProductPage.tsx @@ -0,0 +1,213 @@ +import './ProductPage.scss'; +import { + FC, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react'; +import { useLocation, useSearchParams } from 'react-router-dom'; +import { Dropdown } from '../../shared/Dropdown'; +import { Pagination } from '../../shared/Pagination'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Breadcrumbs } from '../../shared/Breadcrumbs'; +import { ProductsList } from '../../shared/ProductsList'; +import { Loader } from '../../shared/Loader'; + +import { getSearchWith } from '../../utils/searchHelper'; +import { prepareProductList } from '../../utils/prepareProductList'; +import { capitalize } from '../../utils/capitalize'; +import { icons } from '../../constants/icons'; +import { Icon } from '../../shared/Icon'; + +type Props = { + category: string; +}; + +export const ProductPage: FC = ({ category }) => { + const { allProducts } = useContext(GlobalContext); + const { theme } = useContext(GlobalContext); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [searchParams, setSearchParams] = useSearchParams(); + + const sortBy = searchParams.get('sort') || 'Alphabetically'; + const itemsPerPage = searchParams.get('perPage') || 'All'; + const currentPage = Number(searchParams.get('page')) || 1; + const queryParam = searchParams.get('query') || ''; + + const location = useLocation(); + + const backToTop = useCallback(() => { + window.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }, []); + + const typeProduct = useMemo( + () => location.pathname.split('/')[1], + [location.pathname], + ); + + const categoryProducts = useMemo( + () => allProducts.filter(product => product.category === category), + [allProducts, category], + ); + + const visibleProducts = useMemo( + () => + prepareProductList(categoryProducts, { + sortBy, + query: queryParam, + }), + [categoryProducts, queryParam, sortBy], + ); + + const countVisibleProducts = useMemo( + () => visibleProducts.length, + [visibleProducts.length], + ); + + const handleSortChange = useCallback( + (value: string) => { + const updatedParams = + value === 'Alphabetically' ? { sort: null } : { sort: value }; + + setSearchParams(getSearchWith(searchParams, updatedParams)); + }, + [searchParams, setSearchParams], + ); + + const handleItemsPerPageChange = useCallback( + (value: string) => { + const updatedParams = + value === 'All' + ? { perPage: null, page: null } + : { perPage: value, page: '1' }; + + setSearchParams(getSearchWith(searchParams, updatedParams)); + }, + [searchParams, setSearchParams], + ); + + const handlePageChange = useCallback( + (page: number) => { + const updatedParams = + page === 1 ? { page: null } : { page: String(page) }; + + setSearchParams(getSearchWith(searchParams, updatedParams)); + }, + [searchParams, setSearchParams], + ); + + const totalPages = useMemo( + () => + itemsPerPage === 'All' + ? 1 + : Math.ceil(countVisibleProducts / +itemsPerPage), + [countVisibleProducts, itemsPerPage], + ); + + const startIndex = useMemo( + () => (currentPage - 1) * +itemsPerPage, + [currentPage, itemsPerPage], + ); + + const currentItems = useMemo( + () => + itemsPerPage === 'All' + ? visibleProducts + : visibleProducts.slice(startIndex, startIndex + +itemsPerPage), + [itemsPerPage, startIndex, visibleProducts], + ); + + useEffect(() => { + setIsLoading(true); + setError(null); + + const timer = setTimeout(() => { + try { + if (!allProducts || allProducts.length === 0) { + setError('Failed to load products'); + } + } catch (err) { + setError('Failed to load products'); + } finally { + setIsLoading(false); + } + }, 500); + + return () => clearTimeout(timer); + }, [category, allProducts]); + + return ( +
+ {isLoading && } + + {!isLoading && error && ( +
+

Something went wrong. Please try again.

+ +
+ )} + + {!isLoading && !error && !visibleProducts.length && !queryParam ? ( +
+

There are no {category} yet.

+
+ ) : null} + + {!isLoading && !error && !visibleProducts.length && queryParam ? ( +

{`There are no ${typeProduct} matching the query`}

+ ) : null} + + {!isLoading && !error && visibleProducts.length ? ( + <> + + +

+ {category && `${capitalize(category)} page`} +

+ + + {`${countVisibleProducts} model${countVisibleProducts !== 1 ? 's' : ''}`} + + +
+
+ +
+
+ +
+
+ + + + {itemsPerPage !== 'All' && totalPages > 1 && ( + + )} + + ) : null} +
+ ); +}; diff --git a/src/pages/ProductPage/index.ts b/src/pages/ProductPage/index.ts new file mode 100644 index 00000000000..875dce3d23c --- /dev/null +++ b/src/pages/ProductPage/index.ts @@ -0,0 +1 @@ +export * from './ProductPage'; diff --git a/src/pages/ShoppingCartPage/ShoppingCartPage.scss b/src/pages/ShoppingCartPage/ShoppingCartPage.scss new file mode 100644 index 00000000000..8bff13c0984 --- /dev/null +++ b/src/pages/ShoppingCartPage/ShoppingCartPage.scss @@ -0,0 +1,128 @@ +@import '../../styles/main'; + +.cartPage { + @include content-padding-inline; + + &__title { + margin-top: 16px; + margin-bottom: 32px; + + font-family: Mont-Bold, sans-serif; + font-weight: 800; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + font-size: 48px; + line-height: 56px; + } + + &__content { + display: flex; + flex-direction: column; + gap: 32px; + + @include on-desktop { + @include page-grid; + } + + &-container { + display: flex; + flex-direction: column; + gap: 16px; + + @include on-desktop { + grid-column: span 16; + } + } + } + + &__empty-content { + display: flex; + width: 100%; + align-items: center; + justify-content: center; + + &-title { + font-family: Mont-SemiBold, sans-serif; + font-size: 48px; + font-weight: 500; + color: var(--color-gray-secondary); + display: flex; + justify-content: center; + width: 460px; + } + } + + &__image-empty { + width: 40%; + } + + &__total { + height: fit-content; + padding: 24px; + text-align: center; + border: 1px solid var(--color-gray-elements); + + @include on-desktop { + grid-column: span 8; + } + + &-count { + font-family: Mont-Bold, sans-serif; + font-size: 32px; + font-weight: 800; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + } + + &-title { + font-family: Mont-Regular, sans-serif; + + font-size: 14px; + font-weight: 500; + line-height: 21px; + color: var(--color-gray-secondary); + } + } + + &__line { + width: 100%; + height: 1px; + background-color: var(--color-gray-elements); + + margin-block: 24px; + } + + &__button-checkout { + width: 100%; + padding: 12px 0; + background-color: var(--color-gray-primary); + border: none; + + font-family: Mont-SemiBold, sans-serif; + font-size: 14px; + font-weight: 700; + line-height: 21px; + text-align: center; + color: var(--color-bg); + cursor: pointer; + transition: + background-color 0.3s ease, + box-shadow 0.3s ease, + color 0.3s ease; + + @include hover(box-shadow, 0 3px 13px 0 #17203166); + } +} + +body.theme_dark .cartPage__button-checkout { + background-color: var(--color-accent); + color: var(--color-gray-primary); + transition: + background-color 0.3s ease, + box-shadow 0.3s ease, + color 0.3s ease; + + &:hover { + background-color: var(--color-accent-hover); + } +} diff --git a/src/pages/ShoppingCartPage/ShoppingCartPage.tsx b/src/pages/ShoppingCartPage/ShoppingCartPage.tsx new file mode 100644 index 00000000000..36a426a71d5 --- /dev/null +++ b/src/pages/ShoppingCartPage/ShoppingCartPage.tsx @@ -0,0 +1,87 @@ +import './ShoppingCartPage.scss'; +import { FC, useCallback, useContext, useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; +import { GlobalContext } from '../../context/GlobalContext'; +import { CartItem } from '../../components/CartItem'; +import { ButtonBack } from '../../shared/ButtonBack'; + +export const ShoppingCartPage: FC = () => { + const { cart, clearShoppingCart } = useContext(GlobalContext); + + const { pathname } = useLocation(); + + const normalizeProductsType = useMemo( + () => pathname.slice(1, 2).toUpperCase() + pathname.slice(2), + [pathname], + ); + + const { totalCount, totalQuantity } = useMemo(() => { + let cartQuantity = 0; + let cartCount = 0; + + for (const { + quantity, + product: { price }, + } of cart) { + cartQuantity += quantity; + cartCount += quantity * price; + } + + return { totalQuantity: cartQuantity, totalCount: cartCount }; + }, [cart]); + + const handleCheckout = useCallback(() => { + const confirmed = confirm( + 'Checkout is not implemented yet. Do you want to clear the Cart?', + ); + + if (confirmed) { + clearShoppingCart(); + } + }, [clearShoppingCart]); + + return ( +
+ + +

{normalizeProductsType}

+ + {!cart.length ? ( +
+ + Your cart is empty + + Empty shopping cart +
+ ) : null} + + {cart.length ? ( +
+
+ {cart.map(item => ( + + ))} +
+ +
+
${totalCount}
+
+ Total for {totalQuantity} items +
+
+ +
+
+ ) : null} +
+ ); +}; diff --git a/src/pages/ShoppingCartPage/index.ts b/src/pages/ShoppingCartPage/index.ts new file mode 100644 index 00000000000..0940a9c7227 --- /dev/null +++ b/src/pages/ShoppingCartPage/index.ts @@ -0,0 +1 @@ +export * from './ShoppingCartPage'; diff --git a/src/routes/Routes.tsx b/src/routes/Routes.tsx new file mode 100644 index 00000000000..d7db2a5438d --- /dev/null +++ b/src/routes/Routes.tsx @@ -0,0 +1,47 @@ +import { Layout } from '../Layout'; + +import { Route, HashRouter as Router, Routes } from 'react-router-dom'; +import { + LazyHomePage, + LazyNotFoundPage, + LazyProductDetailsPage, + LazyProductPage, + LazyShoppingCartPage, + LazyFavoritesPage, +} from './lazyLoad'; + +export const AppRoutes = () => ( + + + }> + } /> + + + } /> + + } /> + + + + } /> + + } /> + + + + } /> + + } /> + + + } /> + + } /> + + } /> + + + +); + +export default AppRoutes; diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 00000000000..2f80a5cca0e --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1 @@ +export * from './Routes'; diff --git a/src/routes/lazyLoad.ts b/src/routes/lazyLoad.ts new file mode 100644 index 00000000000..2e38cdb62a4 --- /dev/null +++ b/src/routes/lazyLoad.ts @@ -0,0 +1,35 @@ +import { lazy } from 'react'; + +export const LazyHomePage = lazy(() => + import('../pages/HomePage').then(({ HomePage }) => ({ default: HomePage })), +); + +export const LazyProductPage = lazy(() => + import('../pages/ProductPage').then(({ ProductPage }) => ({ + default: ProductPage, + })), +); + +export const LazyProductDetailsPage = lazy(() => + import('../pages/ProductDetailsPage').then(({ ProductDetailsPage }) => ({ + default: ProductDetailsPage, + })), +); + +export const LazyShoppingCartPage = lazy(() => + import('../pages/ShoppingCartPage').then(({ ShoppingCartPage }) => ({ + default: ShoppingCartPage, + })), +); + +export const LazyFavoritesPage = lazy(() => + import('../pages/FavoritesPage').then(({ FavoritesPage }) => ({ + default: FavoritesPage, + })), +); + +export const LazyNotFoundPage = lazy(() => + import('../pages/NotFoundPage').then(({ NotFoundPage }) => ({ + default: NotFoundPage, + })), +); diff --git a/src/shared/Breadcrumbs/Breadcrumbs.scss b/src/shared/Breadcrumbs/Breadcrumbs.scss new file mode 100644 index 00000000000..76f9bebc411 --- /dev/null +++ b/src/shared/Breadcrumbs/Breadcrumbs.scss @@ -0,0 +1,43 @@ +@import '../../styles/main'; + +.breadcrumbs { + &__item { + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 600; + color: var(--color-gray-secondary); + display: inline-block; + vertical-align: middle; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 100%; + + &--dark { + text-decoration: none; + color: var(--color-gray-primary); + } + } + + &__link-home, + &__arrow { + display: flex; + align-items: center; + justify-content: center; + } + + &__container { + height: 16px; + margin-block: 24px; + display: flex; + align-items: center; + gap: 8px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + + @include on-tablet { + margin-bottom: 40px; + } + } +} diff --git a/src/shared/Breadcrumbs/Breadcrumbs.tsx b/src/shared/Breadcrumbs/Breadcrumbs.tsx new file mode 100644 index 00000000000..d0a8009c404 --- /dev/null +++ b/src/shared/Breadcrumbs/Breadcrumbs.tsx @@ -0,0 +1,55 @@ +import './Breadcrumbs.scss'; +import { FC, useContext, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import { Icon } from '../../shared/Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; +import { capitalize } from '../../utils/capitalize'; + +type Props = { + productType: string; + productName?: string; +}; + +export const Breadcrumbs: FC = ({ productType, productName }) => { + const { theme } = useContext(GlobalContext); + + const normalizeProductsType = useMemo( + () => capitalize(productType), + [productType], + ); + + return ( +
+
+ + + + + + + + + {productName ? ( + <> + + + {normalizeProductsType} + + + + + + {productName} + + ) : ( + {normalizeProductsType} + )} +
+
+ ); +}; diff --git a/src/shared/Breadcrumbs/index.ts b/src/shared/Breadcrumbs/index.ts new file mode 100644 index 00000000000..ce977548b14 --- /dev/null +++ b/src/shared/Breadcrumbs/index.ts @@ -0,0 +1 @@ +export * from './Breadcrumbs'; diff --git a/src/shared/ButtonBack/ButtonBack.scss b/src/shared/ButtonBack/ButtonBack.scss new file mode 100644 index 00000000000..cbed9241ca4 --- /dev/null +++ b/src/shared/ButtonBack/ButtonBack.scss @@ -0,0 +1,22 @@ +@import '../../styles/main'; + +.button { + margin-block: 24px 16px; + background-color: var(--color-bg); + display: flex; + align-items: center; + gap: 4px; + cursor: pointer; + + @include on-tablet { + margin-top: 40px; + } + + &-title { + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + line-height: 13px; + font-weight: 700; + color: var(--color-gray-primary); + } +} diff --git a/src/shared/ButtonBack/ButtonBack.tsx b/src/shared/ButtonBack/ButtonBack.tsx new file mode 100644 index 00000000000..a3dcca9320a --- /dev/null +++ b/src/shared/ButtonBack/ButtonBack.tsx @@ -0,0 +1,24 @@ +import './ButtonBack.scss'; +import { FC, useCallback, useContext } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Icon } from '../../shared/Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; + +export const ButtonBack: FC = () => { + const { theme } = useContext(GlobalContext); + + const navigate = useNavigate(); + + const handleBack = useCallback(() => { + navigate(-1); + }, [navigate]); + + return ( +
+ + +
Back
+
+ ); +}; diff --git a/src/shared/ButtonBack/index.ts b/src/shared/ButtonBack/index.ts new file mode 100644 index 00000000000..5e81ee4635f --- /dev/null +++ b/src/shared/ButtonBack/index.ts @@ -0,0 +1 @@ +export * from './ButtonBack' diff --git a/src/shared/Dropdown/Dropdown.scss b/src/shared/Dropdown/Dropdown.scss new file mode 100644 index 00000000000..e2c9b9bef0d --- /dev/null +++ b/src/shared/Dropdown/Dropdown.scss @@ -0,0 +1,88 @@ +@import '../../styles/main'; + +.dropdown { + position: relative; + + &__label { + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 700; + color: var(--color-gray-secondary); + } + + &__icon { + width: 16px; + height: 16px; + transition: transform 0.3s ease; + } + + &__title { + font-family: Mont-SemiBold, sans-serif; + font-size: 14px; + line-height: 14px; + font-weight: 700; + color: var(--color-gray-primary); + } + + &__options { + position: absolute; + width: 100%; + top: calc(100% + 8px); + padding-block: 8px; + background-color: var(--color-bg); + border: 1px solid var(--color-gray-icons-placeholders); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + max-height: 200px; + overflow-y: auto; + transition: all 0.3s ease-in-out; + z-index: 1; + } + + &__option { + padding: 9px 12px; + cursor: pointer; + font-family: Mont-Regular, sans-serif; + font-size: 14px; + line-height: 14px; + color: var(--color-gray-secondary); + + &:hover { + color: var(--color-gray-primary); + background-color: var(--color-hover); + } + } + + &__button { + padding: 11px 12px; + background: none; + border: 1px solid var(--color-gray-icons-placeholders); + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + transition: border 0.3s; + + &:focus { + border-color: var(--color-accent); + } + + &:not(.dropdown__button--open) { + border-color: var(--color-gray-icons-placeholders); + } + + &:hover:not(.dropdown__button--open) { + border-color: var(--color-gray-secondary); + } + + &--open { + border-color: var(--color-accent); + background-color: var(--color-surface-2); + } + } +} + +body.theme_dark .dropdown__option:hover { + color: var(--color-gray-primary); + background-color: var(--color-surface-2); +} diff --git a/src/shared/Dropdown/Dropdown.tsx b/src/shared/Dropdown/Dropdown.tsx new file mode 100644 index 00000000000..479416a9180 --- /dev/null +++ b/src/shared/Dropdown/Dropdown.tsx @@ -0,0 +1,94 @@ +import './Dropdown.scss'; +import { + FC, + memo, + useCallback, + useContext, + useEffect, + useRef, + useState, +} from 'react'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; + +type Props = { + label: string; + selected: string; + options: string[]; + onChange: (value: string) => void; +}; + +export const Dropdown: FC = memo( + ({ label, selected, options, onChange }) => { + const { theme } = useContext(GlobalContext); + + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + + useEffect(() => { + // onBlur + const handleClickOutside = (event: MouseEvent) => { + if ( + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) + ) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + const handleButtonClick = useCallback( + () => setIsOpen(prevState => !prevState), + [], + ); + + const handleOptionClick = useCallback( + (value: string) => { + onChange(value); + setIsOpen(false); + }, + [onChange], + ); + + return ( +
+
{label}
+ + + + {isOpen && ( +
    + {options.map(option => ( +
  • handleOptionClick(option)} + > + {option} +
  • + ))} +
+ )} +
+ ); + }, +); + +Dropdown.displayName = 'Dropdown'; diff --git a/src/shared/Dropdown/index.ts b/src/shared/Dropdown/index.ts new file mode 100644 index 00000000000..2f29bad4e67 --- /dev/null +++ b/src/shared/Dropdown/index.ts @@ -0,0 +1 @@ +export * from './Dropdown'; diff --git a/src/shared/Filter/Filter.scss b/src/shared/Filter/Filter.scss new file mode 100644 index 00000000000..8e6c74d52c6 --- /dev/null +++ b/src/shared/Filter/Filter.scss @@ -0,0 +1,59 @@ +@import '../../styles/main'; +@import '../../utils/variables'; + +.header { + height: 48px; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + gap: 16px; + box-shadow: 0 1px 0 0 var(--color-gray-elements); + background-color: var(--color-bg); + + @include on-desktop { + height: 64px; + } +} +.header__search-wrapper { + position: relative; + display: flex; + align-items: center; + margin-right: 16px; +} + +.header__search-input { + height: 48px; + box-shadow: -1px 0 0 0 var(--color-gray-elements); + width: 100%; + padding-inline: 8px; + background-color: var(--color-bg); + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-primary); + font-size: 14px; + font-weight: 400; + line-height: 21px; + outline: none; + border: none; + + @include on-tablet { + flex-grow: 1; + } + + @include on-desktop { + height: 64px; + } + + .header__search-input::placeholder { + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-secondary); + font-size: 12px; + font-weight: 400; + line-height: 21px; + transition: opacity 0.3s ease; + } + + .header__search-input:focus::placeholder { + opacity: 0; + } +} diff --git a/src/shared/Filter/Filter.tsx b/src/shared/Filter/Filter.tsx new file mode 100644 index 00000000000..5d468690e53 --- /dev/null +++ b/src/shared/Filter/Filter.tsx @@ -0,0 +1,107 @@ +import './Filter.scss'; +import { FC, useCallback, useContext, useEffect, useMemo } from 'react'; +import { icons } from '../../constants/icons'; +import { Icon } from '../Icon'; +import { useLocation, useSearchParams } from 'react-router-dom'; + +import { GlobalContext } from '../../context/GlobalContext'; +import { getSearchWith } from '../../utils/getSearchWith'; + +/*import React, { useState, useCallback } from 'react'; +import debounce from 'lodash/debounce'; + +const DebouncedInput = () => { + const [value, setValue] = useState(''); + + const handleInput = useCallback( + debounce(inputValue => { + console.log('Debounced value:', inputValue); + }, 300), + [], + ); + + const onChange = event => { + setValue(event.target.value); + handleInput(event.target.value); + }; + + return ; +}; + +export default DebouncedInput; +*/ + +type Param = string | number; +type Params = { + [key: string]: Param[] | Param | null; +}; +export const Filter: FC = () => { + const [searchParams, setSearchParams] = useSearchParams(); + const query = searchParams.get('query') || ''; + const { theme } = useContext(GlobalContext); + + const location = useLocation(); + + const isShowSearch = useMemo( + () => + ['/phones', '/tablets', '/accessories', '/favorites'].includes( + location.pathname, + ), + [location.pathname], + ); + + const clearInput = useCallback(() => { + //setQuery(''); + setSearchParams(prevParams => { + const newParams = new URLSearchParams(prevParams); + + newParams.delete('query'); + + return newParams; + }); + }, [setSearchParams]); + + const setSearchWith = useCallback( + (params: Params) => { + //const newParams = new URLSearchParams(searchParams); + const search = getSearchWith(params, searchParams); + + //params.set("userId", event.target.value); + setSearchParams(search); + }, + [searchParams, setSearchParams], + ); + + const handleInputChange = useCallback( + (event: React.ChangeEvent) => { + setSearchWith({ query: event.target.value.trim() || null }); + }, + [setSearchWith], + ); + + useEffect(() => { + clearInput(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [location.pathname]); + + return ( + isShowSearch && ( +
+ + {query ? ( +
+ +
+ ) : ( + + )} +
+ ) + ); +}; diff --git a/src/shared/Filter/index.ts b/src/shared/Filter/index.ts new file mode 100644 index 00000000000..0eea77907fe --- /dev/null +++ b/src/shared/Filter/index.ts @@ -0,0 +1 @@ +export * from './Filter'; diff --git a/src/shared/Footer/Footer.scss b/src/shared/Footer/Footer.scss new file mode 100644 index 00000000000..27b477f8ce1 --- /dev/null +++ b/src/shared/Footer/Footer.scss @@ -0,0 +1,108 @@ +@import '../../styles/main'; + +.footer { + box-shadow: 0 -1px 0 0 var(--color-gray-elements); + + &__container { + display: flex; + flex-direction: column; + gap: 32px; + padding-block: 32px; + margin-top: 64px; + + @include content-padding-inline; + + @include on-tablet { + flex-direction: row; + justify-content: space-between; + align-items: center; + } + + @include on-desktop { + margin-top: 80px; + } + } + + &__logo { + width: 89px; + height: 32px; + + &-container { + @include on-tablet { + flex-grow: 1; + } + } + } + + &__items { + display: flex; + flex-direction: column; + gap: 16px; + + @include on-tablet { + flex-direction: row; + justify-content: space-between; + } + + @include on-desktop { + align-items: center; + } + } + + &__link { + text-transform: uppercase; + text-decoration: none; + font-family: Mont-Bold, sans-serif; + font-size: 12px; + font-weight: 800; + line-height: 11px; + letter-spacing: 0.04em; + color: var(--color-gray-secondary); + + @include hover(color, var(--color-gray-primary)); + } + + &__block { + display: flex; + align-items: center; + justify-content: center; + gap: 16px; + cursor: pointer; + + @include on-tablet { + justify-content: end; + flex-grow: 1; + } + } + + &__button { + + cursor: pointer; + width: 32px; + height: 32px; + border: 1px solid var(--color-gray-icons-placeholders); + background-color: var(--color-bg); + transform: rotate(90deg); + + transition: border-color 0.3s ease; + + &:hover { + border: 1px solid var(--color-gray-primary); + background-color: var(--color-hover); + } + + &-title { + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 700; + color: var(--color-gray-secondary); + } + } +} + +body.theme_dark .footer__button { + border: none; + background-color: var(--color-surface-2); + + @include hover(background-color, var(--color-gray-icons-placeholders)); +} diff --git a/src/shared/Footer/Footer.tsx b/src/shared/Footer/Footer.tsx new file mode 100644 index 00000000000..e217c3eeb6b --- /dev/null +++ b/src/shared/Footer/Footer.tsx @@ -0,0 +1,72 @@ +import './Footer.scss'; +import { FC, useCallback, useContext } from 'react'; +import { Link } from 'react-router-dom'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; + +export const Footer: FC = () => { + const { theme } = useContext(GlobalContext); + + const backToTop = useCallback(() => { + window.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }, []); + + return ( +
+
+ + {/* + + Nice Gadgets + + */} + +
+ + Github + + + Contacts + + + Rights + +
+ +
+ Back to top + +
+
+
+ ); +}; diff --git a/src/shared/Footer/index.ts b/src/shared/Footer/index.ts new file mode 100644 index 00000000000..ddcc5a9cd18 --- /dev/null +++ b/src/shared/Footer/index.ts @@ -0,0 +1 @@ +export * from './Footer'; diff --git a/src/shared/Header/Header.scss b/src/shared/Header/Header.scss new file mode 100644 index 00000000000..a609cdf850b --- /dev/null +++ b/src/shared/Header/Header.scss @@ -0,0 +1,296 @@ +@import '../../styles/main'; +@import '../../utils/variables'; + +.header { + height: 48px; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + gap: 16px; + box-shadow: 0 1px 0 0 var(--color-gray-elements); + background-color: var(--color-bg); + + @include on-desktop { + height: 64px; + } +} + +.header__logo { + width: 64px; + height: 22px; + + @include on-desktop { + width: 80px; + height: 28px; + } +} + +.header__logo-container { + display: flex; + height: 100%; + width: 96px; + align-items: center; + justify-content: center; + flex-shrink: 0; + + @include on-desktop { + width: 128px; + } +} + +.header__menu { + display: none; + + @include on-tablet { + display: flex; + } +} + +.header__list { + list-style: none; + display: flex; + align-items: center; + gap: 24px; + text-decoration: none; + + @include on-desktop { + gap: 64px; + } +} + +.header__item { + position: relative; + display: inline-block; + text-transform: uppercase; + text-decoration: none; + line-height: 48px; + font-family: Mont-Bold, sans-serif; + color: var(--color-gray-secondary); + font-size: 12px; + font-weight: 800; + letter-spacing: 0.04em; + box-sizing: border-box; + + @include on-desktop { + line-height: 64px; + } +} + +.header__item:hover { + color: var(--color-gray-primary); +} + +.header__item::after, +.header__icon::after { + content: ''; + position: absolute; + display: block; + height: 0; + width: 100%; + background-color: var(--color-gray-primary); + transition: height 0.3s ease, transform 0.3s ease; + transform-origin: left; + bottom: 0; + box-sizing: border-box; +} + +.header__item:hover::after, +.header__icon:hover::after { + height: 2px; + transform: scale(1); +} + +.header__item--active { + color: var(--color-gray-primary); +} + +.header__item--active::after { + height: 2px; + transition: none; +} + +.header__search-wrapper { + position: relative; + display: flex; + align-items: center; + margin-right: 16px; +} + +.header__search-input { + height: 48px; + box-shadow: -1px 0 0 0 var(--color-gray-elements); + width: 100%; + padding-inline: 8px; + background-color: var(--color-bg); + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-primary); + font-size: 14px; + font-weight: 400; + line-height: 21px; + outline: none; + border: none; + + @include on-tablet { + flex-grow: 1; + } + + @include on-desktop { + height: 64px; + } + + .header__search-input::placeholder { + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-secondary); + font-size: 12px; + font-weight: 400; + line-height: 21px; + transition: opacity 0.3s ease; + } + + .header__search-input:focus::placeholder { + opacity: 0; + } +} + +.header__switch-theme { + background: none; + border: none; + cursor: pointer; + + order: 1; + color: var(--color-gray-secondary); + font-size: 12px; + font-weight: 800; + letter-spacing: 0.04em; + text-transform: uppercase; + text-decoration: none; + line-height: 48px; + font-family: Mont-Bold, sans-serif; + box-sizing: border-box; + flex-shrink: 0; + + position: relative; + display: inline-block; + + @include on-tablet { + order: 0; + } + + @include on-desktop { + line-height: 64px; + } + + &:hover { + color: var(--color-gray-primary); + } +} + +.header__buttons-right { + height: 100%; + flex-grow: 1; + display: flex; + justify-content: flex-end; + align-items: center; +} + +.header__buttons-wrapper { + display: none; + + @include on-tablet { + display: flex; + } +} + +.header__buttons-wrapper--bottom { + display: flex; + position: fixed; + bottom: 0; + left: 0; + right: 0; + justify-content: space-between; + background-color: var(--color-bg); + height: 64px; + border-top: 1px solid var(--color-gray-elements); +} + +.header__icon { + width: 48px; + height: 48px; + box-shadow: -1px 0 0 0 var(--color-gray-elements); + display: flex; + align-items: center; + justify-content: center; + position: relative; + + + @include on-tablet { + display: flex; + } + + @include on-desktop { + width: 64px; + height: 64px; + } +} + +.header__buttons-wrapper--bottom .header__icon { + width: 100%; + height: 100%; + align-items: center; + justify-content: center; +} + +.header__icon:hover { + color: var(--color-gray-primary); + background: var(--color-hover); +} + +body.theme_dark .header__icon:hover { + @include hover(background-color, var(--color-gray-icons-placeholders)) +} + +.header__icon--active::after { + content: ''; + position: absolute; + width: 64px; + width: 100%; + background-color: var(--color-gray-primary); +} + +.header__icon-wrapper { + width: 28px; + height: 28px; + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.header__quantity { + position: absolute; + top: 0; + right: 0; + background-color: var(--color-red); + color: white; + border: 1px solid white; + border-radius: 50%; + width: 14px; + height: 14px; + display: flex; + justify-content: center; + align-items: center; + + font-family: Mont-Regular, sans-serif; + font-size: 9px; + font-weight: 700; +} + +.header__icon--menu { + display: flex; + order: 2; + + @include on-tablet { + display: none; + } +} diff --git a/src/shared/Header/Header.tsx b/src/shared/Header/Header.tsx new file mode 100644 index 00000000000..9640dcbd90b --- /dev/null +++ b/src/shared/Header/Header.tsx @@ -0,0 +1,196 @@ +import './Header.scss'; + +import classNames from 'classnames'; +import { useContext, useEffect, useMemo, FC, useCallback } from 'react'; +import { Link, NavLink, useLocation, useSearchParams } from 'react-router-dom'; +import { GlobalContext } from '../../context/GlobalContext'; +import { icons } from '../../constants/icons'; +import { Icon } from '../Icon'; +import { navLinks } from '../../constants/navLinks'; +// import debounce from 'lodash.debounce'; +import { getSearchWith } from '../../utils/getSearchWith'; +import { Filter } from '../Filter'; + +type Param = string | number; +type Params = { + [key: string]: Param[] | Param | null; +}; + +const getActiveItem = ({ isActive }: { isActive: boolean }) => + classNames('header__item', { 'header__item--active': isActive }); + +const getActiveIcon = ({ isActive }: { isActive: boolean }) => + classNames('header__icon', { 'header__icon--active': isActive }); + +export const Header: FC = () => { + const { cart, favorites, toggleMenu, isMenuOpen, theme, toggleTheme } = + useContext(GlobalContext); + + const location = useLocation(); + //const [query, setQuery] = useState(''); + //const [appliedQuery, setAppliedQuery] = useState(''); + const [searchParams, setSearchParams] = useSearchParams(); + //const [query, setQuery] = useState(''); + const query = searchParams.get('query') || ''; + const totalQuantity = useMemo( + () => cart.reduce((sum, item) => sum + item.quantity, 0), + [cart], + ); + + const isShowSearch = useMemo( + () => + ['/phones', '/tablets', '/accessories', '/favorites'].includes( + location.pathname, + ), + [location.pathname], + ); + + const clearInput = useCallback(() => { + //setQuery(''); + setSearchParams(prevParams => { + const newParams = new URLSearchParams(prevParams); + + newParams.delete('query'); + + return newParams; + }); + }, [setSearchParams]); + + const setSearchWith = useCallback( + (params: Params) => { + //const newParams = new URLSearchParams(searchParams); + const search = getSearchWith(params, searchParams); + + //params.set("userId", event.target.value); + setSearchParams(search); + }, + [searchParams, setSearchParams], + ); + + /* + const handleInputChange = useCallback( + (event: ChangeEvent) => { + const newQuery = event.target.value.trim(); + + setQuery(newQuery); + + if (newQuery.length > 0) { + applyQuery(newQuery); + } else if (newQuery.length === 0) { + clearInput(); + } + }, + [applyQuery, clearInput], + ); + + const applyQuery = useMemo( + () => + debounce( + (value: string) => + setSearchParams(getSearchWith({ query: value }, searchParams)), + 500, + ), + [searchParams, setSearchParams], + ); +*/ + + /* const handleInputChange = useCallback( + (event: React.ChangeEvent) => { + //setSearchWith({ query: event.target.value.trim() || null }); + + setSearchWith({ query: event.target.value.trim() || null }); + //const params = new URLSearchParams(searchParams); + //params.set("query", event.target.value); + //setSearchParams(params); + //setSearchParams(`?query=${event.target.value}`); + }, + [setSearchWith], + );*/ + + useEffect(() => { + clearInput(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [location.pathname]); + + return ( +
+ + + + +
+
+ {navLinks.map(link => ( + + {link.title} + + ))} +
+
+ +
+ + {/* {isShowSearch && ( +
+ + {query ? ( +
+ +
+ ) : ( + + )} +
+ )} + */} +
+ +
+ + + +
{ + if (isMenuOpen) { + toggleMenu(); + } + }} + > + +
+ {favorites.length ? ( + {favorites.length} + ) : null} + + +
+
+ + +
+ + + {totalQuantity > 0 && ( + {totalQuantity} + )} +
+
+
+
+
+ ); +}; diff --git a/src/shared/Header/index.ts b/src/shared/Header/index.ts new file mode 100644 index 00000000000..266dec8a1bc --- /dev/null +++ b/src/shared/Header/index.ts @@ -0,0 +1 @@ +export * from './Header'; diff --git a/src/shared/Icon/Icon.scss b/src/shared/Icon/Icon.scss new file mode 100644 index 00000000000..197235f9cdb --- /dev/null +++ b/src/shared/Icon/Icon.scss @@ -0,0 +1,7 @@ +@import '../../styles/main'; + +.icon__picture { + display: flex; + width: 16px; + height: 16px; +} diff --git a/src/shared/Icon/Icon.tsx b/src/shared/Icon/Icon.tsx new file mode 100644 index 00000000000..5c47339af13 --- /dev/null +++ b/src/shared/Icon/Icon.tsx @@ -0,0 +1,12 @@ +import { FC, memo } from 'react'; +import './Icon.scss'; + +type Props = { + icon: { title: string; path: string }; +}; + +export const Icon: FC = memo(({ icon }) => ( + {icon.title} +)); + +Icon.displayName = 'icon'; diff --git a/src/shared/Icon/index.ts b/src/shared/Icon/index.ts new file mode 100644 index 00000000000..e263cc0e6db --- /dev/null +++ b/src/shared/Icon/index.ts @@ -0,0 +1 @@ +export * from './Icon'; diff --git a/src/shared/Loader/Loader.scss b/src/shared/Loader/Loader.scss new file mode 100644 index 00000000000..7411961d05f --- /dev/null +++ b/src/shared/Loader/Loader.scss @@ -0,0 +1,31 @@ +.loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-75px, -75px); + + + &__content { + border-radius: 50%; + width: 2em; + height: 2em; + margin: 1em auto; + border: 0.3em solid #ddd; + border-left-color: #000; + animation: load8 1.2s infinite linear; + } + + &__image { + width: 150px; + height: 150px; + } +} + +@keyframes load8 { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/shared/Loader/Loader.tsx b/src/shared/Loader/Loader.tsx new file mode 100644 index 00000000000..6fa0657c9c6 --- /dev/null +++ b/src/shared/Loader/Loader.tsx @@ -0,0 +1,24 @@ +import { useContext } from 'react'; +// import logoDark from '../../images/logo_dark.svg'; +// import logo from '../../images/logo.svg'; + +import './Loader.scss'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; + +export const Loader: React.FC = () => { + const { theme } = useContext(GlobalContext); + + return ( +
+ {/* Logo*/} + +
+
+ ); +}; diff --git a/src/shared/Loader/index.ts b/src/shared/Loader/index.ts new file mode 100644 index 00000000000..d5ce981151f --- /dev/null +++ b/src/shared/Loader/index.ts @@ -0,0 +1 @@ +export * from './Loader'; diff --git a/src/shared/Menu/Menu.scss b/src/shared/Menu/Menu.scss new file mode 100644 index 00000000000..f73c51d9d46 --- /dev/null +++ b/src/shared/Menu/Menu.scss @@ -0,0 +1,69 @@ +@import '../../styles/main.scss'; + +.menu { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: fixed; + top: 48px; + bottom: 64px; + width: 100%; + background-color: var(--color-bg); + transform: translateX(-100%); + transition: + transform 0.3s ease, + opacity 0.3s ease; + opacity: 0; + z-index: 1; + pointer-events: none; +} + +.menu__list { + list-style: none; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; +} + +.menu__link { + position: relative; + font-family: Molt-Bold, sans-serif; + font-weight: 800; + font-size: 12px; + letter-spacing: 0.04em; + text-align: center; + text-transform: uppercase; + color: var(--color-gray-secondary); + text-decoration: none; + display: flex; + + &:hover { + color: var(--color-gray-primary); + } +} + +.menu__link::after { + content: ''; + position: absolute; + display: block; + height: 0; + width: 100%; + background-color: var(--color-gray-primary); + bottom: -8px; + left: 0; + transition: height 0.3s ease; + box-sizing: content-box; +} + +.menu__link:hover::after { + height: 1px; +} + +.menu--open { + transform: translateX(0); + opacity: 1; + pointer-events: all; +} diff --git a/src/shared/Menu/Menu.tsx b/src/shared/Menu/Menu.tsx new file mode 100644 index 00000000000..9e6ed2cd050 --- /dev/null +++ b/src/shared/Menu/Menu.tsx @@ -0,0 +1,40 @@ +import React, { useContext, useEffect } from 'react'; +import './Menu.scss'; +import { Link } from 'react-router-dom'; +import { GlobalContext } from '../../context/GlobalContext'; +import { navLinks } from '../../constants/navLinks'; + +export const Menu: React.FC = () => { + const { isMenuOpen, toggleMenu } = useContext(GlobalContext); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth > 640 && isMenuOpen) { + toggleMenu(); + } + }; + + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, [isMenuOpen, toggleMenu]); + + return ( + + ); +}; diff --git a/src/shared/Menu/index.ts b/src/shared/Menu/index.ts new file mode 100644 index 00000000000..629d3d0aa12 --- /dev/null +++ b/src/shared/Menu/index.ts @@ -0,0 +1 @@ +export * from './Menu'; diff --git a/src/shared/Pagination/Pagination.scss b/src/shared/Pagination/Pagination.scss new file mode 100644 index 00000000000..42be0b856fc --- /dev/null +++ b/src/shared/Pagination/Pagination.scss @@ -0,0 +1,87 @@ +@import '../../styles/main'; + +.pagination { + margin: 40px auto 80px; + height: 32px; + display: flex; + gap: 16px; + justify-content: center; + align-items: center; + margin-left: auto; + margin-right: auto; +} + +.pagination__button-container { + display: flex; + gap: 8px; +} + +.pagination__button-page, +.pagination__button { + padding: 0; + margin: 0; + position: relative; + width: 32px; + height: 32px; + border: 1px solid var(--color-gray-elements); + background-color: var(--color-bg); + box-sizing: border-box; + cursor: pointer; + color: var(--color-gray-primary); + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + display: flex; + justify-content: center; + align-items: center; + transition: + background-color 0.3s, + border-color 0.3s; +} + +body.theme_dark .pagination__button-page, +body.theme_dark .pagination__button { + border: none; + background-color: var(--color-surface-1); + color: var(--color-gray-primary); +} + +.pagination__button-page:not(.pagination__button-page--active):hover { + border-color: var(--color-gray-primary); +} + +body.theme_dark + .pagination__button-page:not(.pagination__button-page--active):hover { + background-color: var(--color-gray-elements); +} + +.pagination__button:not(.pagination__button--disabled):hover { + border-color: var(--color-gray-primary); +} + +body.theme_dark .pagination__button:not(.pagination__button--disabled):hover { + background-color: var(--color-gray-elements); +} + +.pagination__button-page--active { + background-color: var(--color-gray-primary); + color: var(--color-bg); +} + +body.theme_dark .pagination__button-page--active { + background-color: var(--color-accent); +} + +.pagination__button--disabled { + cursor: not-allowed; +} + +body.theme_dark .pagination__button--disabled { + background-color: var(--color-bg); + border: 1px solid var(--color-gray-elements); +} + +body.theme_dark p { + color: var(--color-gray-primary); + font-family: Mont-Regular, sans-serif; +} diff --git a/src/shared/Pagination/Pagination.tsx b/src/shared/Pagination/Pagination.tsx new file mode 100644 index 00000000000..9c868927325 --- /dev/null +++ b/src/shared/Pagination/Pagination.tsx @@ -0,0 +1,91 @@ +import { FC, useContext, useMemo } from 'react'; +import './Pagination.scss'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; +import classNames from 'classnames'; +import { GlobalContext } from '../../context/GlobalContext'; + +// Selected pages +const PAGE_LIMIT = 4; + +type Props = { + total: number; + perPage: number; + currentPage: number; + onPageChange: (page: number) => void; +}; + +export const Pagination: FC = ({ + total, + perPage, + currentPage, + onPageChange, +}) => { + const { theme } = useContext(GlobalContext); + + const totalPages = useMemo( + () => Math.ceil(total / perPage), + [perPage, total], + ); + + const [startPage, endPage] = useMemo(() => { + let start = Math.max(1, currentPage - 1); + let end = Math.min(totalPages, currentPage + 2); + + if (end - start + 1 < PAGE_LIMIT) { + if (start === 1) { + end = Math.min(totalPages, start + PAGE_LIMIT - 1); + } else { + start = Math.max(1, end - PAGE_LIMIT + 1); + } + } + + return [start, end]; + }, [currentPage, totalPages]); + + return ( +
+ +
+ {Array.from({ length: endPage - startPage + 1 }, (_, index) => ( + + ))} +
+ +

Total pages: {totalPages}

+
+ ); +}; diff --git a/src/shared/Pagination/index.ts b/src/shared/Pagination/index.ts new file mode 100644 index 00000000000..e016c96b72e --- /dev/null +++ b/src/shared/Pagination/index.ts @@ -0,0 +1 @@ +export * from './Pagination'; diff --git a/src/shared/ProductCard/ProductCard.scss b/src/shared/ProductCard/ProductCard.scss new file mode 100644 index 00000000000..0afcc8ff91b --- /dev/null +++ b/src/shared/ProductCard/ProductCard.scss @@ -0,0 +1,163 @@ +@import '../../utils/mixins.scss'; +@import '../../styles/main'; +@import '../../utils/variables'; + +.productCard { + &__container { + cursor: pointer; + text-decoration: none; + padding: 32px; + border: 1px solid var(--color-gray-elements); + display: flex; + flex-direction: column; + gap: 8px; + + @include hover(border-color, var(--color-gray-primary)); + + &-photo { + width: 148px; + height: 129px; + + @include on-tablet { + width: 173px; + height: 202px; + } + + @include on-desktop { + width: 208px; + height: 196px; + } + } + + &-title { + text-align: center; + height: 58px; + padding-top: 16px; + + } + + &-price { + display: flex; + justify-content: center; + gap: 8px; + font-size: 22px; + line-height: 31px; + } + + &-specifications { + display: flex; + flex-direction: column; + gap: 8px; + padding-top: 8px; + padding-bottom: 8px; + } + + &-buttons { + display: flex; + gap: 8px; + + } + } + + &__photo { + width: 100%; + height: 100%; + object-fit: contain; + } + + &__title { + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-primary); + font-size: 14px; + font-weight: 600; + } + + &__price { + &-regular { + font-family: Mont-Regular, sans-serif; + color: var(--color-gray-secondary); + font-weight: 500; + text-decoration-line: line-through; + } + + &-discount, + &-regular-without-discount { + font-family: Mont-Bold, sans-serif; + color: var(--color-gray-primary); + font-weight: 800; + } + } + + &__divider { + display: block; + height: 1px; + background-color: var(--color-gray-elements); + } + + &__block { + width: 100%; + height: 15px; + display: flex; + justify-content: space-between; + + font-family: Mont-SemiBold, sans-serif; + font-size: 12px; + font-weight: 600; + } + + &__info { + color: var(--color-gray-secondary); + } + + &__value { + color: var(--color-gray-primary); + } + + &__button { + padding: 11px 0; + border: none; + border-radius: 5px; + cursor: pointer; + font-family: Mont-Regular, sans-serif; + color: var(--color-bg); + font-size: 14px; + font-weight: 700; + line-height: 8px; + + &-card { + background-color: var(--color-gray-primary); + width: 100%; + + @include hover(box-shadow, 0 3px 13px 0 #17203166); + + &--active { + background-color: var(--color-bg); + color: var(--color-green); + border: 1px solid var(--color-gray-elements); + pointer-events: none; + + &:hover { + box-shadow: none; + border-color: inherit; + } + } + } + + &-favorites { + background-color: var(--color-bg); + width: 40px; + flex-shrink: 0; + border: 1px solid var(--color-gray-icons-placeholders); + border-radius: 5px; + @include hover(border-color, var(--color-gray-primary)); + + &--active { + border: 1px solid var(--color-gray-elements); + } + } + } +} + +.productCard:hover .productCard__container-photo { + transform: scale(1.05); +} diff --git a/src/shared/ProductCard/ProductCard.tsx b/src/shared/ProductCard/ProductCard.tsx new file mode 100644 index 00000000000..8db2050b8da --- /dev/null +++ b/src/shared/ProductCard/ProductCard.tsx @@ -0,0 +1,123 @@ +import './ProductCard.scss'; +import React, { FC, memo, useContext, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import classNames from 'classnames'; +import { Product } from '../../types/Product'; +import { GlobalContext } from '../../context/GlobalContext'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; + +type Props = { + product: Product; + displayType: 'fullPrice' | 'with-discount'; +}; + +export const ProductCard: FC = memo(({ product, displayType }) => { + const { cart, favorites, toggleFavorites, addToCart, theme } = + useContext(GlobalContext); + + const isInCart = useMemo( + () => cart.some(({ id }) => id === product.itemId), + [cart, product.itemId], + ); + const isFavorites = useMemo( + () => favorites.some(({ itemId }) => itemId === product.itemId), + [favorites, product.itemId], + ); + + return ( +
+ +
+ Product's photo +
+ +
+ {product.name} +
+ +
+ {displayType === 'fullPrice' && ( + + {`$${product.fullPrice}`} + + )} + + {displayType === 'with-discount' && ( + <> + + {`$${product.price}`} + + + {`$${product.fullPrice}`} + + + )} +
+ +
+ +
+
+ Screen + {product.screen} +
+
+ Capacity + {product.capacity} +
+
+ RAM + {product.ram} +
+
+ +
+ + +
+ +
+ ); +}); + +ProductCard.displayName = 'ProductCard'; diff --git a/src/shared/ProductCard/index.ts b/src/shared/ProductCard/index.ts new file mode 100644 index 00000000000..7ce031c3820 --- /dev/null +++ b/src/shared/ProductCard/index.ts @@ -0,0 +1 @@ +export * from './ProductCard'; diff --git a/src/shared/ProductsList/ProductsList.scss b/src/shared/ProductsList/ProductsList.scss new file mode 100644 index 00000000000..d64bc23a1e0 --- /dev/null +++ b/src/shared/ProductsList/ProductsList.scss @@ -0,0 +1,33 @@ +@import '../../styles/main'; + +.productsList { + margin-top: 24px; + gap: 40px 16px; + + @include page-grid; + + @media (max-width: 640px) { + .productItem { + grid-column: 1 / -1; + } + } + + @include on-tablet { + .productItem { + grid-column: span 6; + } + } + + @media (min-width: 768px) { + .productItem { + grid-column: span 4; + } + } + + @include on-desktop { + .productItem { + + grid-column: span 6 ; + } + } +} diff --git a/src/shared/ProductsList/ProductsList.tsx b/src/shared/ProductsList/ProductsList.tsx new file mode 100644 index 00000000000..749eb51e466 --- /dev/null +++ b/src/shared/ProductsList/ProductsList.tsx @@ -0,0 +1,18 @@ +import './ProductsList.scss'; +import { Product } from '../../types/Product'; +import { ProductCard } from '../ProductCard'; + +type Props = { + products: Product[]; + displayType: 'fullPrice' | 'with-discount'; +}; + +export const ProductsList: React.FC = ({ products, displayType }) => ( +
+ {products.map(product => ( +
+ +
+ ))} +
+); diff --git a/src/shared/ProductsList/index.ts b/src/shared/ProductsList/index.ts new file mode 100644 index 00000000000..09f9887f278 --- /dev/null +++ b/src/shared/ProductsList/index.ts @@ -0,0 +1 @@ +export * from './ProductsList'; diff --git a/src/shared/ProductsSlider/ProductsSlider.scss b/src/shared/ProductsSlider/ProductsSlider.scss new file mode 100644 index 00000000000..134d3fc214e --- /dev/null +++ b/src/shared/ProductsSlider/ProductsSlider.scss @@ -0,0 +1,114 @@ +@import '../../styles/main'; + +.productsSlider { + padding-left: 16px; + + @include on-desktop { + margin-block: 80px; + + @include content-padding-inline; + } + + &__container-top { + padding-right: 16px; + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24px; + gap: 72px; + } + + &__title { + font-size: 22px; + font-family: Mont-Bold, sans-serif; + font-weight: 800; + letter-spacing: -0.01em; + color: var(--color-gray-primary); + + @include on-tablet { + font-size: 32px; + } + } + + &__buttons { + display: flex; + gap: 16px; + } + + &__button { + width: 32px; + height: 32px; + border: 1px solid var(--color-gray-icons-placeholders); + background-color: var(--color-bg); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: + border 0.3s, + background-color 0.3s; + + &--disabled { + cursor: not-allowed; + border: 1px solid var(--color-gray-elements); + background-color: inherit; + + &:hover { + border: 1px solid var(--color-gray-elements); + } + } + } + + &__viewport { + overflow: hidden; + width: 100%; + + @include on-desktop { + width: 1136px; + } + } + + &__track { + display: flex; + gap: 16px; + transition: transform 0.5s ease-in-out; + } + + &__item { + flex: 0 0 auto; + + width: 212px; + height: 442px; + + @include on-tablet { + width: 237px; + height: 515px; + } + + @include on-desktop { + width: 272px; + height: 509px; + } + } +} + +body.theme_dark .productsSlider__button { + border: none; + background-color: var(--color-surface-2); +} + +.productsSlider__button:not(.productsSlider__button--disabled):hover { + border: 1px solid var(--color-gray-primary); + background-color: var(--color-hover); +} + +body.theme_dark + .productsSlider__button:not(.productsSlider__button--disabled):hover { + border: none; + background-color: var(--color-gray-icons-placeholders); +} + +body.theme_dark .productsSlider__button--disabled { + border: 1px solid var(--color-gray-elements); + background-color: inherit; +} diff --git a/src/shared/ProductsSlider/ProductsSlider.tsx b/src/shared/ProductsSlider/ProductsSlider.tsx new file mode 100644 index 00000000000..768f325fee3 --- /dev/null +++ b/src/shared/ProductsSlider/ProductsSlider.tsx @@ -0,0 +1,119 @@ +import './ProductsSlider.scss'; +import classNames from 'classnames'; +import { + useState, + useContext, + useMemo, + useCallback, + FC, + useEffect, +} from 'react'; +import { Product } from '../../types/Product'; +import { ProductCard } from '../ProductCard'; +import { Icon } from '../Icon'; +import { icons } from '../../constants/icons'; +import { GlobalContext } from '../../context/GlobalContext'; + +type Props = { + title: string; + products: Product[]; + displayType: 'fullPrice' | 'with-discount'; +}; + +export const ProductsSlider: FC = ({ title, products, displayType }) => { + const { theme } = useContext(GlobalContext); + const [cardWidth, setCardWidth] = useState(272); + const gap = 16; + const [currentIndex, setCurrentIndex] = useState(0); + + useEffect(() => { + const updateCardWidth = () => { + const screenWidth = window.innerWidth; + + if (screenWidth < 640) { + setCardWidth(212); + } else if (screenWidth < 1200) { + setCardWidth(237); + } else { + setCardWidth(272); + } + }; + + window.addEventListener('resize', updateCardWidth); + + return () => { + window.removeEventListener('resize', updateCardWidth); + }; + }, []); + + const maxIndex = useMemo(() => { + const maxCardsInTrack = 4; + + return products.length - maxCardsInTrack; + }, [products.length]); + + const handleNext = useCallback(() => { + if (currentIndex < maxIndex) { + setCurrentIndex(prev => prev + 1); + } + }, [currentIndex, maxIndex]); + + const handlePrev = useCallback(() => { + if (currentIndex > 0) { + setCurrentIndex(prev => prev - 1); + } + }, [currentIndex]); + + return ( +
+
+

{title}

+
+
+ {currentIndex === 0 ? ( + + ) : ( + + )} +
+
+ {currentIndex === maxIndex ? ( + + ) : ( + + )} +
+
+
+ +
+
+ {products.map(phone => ( +
+ +
+ ))} +
+
+
+ ); +}; diff --git a/src/shared/ProductsSlider/index.ts b/src/shared/ProductsSlider/index.ts new file mode 100644 index 00000000000..68d3ea00125 --- /dev/null +++ b/src/shared/ProductsSlider/index.ts @@ -0,0 +1 @@ +export * from './ProductsSlider'; diff --git a/src/styles/main.scss b/src/styles/main.scss new file mode 100644 index 00000000000..996d1353d51 --- /dev/null +++ b/src/styles/main.scss @@ -0,0 +1,3 @@ +@import '../utils/fonts'; +@import '../utils/mixins'; +@import '../utils/variables'; diff --git a/src/types/Cart.ts b/src/types/Cart.ts new file mode 100644 index 00000000000..796de569bde --- /dev/null +++ b/src/types/Cart.ts @@ -0,0 +1,7 @@ +import { Product } from './Product'; + +export type Cart = { + id: string; + quantity: number; + product: Product; +}; diff --git a/src/types/Product.ts b/src/types/Product.ts new file mode 100644 index 00000000000..89b5c2c38ea --- /dev/null +++ b/src/types/Product.ts @@ -0,0 +1,14 @@ +export type Product = { + id: number; + category: 'phones' | 'tablets' | 'accessories'; + itemId: string; + name: string; + fullPrice: number; + price: number; + screen: string; + capacity: string; + color: string; + ram: string; + year: number; + image: string; +}; diff --git a/src/types/ProductDetails.ts b/src/types/ProductDetails.ts new file mode 100644 index 00000000000..5712f3c5222 --- /dev/null +++ b/src/types/ProductDetails.ts @@ -0,0 +1,26 @@ +import { Colors } from '../constants/colors'; + +export type ProductDetails = { + id: string; + category: string; + namespaceId: string; + name: string; + capacityAvailable: string[]; + capacity: string; + priceRegular: number; + priceDiscount: number; + colorsAvailable: string[]; + color: keyof Colors; + images: string[]; + description: { + title: string; + text: string[]; + }[]; + screen: string; + resolution: string; + processor: string; + ram: string; + camera?: string; + zoom?: string; + cell: string[]; +}; diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 00000000000..f71d9e4bd8d --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,2 @@ +export type Theme = 'light' | 'dark'; +export type SearchParams = Record; diff --git a/src/utils/_fonts.scss b/src/utils/_fonts.scss new file mode 100644 index 00000000000..5467d1e1912 --- /dev/null +++ b/src/utils/_fonts.scss @@ -0,0 +1,17 @@ +@font-face { + font-family: Mont-Regular; + src: url('/fonts/Mont-Regular.otf'); + font-weight: normal; +} + +@font-face { + font-family: Mont-SemiBold; + src: url('/fonts/Mont-SemiBold.otf'); + font-weight: normal; +} + +@font-face { + font-family: Mont-Bold; + src: url('/fonts/Mont-Bold.otf'); + font-weight: normal; +} diff --git a/src/utils/_variables.scss b/src/utils/_variables.scss new file mode 100644 index 00000000000..b00d9b27eef --- /dev/null +++ b/src/utils/_variables.scss @@ -0,0 +1,32 @@ +$tablet-min-width: 640px; +$desktop-min-width: 1200px; + +body { + --color-bg: #fff; + --color-gray-primary: #313237; + --color-gray-secondary: #89939a; + --color-gray-icons-placeholders: #b4bdc3; + --color-gray-elements: #e2e6e9; + --color-green: #27ae60; + --color-red: #eb5757; + --color-hover: #fafbfc; +} + +body.theme_dark { + --color-gray-primary: #f1f2f9; + --color-gray-secondary: #75767f; + --color-bg: #0f1121; + --color-gray-icons-placeholders: #4a4d58; + --color-gray-elements: #3b3e4a; + --color-green: #27ae60; + --color-red: #eb5757; + --color-hover: #1cd97a; + --color-surface-1: #161827; + --color-surface-2: #323542; + --color-accent: #905bff; + --color-accent-hover: #a378ff; +} + +* { + box-sizing: border-box; +} diff --git a/src/utils/api.ts b/src/utils/api.ts new file mode 100644 index 00000000000..7dd7d019dc0 --- /dev/null +++ b/src/utils/api.ts @@ -0,0 +1,26 @@ +import { Product } from '../types/Product'; +import { ProductDetails } from '../types/ProductDetails'; + +async function fetchProducts(url: string): Promise { + const response = await fetch(url); + + if (!response.ok) { + const errorData = await response.json(); + + throw new Error( + `Error: ${response.statusText} - ${errorData.message || 'Unknown error'}`, + ); + } + + return response.json(); +} + +export function getAllProducts(): Promise { + return fetchProducts('./api/products.json'); +} + +export function getSpecificProducts( + productsType: string, +): Promise { + return fetchProducts(`./api/${productsType}.json`); +} diff --git a/src/utils/capitalize.ts b/src/utils/capitalize.ts new file mode 100644 index 00000000000..a372d687dfb --- /dev/null +++ b/src/utils/capitalize.ts @@ -0,0 +1,7 @@ +export function capitalize(str: string): string { + if (!str) { + return str; + } + + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/src/utils/getSearchWith.ts b/src/utils/getSearchWith.ts new file mode 100644 index 00000000000..cd2f1f52d6d --- /dev/null +++ b/src/utils/getSearchWith.ts @@ -0,0 +1,24 @@ +type Param = string | number; +type Params = { + [key: string]: Param[] | Param | null; +}; + +export function getSearchWith( + params: Params, + search?: URLSearchParams | string, +) { + const newParams = new URLSearchParams(search); + + for (const [key, value] of Object.entries(params)) { + if (value === null) { + newParams.delete(key); + } else if (Array.isArray(value)) { + newParams.delete(key); + value.forEach(item => newParams.append(key, item.toString())); + } else { + newParams.set(key, value.toString()); + } + } + + return newParams.toString(); +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 00000000000..e3f6a92a5a1 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1 @@ +export * from '../utils'; diff --git a/src/utils/mixins.scss b/src/utils/mixins.scss new file mode 100644 index 00000000000..4b90b8bc09e --- /dev/null +++ b/src/utils/mixins.scss @@ -0,0 +1,48 @@ +@mixin on-tablet { + @media (min-width: $tablet-min-width) { + @content; + } +} + +@mixin on-desktop { + @media (min-width: $desktop-min-width) { + @content; + } +} + +@mixin content-padding-inline() { + padding-inline: 16px; + max-width: 1136px; + + @include on-tablet { + padding-inline: 24px; + } + + @include on-desktop { + padding-inline: 0; + margin-inline: auto; + } +} + +@mixin hover($property, $toValue) { + transition: #{$property} 0.3s; + &:hover { + #{$property}: $toValue; + } +} + +@mixin page-grid { + --columns: 4; + + display: grid; + column-gap: 16px; + grid-template-columns: repeat(var(--columns), 1fr); + + @include on-tablet { + --columns: 12; + } + + @include on-desktop { + --columns: 24; + } +} diff --git a/src/utils/prepareProductList.ts b/src/utils/prepareProductList.ts new file mode 100644 index 00000000000..506bfe412b1 --- /dev/null +++ b/src/utils/prepareProductList.ts @@ -0,0 +1,25 @@ +import { Product } from '../types/Product'; + +export const prepareProductList = ( + products: Product[], + { sortBy, query }: { sortBy: string; query: string }, +): Product[] => { + let filteredProducts = [...products]; + + if (query) { + filteredProducts = filteredProducts.filter(product => + product.name.toLowerCase().includes(query.toLowerCase().trim()), + ); + } + + switch (sortBy) { + case 'Newest': + return filteredProducts.sort((a, b) => b.year - a.year); + case 'Alphabetically': + return filteredProducts.sort((a, b) => a.name.localeCompare(b.name)); + case 'Cheapest': + return filteredProducts.sort((a, b) => a.fullPrice - b.fullPrice); + default: + return filteredProducts; + } +}; diff --git a/src/utils/searchHelper.ts b/src/utils/searchHelper.ts new file mode 100644 index 00000000000..1542059a690 --- /dev/null +++ b/src/utils/searchHelper.ts @@ -0,0 +1,24 @@ +import { SearchParams } from '../types'; + +export function getSearchWith( + currentParams: URLSearchParams, + paramsToUpdate: SearchParams, +): string { + const newParams = new URLSearchParams(currentParams.toString()); + + Object.entries(paramsToUpdate).forEach(([key, value]) => { + if (value === null) { + newParams.delete(key); + } else if (Array.isArray(value)) { + newParams.delete(key); + + value.forEach(part => { + newParams.append(key, part); + }); + } else { + newParams.set(key, value); + } + }); + + return newParams.toString(); +} From 832232c0f81b8e5bf51a0d42d0127af3974dc420 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sat, 28 Jun 2025 09:24:54 +0200 Subject: [PATCH 02/11] add starting code --- cypress/integration/page.spec.js | 3 +- index.html | 5 +- package-lock.json | 1783 +++++++++++------ package.json | 10 +- src/Layout/Layout.scss | 2 +- src/components/CartItem/CartItem.scss | 14 +- .../PicturesSlider/PicturesSlider.scss | 18 +- .../PicturesSlider/PicturesSlider.tsx | 21 +- .../ShopByCategory/ShopByCategory.scss | 10 +- src/constants/icons.ts | 10 + src/hooks/useLocaleStorage.tsx | 5 +- src/icons/image 15.svg | 9 + src/images/image 15 (1).svg | 9 + src/images/image 15.png | Bin 0 -> 699 bytes src/pages/FavoritesPage/FavoritesPage.tsx | 4 +- src/pages/HomePage/HomePage.tsx | 6 +- .../ProductDetailsPage/ProductDetailsPage.tsx | 4 +- src/pages/ProductPage/index.ts | 1 - .../ProductsPage.scss} | 5 +- .../ProductsPage.tsx} | 26 +- src/pages/ProductsPage/index.ts | 1 + src/routes/lazyLoad.ts | 2 +- src/shared/Breadcrumbs/index.ts | 1 - src/shared/ButtonBack/index.ts | 2 +- src/shared/Filter/Filter.scss | 1 + src/shared/Footer/Footer.scss | 1 - src/shared/Header/Header.tsx | 51 +- .../Linkline.scss} | 2 +- .../Breadcrumbs.tsx => Linkline/Linkline.tsx} | 22 +- src/shared/Linkline/index.ts | 1 + src/shared/Loader/Loader.scss | 1 + src/shared/Loader/Loader.tsx | 17 +- src/shared/Menu/Menu.scss | 2 +- src/shared/ProductCard/ProductCard.scss | 3 +- src/shared/ProductsList/ProductsList.scss | 1 - 35 files changed, 1364 insertions(+), 689 deletions(-) create mode 100644 src/icons/image 15.svg create mode 100644 src/images/image 15 (1).svg create mode 100644 src/images/image 15.png delete mode 100644 src/pages/ProductPage/index.ts rename src/pages/{ProductPage/ProductPage.scss => ProductsPage/ProductsPage.scss} (96%) rename src/pages/{ProductPage/ProductPage.tsx => ProductsPage/ProductsPage.tsx} (89%) create mode 100644 src/pages/ProductsPage/index.ts delete mode 100644 src/shared/Breadcrumbs/index.ts rename src/shared/{Breadcrumbs/Breadcrumbs.scss => Linkline/Linkline.scss} (98%) rename src/shared/{Breadcrumbs/Breadcrumbs.tsx => Linkline/Linkline.tsx} (63%) create mode 100644 src/shared/Linkline/index.ts diff --git a/cypress/integration/page.spec.js b/cypress/integration/page.spec.js index fec9b5d414d..1ccd498ddff 100644 --- a/cypress/integration/page.spec.js +++ b/cypress/integration/page.spec.js @@ -4,6 +4,7 @@ describe('App', () => { }); it('should have h1', () => { - cy.get('h1').should('have.text', 'Product Catalog'); + // cy.get('h1').should('have.text', 'Product Catalog'); + cy.get('h1').should('have.text', 'Welcome to Nice Gadgets store!'); }); }); diff --git a/index.html b/index.html index 095fb3a4537..1775fea4e1c 100644 --- a/index.html +++ b/index.html @@ -3,10 +3,11 @@ - Vite + React + TS + + Nice Gadgets
- + diff --git a/package-lock.json b/package-lock.json index 836b9e63b46..eec6a5ca492 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,11 @@ "license": "GPL-3.0", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.2", + "@types/lodash": "^4.17.17", "bulma": "^1.0.1", "classnames": "^2.5.1", + "lodash": "^4.17.21", + "lodash.debounce": "^4.0.8", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.25.1", @@ -20,9 +23,10 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.1", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", + "@types/lodash.debounce": "^4.0.9", "@types/node": "^20.14.10", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", @@ -44,8 +48,8 @@ "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0", "prettier": "^3.3.2", - "sass": "^1.77.8", - "stylelint": "^16.7.0", + "sass": "^1.89.2", + "stylelint": "^16.21.0", "typescript": "^5.2.2", "vite": "^5.3.1" } @@ -55,6 +59,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -64,43 +69,47 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -120,34 +129,38 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.9.tgz", - "integrity": "sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.9", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -160,71 +173,35 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -234,99 +211,68 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.27.3" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -335,12 +281,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -350,12 +297,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -365,44 +313,41 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz", + "integrity": "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -411,14 +356,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -449,6 +394,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -471,6 +417,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -490,6 +437,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -513,6 +461,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -1012,10 +961,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1094,10 +1044,11 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1136,10 +1087,11 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1154,6 +1106,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1163,6 +1116,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1171,23 +1125,61 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@keyv/serialize/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@mate-academy/scripts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-1.8.5.tgz", - "integrity": "sha512-mHRY2FkuoYCf5U0ahIukkaRo5LSZsxrTSgMJheFoyf3VXsTvfM9OfWcZIDIDB521kdPrScHHnRp+JRNjCfUO5A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-2.1.1.tgz", + "integrity": "sha512-Tf97p/jZ/ZRsQSPGcZf2FpvxgUCl8DiUOsiDFHj7HBN8gMK0iZOBQEtyqcFsauVUAvPP8Ayo8cAiC12MMp45iQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/rest": "^17.11.2", "@types/get-port": "^4.2.0", @@ -1559,19 +1551,39 @@ } }, "node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, "node_modules/@octokit/graphql": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", @@ -1650,15 +1662,17 @@ } }, "node_modules/@octokit/request": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", - "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1666,18 +1680,57 @@ } }, "node_modules/@octokit/request-error": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz", - "integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, "node_modules/@octokit/rest": { "version": "17.11.2", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", @@ -1863,6 +1916,316 @@ "@octokit/openapi-types": "^22.2.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -1883,209 +2246,288 @@ "node": ">=14.0.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2168,10 +2610,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/get-port": { "version": "4.2.0", @@ -2189,6 +2632,22 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", + "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", + "license": "MIT" + }, + "node_modules/@types/lodash.debounce": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz", + "integrity": "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -2463,22 +2922,24 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", + "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "node_modules/acorn": { @@ -2564,23 +3025,12 @@ "node": ">=8" } }, - "node_modules/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/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, + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2963,6 +3413,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "peer": true, "engines": { "node": ">=8" }, @@ -2983,10 +3434,11 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3011,9 +3463,9 @@ "peer": true }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -3029,11 +3481,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3080,6 +3533,27 @@ "resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.1.tgz", "integrity": "sha512-+xv/BIAEQakHkR0QVz+s+RjNqfC53Mx9ZYexyaFNFo9wx5i76HXArNdwW7bccyJxa5mgV/T5DcVGqsAB19nBJQ==" }, + "node_modules/cacheable": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", + "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.8.2", + "keyv": "^5.3.3" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", + "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.3" + } + }, "node_modules/cachedir": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", @@ -3163,9 +3637,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "dev": true, "funding": [ { @@ -3180,7 +3654,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/caseless": { "version": "0.12.0", @@ -3188,20 +3663,6 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -3216,6 +3677,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3240,6 +3702,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -3331,21 +3794,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -3410,7 +3858,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.2", @@ -3463,10 +3912,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3477,10 +3927,11 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -3490,6 +3941,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "peer": true, "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -3751,12 +4203,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3904,6 +4357,20 @@ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", @@ -3966,10 +4433,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz", - "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", - "dev": true + "version": "1.5.173", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.173.tgz", + "integrity": "sha512-2bFhXP2zqSfQHugjqJIDFVwa+qIxyNApenmXTp9EjaKtdPrES5Qcn9/aSFy/NaP2E+fWG/zxKu/LBvY36p5VNQ==", + "dev": true, + "license": "ISC" }, "node_modules/email-addresses": { "version": "5.0.0", @@ -4240,10 +4708,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4489,10 +4958,11 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4571,10 +5041,11 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4668,10 +5139,11 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4771,10 +5243,11 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5021,6 +5494,24 @@ "node >=0.6.0" ] }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5034,16 +5525,17 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@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" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -5229,10 +5721,11 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", @@ -5348,6 +5841,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -5477,10 +5971,11 @@ } }, "node_modules/gh-pages/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5668,6 +6163,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5757,15 +6253,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -5839,6 +6326,13 @@ "he": "bin/he" } }, + "node_modules/hookified": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz", + "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -5937,10 +6431,11 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -6096,6 +6591,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6577,15 +7073,16 @@ "dev": true }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -6629,6 +7126,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -6703,10 +7201,11 @@ } }, "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { "version": "0.3.23", @@ -6800,7 +7299,13 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", @@ -7034,6 +7539,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -7101,7 +7607,8 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/meow": { "version": "13.2.0", @@ -7131,10 +7638,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7304,13 +7812,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -7381,10 +7882,11 @@ } }, "node_modules/mochawesome-merge/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7828,15 +8330,16 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -7844,6 +8347,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7876,6 +8380,14 @@ "path-to-regexp": "^1.7.0" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -7897,10 +8409,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -8277,10 +8790,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dev": true, + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -8313,10 +8827,11 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8434,9 +8949,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -8452,10 +8967,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -8468,15 +8984,16 @@ "dev": true }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -8492,6 +9009,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=18.0" }, @@ -8735,10 +9253,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8856,6 +9375,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -8914,11 +9434,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -9048,10 +9563,11 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9091,12 +9607,13 @@ } }, "node_modules/rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -9106,22 +9623,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, @@ -9219,13 +9740,14 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -9233,6 +9755,39 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/scheduler": { @@ -9454,10 +10009,11 @@ "dev": true }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -9737,9 +10293,9 @@ "peer": true }, "node_modules/stylelint": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz", - "integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "funding": [ { @@ -9751,45 +10307,45 @@ "url": "https://github.com/sponsors/stylelint" } ], + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/media-query-list-parser": "^2.1.13", - "@csstools/selector-specificity": "^3.1.1", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.5", - "fast-glob": "^3.3.2", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.1", + "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.1", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.34.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", - "micromatch": "^4.0.7", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.1", - "postcss": "^8.4.39", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.5", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.0.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", - "table": "^6.8.2", + "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { @@ -9799,16 +10355,94 @@ "node": ">=18.12.0" } }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -9817,78 +10451,97 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^5.0.0" + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.10" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz", + "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=18" + "cacheable": "^1.10.0", + "flatted": "^3.3.3", + "hookified": "^1.9.1" } }, - "node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/stylelint/node_modules/strip-ansi": { + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=4" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -9947,10 +10600,11 @@ } }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -10079,15 +10733,6 @@ "node": ">=14.14" } }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10390,9 +11035,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -10408,9 +11053,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -10488,14 +11134,15 @@ } }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -10514,6 +11161,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -10531,6 +11179,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -10674,10 +11325,11 @@ } }, "node_modules/windows-release/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -10901,7 +11553,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index ae251685c8b..8de60dbd7cd 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,11 @@ "license": "GPL-3.0", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.2", + "@types/lodash": "^4.17.17", "bulma": "^1.0.1", "classnames": "^2.5.1", + "lodash": "^4.17.21", + "lodash.debounce": "^4.0.8", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.25.1", @@ -16,9 +19,10 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.1", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", + "@types/lodash.debounce": "^4.0.9", "@types/node": "^20.14.10", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", @@ -40,8 +44,8 @@ "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0", "prettier": "^3.3.2", - "sass": "^1.77.8", - "stylelint": "^16.7.0", + "sass": "^1.89.2", + "stylelint": "^16.21.0", "typescript": "^5.2.2", "vite": "^5.3.1" }, diff --git a/src/Layout/Layout.scss b/src/Layout/Layout.scss index 7ad1ce27df8..fa6c5b292b8 100644 --- a/src/Layout/Layout.scss +++ b/src/Layout/Layout.scss @@ -22,7 +22,7 @@ .Layout__header { position: sticky; top: 0; - z-index: 10; + z-index: 1; } body.theme_dark { diff --git a/src/components/CartItem/CartItem.scss b/src/components/CartItem/CartItem.scss index 3dfe60ad11b..aef82d91a62 100644 --- a/src/components/CartItem/CartItem.scss +++ b/src/components/CartItem/CartItem.scss @@ -1,3 +1,6 @@ + +/* stylelint-disable */ + @import '../../styles/main'; .cartItem { @@ -115,19 +118,18 @@ body.theme_dark .cartItem__counter { color: var(--color-gray-primary); } + body.theme_dark .cartItem__button { background-color: var(--color-surface-2); border: none; - &--disabled { background-color: var(--color-bg); border: 1px solid var(--color-gray-elements); } - - &:not(.cartItem__button--disabled):hover { - background-color: var(--color-gray-elements); - border: none; - } + &:not(.cartItem__button--disabled):hover { + background-color: var(--color-gray-icons-placeholders); + border: none; + } } diff --git a/src/components/PicturesSlider/PicturesSlider.scss b/src/components/PicturesSlider/PicturesSlider.scss index f1afa9a3d67..aee5bb499af 100644 --- a/src/components/PicturesSlider/PicturesSlider.scss +++ b/src/components/PicturesSlider/PicturesSlider.scss @@ -1,9 +1,12 @@ -@import '../../styles/main.scss'; +@import '../../styles/main'; + p { font-family: Mont-Bold, sans-serif; color: #fff; } + + .picturesSlider { margin-bottom: 56px; @@ -60,11 +63,22 @@ p { &-title { font-family: Mont-Bold, sans-serif; color: #fff; - background-image: linear-gradient(90deg, #7c4af4, #d862ff); + background-image: linear-gradient(90deg, #7c4af4 30%, #d862ff 50%,#7c4af4 70%); + background-size: 400%; background-clip: text; -webkit-text-fill-color: transparent; font-size: 32px; line-height: 1; + animation: shimmer 1.5s infinite linear; + } + + @keyframes shimmer { + 0% { + background-position: 100% 100%; + } + 100% { + background-position: 0 0; + } } &-description { diff --git a/src/components/PicturesSlider/PicturesSlider.tsx b/src/components/PicturesSlider/PicturesSlider.tsx index fe4a974a6fd..ceace78fd6a 100644 --- a/src/components/PicturesSlider/PicturesSlider.tsx +++ b/src/components/PicturesSlider/PicturesSlider.tsx @@ -7,33 +7,24 @@ import { useCallback, } from 'react'; import './PicturesSlider.scss'; +import '../../../src/shared/Icon/Icon.scss'; import { Icon } from '../../shared/Icon'; import { icons } from '../../constants/icons'; import { GlobalContext } from '../../context/GlobalContext'; import { Link } from 'react-router-dom'; import { Product } from '../../types/Product'; + type Props = { allNewestProducts: Product[]; }; export const PicturesSlider: FC = ({ allNewestProducts }) => { const images = allNewestProducts.map(el => el.image); - /*const images = [ - 'img/phones/apple-iphone-14/midnight/00.webp', - 'img/phones/apple-iphone-14-pro/gold/00.webp', - 'img/phones/apple-iphone-xr/coral/00.webp', - ];*/ + const names = allNewestProducts.map(el => el.name); const imagesUrl: Record = allNewestProducts.map( el => el.category + '/' + el.itemId, ); - /*const imagesUrl: Record = { - //0: images[0].split('/', 4).join('/').slice(4), - 0: 'phones/apple-iphone-14-128gb-midnight', - 1: 'phones/apple-iphone-14-pro-128gb-gold', - 2: 'phones/apple-iphone-xr-128gb-coral', - };*/ - const [currentSlide, setCurrentSlide] = useState(0); const { theme } = useContext(GlobalContext); @@ -109,7 +100,9 @@ export const PicturesSlider: FC = ({ allNewestProducts }) => {
Now available
-
in our store!
+
+ in our store! +
@@ -159,8 +152,6 @@ export const PicturesSlider: FC = ({ allNewestProducts }) => { onClick={() => handleDotClick(index)} >
))} - - {/*split('/', 4).join('/').slice(4)*/}
); diff --git a/src/components/ShopByCategory/ShopByCategory.scss b/src/components/ShopByCategory/ShopByCategory.scss index d8715afbaec..88925ff7734 100644 --- a/src/components/ShopByCategory/ShopByCategory.scss +++ b/src/components/ShopByCategory/ShopByCategory.scss @@ -51,10 +51,12 @@ &__block { display: flex; flex-direction: column; - //justify-content: space-between; - //justify-items: end; + + // justify-content: space-between; + // justify-items: end; align-items:center; - //align-content: end; + + // align-content: end; &-image { display: block; @@ -62,6 +64,7 @@ height:400px; border: 0; transform: translate(10px, 5px); + @include hover(transform, scale(1.05)); @include on-tablet { @@ -80,7 +83,6 @@ } &-description { - font-family: Mont-Regular, sans-serif; color: var(--color-gray-secondary); font-size: 14px; diff --git a/src/constants/icons.ts b/src/constants/icons.ts index ad1ccc202b5..f8d724c8676 100644 --- a/src/constants/icons.ts +++ b/src/constants/icons.ts @@ -171,4 +171,14 @@ export const icons: Record = { path: '../../src/icons/MinusDarkDisabled.svg', }, }, + ok: { + light: { + title: 'ok', + path: '../../src/icons/image 15.svg', + }, + dark: { + title: 'ok', + path: '../../src/icons/image 15.svg', + }, + }, }; diff --git a/src/hooks/useLocaleStorage.tsx b/src/hooks/useLocaleStorage.tsx index bd5b0e7ed5b..7eb897ba588 100644 --- a/src/hooks/useLocaleStorage.tsx +++ b/src/hooks/useLocaleStorage.tsx @@ -10,8 +10,7 @@ export function useLocalStorage(key: string, initialValue: T) { return item ? (JSON.parse(item) as T) : initialValue; } catch (error) { localStorage.removeItem(key); - // eslint-disable-next-line no-console - console.warn(`Error reading localStorage key "${key}": ${error}`); + alert(`Error reading localStorage key "${key}": ${error}`); return initialValue; } @@ -21,7 +20,7 @@ export function useLocalStorage(key: string, initialValue: T) { try { localStorage.setItem(key, JSON.stringify(value)); } catch (error) { - throw new Error(`Error saving to localStorage key "${key}": ${error}`); + throw new Error(`Error saving localStorage key "${key}": ${error}`); } }, [key, value]); diff --git a/src/icons/image 15.svg b/src/icons/image 15.svg new file mode 100644 index 00000000000..605dc6a7867 --- /dev/null +++ b/src/icons/image 15.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/image 15 (1).svg b/src/images/image 15 (1).svg new file mode 100644 index 00000000000..605dc6a7867 --- /dev/null +++ b/src/images/image 15 (1).svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/image 15.png b/src/images/image 15.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f266229cf8265f27597c9a36f8c2d00323f3cf GIT binary patch literal 699 zcmV;s0!00ZP)C$Sy2;K((3K*^ zUrV){C{jUCkP>K&E%ujI(_f-aoERs`yS^D~NwKjP9`kwkoOAEF7ocEr-b613ksSQbE7G>==C=a3hX&BTk=Y>nUk04u_*+<(t*EJ=JbH=rU1Ep zd6yT8#duAQ>C=*}RPhYntrvb?N)WR$sq!6_g$EGhLO@ZfOx&eMgfE}LL}8%@10fM5z;Z;8@PCWeer%?u)d zocso3@8Us{cyh?Gt+8ebiO6mRM(VHKkInq;@!myuXV;nCk3@qJpvnv+lY;E>{4}+6 zzM7$2u&hj^C;XNhMST*tYqOn6Nv%ha7Xg(F7o?hdh?wUG!L!qRs%xK3b&tdzwgo*- zv6tWqM?S}AMj)}69@eV;JlGzxG+538ubv=hDf|Ma1#$Dk-Z>sIm$=pn3z)a@`*QX!QWf@|xkYD&LSPpH4E&DWL9-O0fFmRGAcaF0v3= zGh8)}G;cQy1YKz)g7%*;D<}#BS;}H2kxn>!VmnlU^%juycGvk@J(aD91>xgtZlW(N hJs { const { favorites } = useContext(GlobalContext); @@ -31,7 +31,7 @@ export const FavoritesPage: FC = () => { return (
- +

Favorites

diff --git a/src/pages/HomePage/HomePage.tsx b/src/pages/HomePage/HomePage.tsx index 61eadc4d6a9..a8fc55030c6 100644 --- a/src/pages/HomePage/HomePage.tsx +++ b/src/pages/HomePage/HomePage.tsx @@ -37,9 +37,9 @@ export const HomePage: FC = () => { ); newestProducts = [ - ...newestPhones.slice(0, 3), - ...newestTablets.slice(0, 3), - ...newestAccessories.slice(0, 3), + ...newestPhones.slice(0, 5), + ...newestTablets.slice(0, 5), + ...newestAccessories.slice(0, 5), ]; const hotPricesProducts = useMemo( diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx index 3e0abe193bf..1e4da0d005a 100644 --- a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -1,7 +1,7 @@ import './ProductDetailsPage.scss'; import { useContext, useState, useEffect, FC } from 'react'; import { Link, useLocation, useParams } from 'react-router-dom'; -import { Breadcrumbs } from '../../shared/Breadcrumbs'; +import { Linkline } from '../../shared/Linkline'; import { ProductDetails } from '../../types/ProductDetails'; import { ProductContentTop } from '../../components/ProductContentTop'; import { ProductContentBottom } from '../../components/ProductContentBottom'; @@ -127,7 +127,7 @@ export const ProductDetailsPage: FC = () => {
)}*/} - + diff --git a/src/pages/ProductPage/index.ts b/src/pages/ProductPage/index.ts deleted file mode 100644 index 875dce3d23c..00000000000 --- a/src/pages/ProductPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ProductPage'; diff --git a/src/pages/ProductPage/ProductPage.scss b/src/pages/ProductsPage/ProductsPage.scss similarity index 96% rename from src/pages/ProductPage/ProductPage.scss rename to src/pages/ProductsPage/ProductsPage.scss index 6a00189fe8e..6bfbfdd8089 100644 --- a/src/pages/ProductPage/ProductPage.scss +++ b/src/pages/ProductsPage/ProductsPage.scss @@ -1,4 +1,5 @@ @import '../../styles/main'; + .buttonUp { position: sticky; top: 70px; @@ -22,12 +23,12 @@ body.theme_dark .buttonUp { border: 1px solid var(--color-gray-icons-placeholders); -background-color: none;// var(--color-surface-2); +background-color: none; // var(--color-surface-2); @include hover(background-color, var(--color-gray-icons-placeholders)); } -.productPage { +.productsPage { @include content-padding-inline; &__title { diff --git a/src/pages/ProductPage/ProductPage.tsx b/src/pages/ProductsPage/ProductsPage.tsx similarity index 89% rename from src/pages/ProductPage/ProductPage.tsx rename to src/pages/ProductsPage/ProductsPage.tsx index 0bf352e5ceb..2b2f2ffbc14 100644 --- a/src/pages/ProductPage/ProductPage.tsx +++ b/src/pages/ProductsPage/ProductsPage.tsx @@ -1,4 +1,4 @@ -import './ProductPage.scss'; +import './ProductsPage.scss'; import { FC, useCallback, @@ -11,7 +11,7 @@ import { useLocation, useSearchParams } from 'react-router-dom'; import { Dropdown } from '../../shared/Dropdown'; import { Pagination } from '../../shared/Pagination'; import { GlobalContext } from '../../context/GlobalContext'; -import { Breadcrumbs } from '../../shared/Breadcrumbs'; +import { Linkline } from '../../shared/Linkline'; import { ProductsList } from '../../shared/ProductsList'; import { Loader } from '../../shared/Loader'; @@ -137,46 +137,46 @@ export const ProductPage: FC = ({ category }) => { } finally { setIsLoading(false); } - }, 500); + }, 1000); return () => clearTimeout(timer); }, [category, allProducts]); return ( -
+
{isLoading && } {!isLoading && error && ( -
+

Something went wrong. Please try again.

)} {!isLoading && !error && !visibleProducts.length && !queryParam ? ( -
+

There are no {category} yet.

) : null} {!isLoading && !error && !visibleProducts.length && queryParam ? ( -

{`There are no ${typeProduct} matching the query`}

+

{`There are no ${typeProduct} matching the query`}

) : null} {!isLoading && !error && visibleProducts.length ? ( <> - + -

+

{category && `${capitalize(category)} page`}

- + {`${countVisibleProducts} model${countVisibleProducts !== 1 ? 's' : ''}`} -
-
+
+
= ({ category }) => { onChange={handleSortChange} />
-
+
); export const LazyProductPage = lazy(() => - import('../pages/ProductPage').then(({ ProductPage }) => ({ + import('../pages/ProductsPage').then(({ ProductPage }) => ({ default: ProductPage, })), ); diff --git a/src/shared/Breadcrumbs/index.ts b/src/shared/Breadcrumbs/index.ts deleted file mode 100644 index ce977548b14..00000000000 --- a/src/shared/Breadcrumbs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Breadcrumbs'; diff --git a/src/shared/ButtonBack/index.ts b/src/shared/ButtonBack/index.ts index 5e81ee4635f..4a54f127f8e 100644 --- a/src/shared/ButtonBack/index.ts +++ b/src/shared/ButtonBack/index.ts @@ -1 +1 @@ -export * from './ButtonBack' +export * from './ButtonBack'; diff --git a/src/shared/Filter/Filter.scss b/src/shared/Filter/Filter.scss index 8e6c74d52c6..d9593f67993 100644 --- a/src/shared/Filter/Filter.scss +++ b/src/shared/Filter/Filter.scss @@ -15,6 +15,7 @@ height: 64px; } } + .header__search-wrapper { position: relative; display: flex; diff --git a/src/shared/Footer/Footer.scss b/src/shared/Footer/Footer.scss index 27b477f8ce1..362c5f7e772 100644 --- a/src/shared/Footer/Footer.scss +++ b/src/shared/Footer/Footer.scss @@ -76,7 +76,6 @@ } &__button { - cursor: pointer; width: 32px; height: 32px; diff --git a/src/shared/Header/Header.tsx b/src/shared/Header/Header.tsx index 9640dcbd90b..1f78a3340fa 100644 --- a/src/shared/Header/Header.tsx +++ b/src/shared/Header/Header.tsx @@ -1,20 +1,21 @@ import './Header.scss'; import classNames from 'classnames'; -import { useContext, useEffect, useMemo, FC, useCallback } from 'react'; -import { Link, NavLink, useLocation, useSearchParams } from 'react-router-dom'; +import { useContext, useMemo, FC } from 'react'; +import { Link, NavLink } from 'react-router-dom'; import { GlobalContext } from '../../context/GlobalContext'; import { icons } from '../../constants/icons'; import { Icon } from '../Icon'; import { navLinks } from '../../constants/navLinks'; // import debounce from 'lodash.debounce'; -import { getSearchWith } from '../../utils/getSearchWith'; +// import { getSearchWith } from '../../utils/getSearchWith'; import { Filter } from '../Filter'; -type Param = string | number; +/* type Param = string | number; type Params = { [key: string]: Param[] | Param | null; }; +*/ const getActiveItem = ({ isActive }: { isActive: boolean }) => classNames('header__item', { 'header__item--active': isActive }); @@ -26,26 +27,26 @@ export const Header: FC = () => { const { cart, favorites, toggleMenu, isMenuOpen, theme, toggleTheme } = useContext(GlobalContext); - const location = useLocation(); + // const location = useLocation(); //const [query, setQuery] = useState(''); //const [appliedQuery, setAppliedQuery] = useState(''); - const [searchParams, setSearchParams] = useSearchParams(); + // const [searchParams, setSearchParams] = useSearchParams(); //const [query, setQuery] = useState(''); - const query = searchParams.get('query') || ''; + // const query = searchParams.get('query') || ''; const totalQuantity = useMemo( () => cart.reduce((sum, item) => sum + item.quantity, 0), [cart], ); - const isShowSearch = useMemo( + /* const isShowSearch = useMemo( () => ['/phones', '/tablets', '/accessories', '/favorites'].includes( location.pathname, ), [location.pathname], - ); + ); */ - const clearInput = useCallback(() => { + /* const clearInput = useCallback(() => { //setQuery(''); setSearchParams(prevParams => { const newParams = new URLSearchParams(prevParams); @@ -55,8 +56,8 @@ export const Header: FC = () => { return newParams; }); }, [setSearchParams]); - - const setSearchWith = useCallback( +*/ + /* const setSearchWith = useCallback( (params: Params) => { //const newParams = new URLSearchParams(searchParams); const search = getSearchWith(params, searchParams); @@ -66,7 +67,7 @@ export const Header: FC = () => { }, [searchParams, setSearchParams], ); - +*/ /* const handleInputChange = useCallback( (event: ChangeEvent) => { @@ -107,11 +108,11 @@ export const Header: FC = () => { [setSearchWith], );*/ - useEffect(() => { + /*useEffect(() => { clearInput(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [location.pathname]); - +*/ return (
@@ -130,25 +131,7 @@ export const Header: FC = () => {
- {/* {isShowSearch && ( -
- - {query ? ( -
- -
- ) : ( - - )} -
- )} - */} +
diff --git a/src/shared/Breadcrumbs/Breadcrumbs.scss b/src/shared/Linkline/Linkline.scss similarity index 98% rename from src/shared/Breadcrumbs/Breadcrumbs.scss rename to src/shared/Linkline/Linkline.scss index 76f9bebc411..46225d7c841 100644 --- a/src/shared/Breadcrumbs/Breadcrumbs.scss +++ b/src/shared/Linkline/Linkline.scss @@ -1,6 +1,6 @@ @import '../../styles/main'; -.breadcrumbs { +.linkline { &__item { font-family: Mont-SemiBold, sans-serif; font-size: 12px; diff --git a/src/shared/Breadcrumbs/Breadcrumbs.tsx b/src/shared/Linkline/Linkline.tsx similarity index 63% rename from src/shared/Breadcrumbs/Breadcrumbs.tsx rename to src/shared/Linkline/Linkline.tsx index d0a8009c404..73734b12e65 100644 --- a/src/shared/Breadcrumbs/Breadcrumbs.tsx +++ b/src/shared/Linkline/Linkline.tsx @@ -1,7 +1,7 @@ -import './Breadcrumbs.scss'; +import './Linkline.scss'; import { FC, useContext, useMemo } from 'react'; import { Link } from 'react-router-dom'; -import { Icon } from '../../shared/Icon'; +import { Icon } from '../Icon'; import { icons } from '../../constants/icons'; import { GlobalContext } from '../../context/GlobalContext'; import { capitalize } from '../../utils/capitalize'; @@ -11,7 +11,7 @@ type Props = { productName?: string; }; -export const Breadcrumbs: FC = ({ productType, productName }) => { +export const Linkline: FC = ({ productType, productName }) => { const { theme } = useContext(GlobalContext); const normalizeProductsType = useMemo( @@ -20,34 +20,34 @@ export const Breadcrumbs: FC = ({ productType, productName }) => { ); return ( -
-
+
+
- + {productName ? ( <> - + {normalizeProductsType} - + - {productName} + {productName} ) : ( - {normalizeProductsType} + {normalizeProductsType} )}
diff --git a/src/shared/Linkline/index.ts b/src/shared/Linkline/index.ts new file mode 100644 index 00000000000..91209d7f90c --- /dev/null +++ b/src/shared/Linkline/index.ts @@ -0,0 +1 @@ +export * from './Linkline'; diff --git a/src/shared/Loader/Loader.scss b/src/shared/Loader/Loader.scss index 7411961d05f..c32cb8a8492 100644 --- a/src/shared/Loader/Loader.scss +++ b/src/shared/Loader/Loader.scss @@ -1,3 +1,4 @@ + .loader { position: absolute; top: 50%; diff --git a/src/shared/Loader/Loader.tsx b/src/shared/Loader/Loader.tsx index 6fa0657c9c6..e5d856733db 100644 --- a/src/shared/Loader/Loader.tsx +++ b/src/shared/Loader/Loader.tsx @@ -1,6 +1,4 @@ import { useContext } from 'react'; -// import logoDark from '../../images/logo_dark.svg'; -// import logo from '../../images/logo.svg'; import './Loader.scss'; import { GlobalContext } from '../../context/GlobalContext'; @@ -11,14 +9,11 @@ export const Loader: React.FC = () => { const { theme } = useContext(GlobalContext); return ( -
- {/* Logo*/} - -
-
+ <> +
+ +
+
+ ); }; diff --git a/src/shared/Menu/Menu.scss b/src/shared/Menu/Menu.scss index f73c51d9d46..22ef11eb269 100644 --- a/src/shared/Menu/Menu.scss +++ b/src/shared/Menu/Menu.scss @@ -1,4 +1,4 @@ -@import '../../styles/main.scss'; +@import '../../styles/main'; .menu { display: flex; diff --git a/src/shared/ProductCard/ProductCard.scss b/src/shared/ProductCard/ProductCard.scss index 0afcc8ff91b..2bf6f56eb35 100644 --- a/src/shared/ProductCard/ProductCard.scss +++ b/src/shared/ProductCard/ProductCard.scss @@ -1,4 +1,4 @@ -@import '../../utils/mixins.scss'; +@import '../../utils/mixins'; @import '../../styles/main'; @import '../../utils/variables'; @@ -149,6 +149,7 @@ flex-shrink: 0; border: 1px solid var(--color-gray-icons-placeholders); border-radius: 5px; + @include hover(border-color, var(--color-gray-primary)); &--active { diff --git a/src/shared/ProductsList/ProductsList.scss b/src/shared/ProductsList/ProductsList.scss index d64bc23a1e0..3b51c7fc6d5 100644 --- a/src/shared/ProductsList/ProductsList.scss +++ b/src/shared/ProductsList/ProductsList.scss @@ -26,7 +26,6 @@ @include on-desktop { .productItem { - grid-column: span 6 ; } } From 4fdc759965eaf48029f4d0a9089fb9d425134c3c Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sun, 29 Jun 2025 14:36:39 +0200 Subject: [PATCH 03/11] copy3 --- public/icons/Close.svg | 3 +++ public/icons/Home.svg | 4 ++++ public/icons/Menu.svg | 5 ++++ public/icons/Minus.svg | 3 +++ public/icons/MinusDarkDisabled.svg | 3 +++ public/icons/Plus.svg | 3 +++ public/icons/PlusDark.png | Bin 0 -> 229 bytes public/icons/PlusDark.svg | 3 +++ public/icons/Union.svg | 3 +++ public/icons/arrow_down_dark.svg | 3 +++ public/icons/arrow_left.svg | 3 +++ public/icons/arrow_left__disabled.svg | 3 +++ public/icons/arrow_left_dark.svg | 3 +++ public/icons/arrow_left_dark__disabled.svg | 3 +++ public/icons/arrow_right.svg | 3 +++ public/icons/arrow_right__disabled.svg | 3 +++ public/icons/arrow_right_dark.svg | 3 +++ public/icons/arrow_right_dark__disabled.svg | 3 +++ public/icons/close__disabled.svg | 3 +++ public/icons/close_dark.svg | 3 +++ public/icons/favorites.svg | 3 +++ public/icons/favorites__filled.svg | 3 +++ public/icons/favorites_dark.svg | 3 +++ public/icons/home_dark.svg | 4 ++++ public/icons/image 15.svg | 9 +++++++ {src/images => public/icons}/logo.svg | 0 {src/images => public/icons}/logo_dark.svg | 0 public/icons/menu_dark.svg | 5 ++++ public/icons/minus__disabled.svg | 3 +++ public/icons/minus_dark.svg | 3 +++ public/icons/minus_dark__disabled.svg | 4 ++++ public/icons/plus_dark.svg | 4 ++++ public/icons/plus_dark1.png | 0 public/icons/search.svg | 3 +++ public/icons/search_dark.svg | 3 +++ public/icons/shopping_cart.svg | 5 ++++ public/icons/shopping_cart_dark.svg | 5 ++++ src/App.tsx | 6 ----- src/constants/icons.ts | 4 ++-- src/icons/logo.svg | 25 ++++++++++++++++++++ src/icons/logo_dark.svg | 25 ++++++++++++++++++++ src/vite-env.d.ts | 2 +- 42 files changed, 170 insertions(+), 9 deletions(-) create mode 100644 public/icons/Close.svg create mode 100644 public/icons/Home.svg create mode 100644 public/icons/Menu.svg create mode 100644 public/icons/Minus.svg create mode 100644 public/icons/MinusDarkDisabled.svg create mode 100644 public/icons/Plus.svg create mode 100644 public/icons/PlusDark.png create mode 100644 public/icons/PlusDark.svg create mode 100644 public/icons/Union.svg create mode 100644 public/icons/arrow_down_dark.svg create mode 100644 public/icons/arrow_left.svg create mode 100644 public/icons/arrow_left__disabled.svg create mode 100644 public/icons/arrow_left_dark.svg create mode 100644 public/icons/arrow_left_dark__disabled.svg create mode 100644 public/icons/arrow_right.svg create mode 100644 public/icons/arrow_right__disabled.svg create mode 100644 public/icons/arrow_right_dark.svg create mode 100644 public/icons/arrow_right_dark__disabled.svg create mode 100644 public/icons/close__disabled.svg create mode 100644 public/icons/close_dark.svg create mode 100644 public/icons/favorites.svg create mode 100644 public/icons/favorites__filled.svg create mode 100644 public/icons/favorites_dark.svg create mode 100644 public/icons/home_dark.svg create mode 100644 public/icons/image 15.svg rename {src/images => public/icons}/logo.svg (100%) rename {src/images => public/icons}/logo_dark.svg (100%) create mode 100644 public/icons/menu_dark.svg create mode 100644 public/icons/minus__disabled.svg create mode 100644 public/icons/minus_dark.svg create mode 100644 public/icons/minus_dark__disabled.svg create mode 100644 public/icons/plus_dark.svg create mode 100644 public/icons/plus_dark1.png create mode 100644 public/icons/search.svg create mode 100644 public/icons/search_dark.svg create mode 100644 public/icons/shopping_cart.svg create mode 100644 public/icons/shopping_cart_dark.svg create mode 100644 src/icons/logo.svg create mode 100644 src/icons/logo_dark.svg diff --git a/public/icons/Close.svg b/public/icons/Close.svg new file mode 100644 index 00000000000..aadcc91fb1f --- /dev/null +++ b/public/icons/Close.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Home.svg b/public/icons/Home.svg new file mode 100644 index 00000000000..474476cb027 --- /dev/null +++ b/public/icons/Home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/Menu.svg b/public/icons/Menu.svg new file mode 100644 index 00000000000..2c535f4586b --- /dev/null +++ b/public/icons/Menu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/Minus.svg b/public/icons/Minus.svg new file mode 100644 index 00000000000..97c41038ac7 --- /dev/null +++ b/public/icons/Minus.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/MinusDarkDisabled.svg b/public/icons/MinusDarkDisabled.svg new file mode 100644 index 00000000000..8c83f33c1a0 --- /dev/null +++ b/public/icons/MinusDarkDisabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Plus.svg b/public/icons/Plus.svg new file mode 100644 index 00000000000..ab3c34061b5 --- /dev/null +++ b/public/icons/Plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/PlusDark.png b/public/icons/PlusDark.png new file mode 100644 index 0000000000000000000000000000000000000000..ff63737c4c9d3e133e071b74c7446d41d3073401 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBewC+-V@L(#-AQLT8w_|_?ua69aGwucP*GO#bE!cU-v#ude1(= zxh2)`*sL8d9gTe~DWM4f#70z# literal 0 HcmV?d00001 diff --git a/public/icons/PlusDark.svg b/public/icons/PlusDark.svg new file mode 100644 index 00000000000..261391440ac --- /dev/null +++ b/public/icons/PlusDark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Union.svg b/public/icons/Union.svg new file mode 100644 index 00000000000..e92846042b8 --- /dev/null +++ b/public/icons/Union.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_down_dark.svg b/public/icons/arrow_down_dark.svg new file mode 100644 index 00000000000..63aabd66391 --- /dev/null +++ b/public/icons/arrow_down_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_left.svg b/public/icons/arrow_left.svg new file mode 100644 index 00000000000..ac494c7a55e --- /dev/null +++ b/public/icons/arrow_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_left__disabled.svg b/public/icons/arrow_left__disabled.svg new file mode 100644 index 00000000000..5093d9b94dd --- /dev/null +++ b/public/icons/arrow_left__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_left_dark.svg b/public/icons/arrow_left_dark.svg new file mode 100644 index 00000000000..e2016da355b --- /dev/null +++ b/public/icons/arrow_left_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_left_dark__disabled.svg b/public/icons/arrow_left_dark__disabled.svg new file mode 100644 index 00000000000..983c07a6c3b --- /dev/null +++ b/public/icons/arrow_left_dark__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_right.svg b/public/icons/arrow_right.svg new file mode 100644 index 00000000000..b4f46876718 --- /dev/null +++ b/public/icons/arrow_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_right__disabled.svg b/public/icons/arrow_right__disabled.svg new file mode 100644 index 00000000000..a15457b9ad6 --- /dev/null +++ b/public/icons/arrow_right__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_right_dark.svg b/public/icons/arrow_right_dark.svg new file mode 100644 index 00000000000..3609b14bd62 --- /dev/null +++ b/public/icons/arrow_right_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/arrow_right_dark__disabled.svg b/public/icons/arrow_right_dark__disabled.svg new file mode 100644 index 00000000000..6e938ce2452 --- /dev/null +++ b/public/icons/arrow_right_dark__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/close__disabled.svg b/public/icons/close__disabled.svg new file mode 100644 index 00000000000..61e7a408321 --- /dev/null +++ b/public/icons/close__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/close_dark.svg b/public/icons/close_dark.svg new file mode 100644 index 00000000000..925e5fce497 --- /dev/null +++ b/public/icons/close_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/favorites.svg b/public/icons/favorites.svg new file mode 100644 index 00000000000..ca57cfedd8a --- /dev/null +++ b/public/icons/favorites.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/favorites__filled.svg b/public/icons/favorites__filled.svg new file mode 100644 index 00000000000..c0a8e3d8b5b --- /dev/null +++ b/public/icons/favorites__filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/favorites_dark.svg b/public/icons/favorites_dark.svg new file mode 100644 index 00000000000..8fb5abef51d --- /dev/null +++ b/public/icons/favorites_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/home_dark.svg b/public/icons/home_dark.svg new file mode 100644 index 00000000000..e16ca7d7943 --- /dev/null +++ b/public/icons/home_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/image 15.svg b/public/icons/image 15.svg new file mode 100644 index 00000000000..605dc6a7867 --- /dev/null +++ b/public/icons/image 15.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/logo.svg b/public/icons/logo.svg similarity index 100% rename from src/images/logo.svg rename to public/icons/logo.svg diff --git a/src/images/logo_dark.svg b/public/icons/logo_dark.svg similarity index 100% rename from src/images/logo_dark.svg rename to public/icons/logo_dark.svg diff --git a/public/icons/menu_dark.svg b/public/icons/menu_dark.svg new file mode 100644 index 00000000000..c8c52c08a95 --- /dev/null +++ b/public/icons/menu_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/minus__disabled.svg b/public/icons/minus__disabled.svg new file mode 100644 index 00000000000..762e04664ee --- /dev/null +++ b/public/icons/minus__disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/minus_dark.svg b/public/icons/minus_dark.svg new file mode 100644 index 00000000000..7ca53e577aa --- /dev/null +++ b/public/icons/minus_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/minus_dark__disabled.svg b/public/icons/minus_dark__disabled.svg new file mode 100644 index 00000000000..a89c12e2a17 --- /dev/null +++ b/public/icons/minus_dark__disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/plus_dark.svg b/public/icons/plus_dark.svg new file mode 100644 index 00000000000..a1506bb27d0 --- /dev/null +++ b/public/icons/plus_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/plus_dark1.png b/public/icons/plus_dark1.png new file mode 100644 index 00000000000..e69de29bb2d diff --git a/public/icons/search.svg b/public/icons/search.svg new file mode 100644 index 00000000000..801f11a5482 --- /dev/null +++ b/public/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/search_dark.svg b/public/icons/search_dark.svg new file mode 100644 index 00000000000..56a317c46f9 --- /dev/null +++ b/public/icons/search_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/shopping_cart.svg b/public/icons/shopping_cart.svg new file mode 100644 index 00000000000..4b8ebce70e6 --- /dev/null +++ b/public/icons/shopping_cart.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/shopping_cart_dark.svg b/public/icons/shopping_cart_dark.svg new file mode 100644 index 00000000000..425ee639766 --- /dev/null +++ b/public/icons/shopping_cart_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/App.tsx b/src/App.tsx index 39f2a16ed8d..3694b3bf8b0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,6 @@ -// import './App.scss'; import { AppRoutes } from './routes'; import { GlobalProvider } from './context/GlobalContext'; -/*export const App = () => ( -
-

Product Catalog

-
-);*/ export const App = () => { return ( diff --git a/src/constants/icons.ts b/src/constants/icons.ts index f8d724c8676..58cfd6b3e9e 100644 --- a/src/constants/icons.ts +++ b/src/constants/icons.ts @@ -3,11 +3,11 @@ export const icons: Record = { logo: { light: { title: 'Logo icon', - path: '../../src/images/logo.svg', + path: '/icons/logo.svg', }, dark: { title: 'Logo dark icon', - path: '../../src/images/logo_dark.svg', + path: '/icons/logo_dark.svg', }, }, close: { diff --git a/src/icons/logo.svg b/src/icons/logo.svg new file mode 100644 index 00000000000..44e264fcc9e --- /dev/null +++ b/src/icons/logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/logo_dark.svg b/src/icons/logo_dark.svg new file mode 100644 index 00000000000..d59f941639c --- /dev/null +++ b/src/icons/logo_dark.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 11f02fe2a00..e38e5224b9b 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1 +1 @@ -/// +// From 3f4fa62ee65dfd22fef569acd2100615d40dc416 Mon Sep 17 00:00:00 2001 From: Serhii Semennikov <132490901+SerhiiSemennikov@users.noreply.github.com> Date: Sun, 29 Jun 2025 14:50:11 +0200 Subject: [PATCH 04/11] Create static.yml --- .github/workflows/static.yml | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 00000000000..f2c9e97c91d --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: '.' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From f4fb13028f43af993be14bd84df7daf8e766cb93 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sun, 29 Jun 2025 15:11:26 +0200 Subject: [PATCH 05/11] copy4 --- public/assets/ButtonBack-DRk2FjGf.js | 1 + public/assets/ButtonBack-w6P-UJJ0.css | 1 + public/assets/Linkline-BVE7q3mI.js | 1 + public/assets/Linkline-B_ez10jd.css | 1 + public/assets/Loader-CdfK6LLs.js | 1 + public/assets/Loader-DU6sTv_g.css | 1 + public/assets/ProductCard-CtH8lf1i.css | 1 + public/assets/ProductCard-n_G8EIMu.js | 1 + public/assets/ProductsList-Bz-DDO8l.css | 1 + public/assets/ProductsList-C8WnN_nq.js | 1 + public/assets/ProductsSlider-CAHW4_99.css | 1 + public/assets/ProductsSlider-CeN1XtqL.js | 1 + public/assets/favicon-DR5FOLsX.svg | 9 +++ public/assets/index--M-vjEFs.js | 1 + public/assets/index-80CrQ2vW.css | 1 + public/assets/index-BD-w6JY5.css | 1 + public/assets/index-BV-oWgkF.css | 1 + public/assets/index-C4ngy4_v.js | 1 + public/assets/index-C5E6A8ui.js | 1 + public/assets/index-C9RfMEqD.css | 1 + public/assets/index-CDfWgnoX.js | 1 + public/assets/index-CS6BVxGO.css | 1 + public/assets/index-D68rl43-.js | 1 + public/assets/index-DZGfIgcM.js | 4 ++ public/assets/index-DZu0jUOh.js | 72 +++++++++++++++++++++++ public/assets/index-DlB5k-ir.css | 1 + public/assets/index-urnOVSjv.css | 1 + src/constants/icons.ts | 69 +++++++++++----------- 28 files changed, 144 insertions(+), 34 deletions(-) create mode 100644 public/assets/ButtonBack-DRk2FjGf.js create mode 100644 public/assets/ButtonBack-w6P-UJJ0.css create mode 100644 public/assets/Linkline-BVE7q3mI.js create mode 100644 public/assets/Linkline-B_ez10jd.css create mode 100644 public/assets/Loader-CdfK6LLs.js create mode 100644 public/assets/Loader-DU6sTv_g.css create mode 100644 public/assets/ProductCard-CtH8lf1i.css create mode 100644 public/assets/ProductCard-n_G8EIMu.js create mode 100644 public/assets/ProductsList-Bz-DDO8l.css create mode 100644 public/assets/ProductsList-C8WnN_nq.js create mode 100644 public/assets/ProductsSlider-CAHW4_99.css create mode 100644 public/assets/ProductsSlider-CeN1XtqL.js create mode 100644 public/assets/favicon-DR5FOLsX.svg create mode 100644 public/assets/index--M-vjEFs.js create mode 100644 public/assets/index-80CrQ2vW.css create mode 100644 public/assets/index-BD-w6JY5.css create mode 100644 public/assets/index-BV-oWgkF.css create mode 100644 public/assets/index-C4ngy4_v.js create mode 100644 public/assets/index-C5E6A8ui.js create mode 100644 public/assets/index-C9RfMEqD.css create mode 100644 public/assets/index-CDfWgnoX.js create mode 100644 public/assets/index-CS6BVxGO.css create mode 100644 public/assets/index-D68rl43-.js create mode 100644 public/assets/index-DZGfIgcM.js create mode 100644 public/assets/index-DZu0jUOh.js create mode 100644 public/assets/index-DlB5k-ir.css create mode 100644 public/assets/index-urnOVSjv.css diff --git a/public/assets/ButtonBack-DRk2FjGf.js b/public/assets/ButtonBack-DRk2FjGf.js new file mode 100644 index 00000000000..4ce617bf918 --- /dev/null +++ b/public/assets/ButtonBack-DRk2FjGf.js @@ -0,0 +1 @@ +import{r as a,G as n,d as c,j as t,I as i,i as r}from"./index-DZu0jUOh.js";const x=()=>{const{theme:e}=a.useContext(n),s=c(),o=a.useCallback(()=>{s(-1)},[s]);return t.jsxs("div",{className:"button",onClick:o,children:[t.jsx(i,{icon:r.arrow_left[e]}),t.jsx("div",{className:"button-title",children:"Back"})]})};export{x as B}; diff --git a/public/assets/ButtonBack-w6P-UJJ0.css b/public/assets/ButtonBack-w6P-UJJ0.css new file mode 100644 index 00000000000..e2171a84bbe --- /dev/null +++ b/public/assets/ButtonBack-w6P-UJJ0.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.button{margin-block:24px 16px;background-color:var(--color-bg);display:flex;align-items:center;gap:4px;cursor:pointer}@media (min-width: 640px){.button{margin-top:40px}}.button-title{font-family:Mont-SemiBold,sans-serif;font-size:12px;line-height:13px;font-weight:700;color:var(--color-gray-primary)} diff --git a/public/assets/Linkline-BVE7q3mI.js b/public/assets/Linkline-BVE7q3mI.js new file mode 100644 index 00000000000..929f36bdc4e --- /dev/null +++ b/public/assets/Linkline-BVE7q3mI.js @@ -0,0 +1 @@ +import{r as c,G as o,j as e,I as s,i as a,L as t}from"./index-DZu0jUOh.js";function _(i){return i&&i.charAt(0).toUpperCase()+i.slice(1)}const x=({productType:i,productName:l})=>{const{theme:n}=c.useContext(o),r=c.useMemo(()=>_(i),[i]);return e.jsx("div",{className:"linkline",children:e.jsxs("div",{className:"linkline__container",children:[e.jsx("a",{href:"/",className:"linkline__link-home","aria-label":"Go to home page",children:e.jsx(s,{icon:a.home[n]})}),e.jsx("span",{className:"linkline__arrow",children:e.jsx(s,{icon:a.arrow_right__disabled[n]})}),l?e.jsxs(e.Fragment,{children:[e.jsx(t,{to:`/${i}`,children:e.jsx("span",{className:"linkline__item linkline__item--dark",children:r})}),e.jsx("span",{className:"linkline__arrow",children:e.jsx(s,{icon:a.arrow_right__disabled[n]})}),e.jsx("span",{className:"linkline__item",children:l})]}):e.jsx("span",{className:"linkline__item",children:r})]})})};export{x as L,_ as c}; diff --git a/public/assets/Linkline-B_ez10jd.css b/public/assets/Linkline-B_ez10jd.css new file mode 100644 index 00000000000..4569ca27a14 --- /dev/null +++ b/public/assets/Linkline-B_ez10jd.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.linkline__item{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600;color:var(--color-gray-secondary);display:inline-block;vertical-align:middle;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:100%}.linkline__item--dark{text-decoration:none;color:var(--color-gray-primary)}.linkline__link-home,.linkline__arrow{display:flex;align-items:center;justify-content:center}.linkline__container{height:16px;margin-block:24px;display:flex;align-items:center;gap:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media (min-width: 640px){.linkline__container{margin-bottom:40px}} diff --git a/public/assets/Loader-CdfK6LLs.js b/public/assets/Loader-CdfK6LLs.js new file mode 100644 index 00000000000..4d3d3c3a03a --- /dev/null +++ b/public/assets/Loader-CdfK6LLs.js @@ -0,0 +1 @@ +import{r as e,G as t,j as s,I as a,i as r}from"./index-DZu0jUOh.js";const c=()=>{const{theme:o}=e.useContext(t);return s.jsx(s.Fragment,{children:s.jsxs("div",{className:"loader",children:[s.jsx(a,{icon:r.logo[o]}),s.jsx("div",{className:"loader__content"})]})})};export{c as L}; diff --git a/public/assets/Loader-DU6sTv_g.css b/public/assets/Loader-DU6sTv_g.css new file mode 100644 index 00000000000..70fae6fea0f --- /dev/null +++ b/public/assets/Loader-DU6sTv_g.css @@ -0,0 +1 @@ +.loader{position:absolute;top:50%;left:50%;transform:translate(-75px,-75px)}.loader__content{border-radius:50%;width:2em;height:2em;margin:1em auto;border:.3em solid #ddd;border-left-color:#000;animation:load8 1.2s infinite linear}.loader__image{width:150px;height:150px}@keyframes load8{0%{transform:rotate(0)}to{transform:rotate(360deg)}} diff --git a/public/assets/ProductCard-CtH8lf1i.css b/public/assets/ProductCard-CtH8lf1i.css new file mode 100644 index 00000000000..d875cb37c4f --- /dev/null +++ b/public/assets/ProductCard-CtH8lf1i.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productCard__container{cursor:pointer;text-decoration:none;padding:32px;border:1px solid var(--color-gray-elements);display:flex;flex-direction:column;gap:8px;transition:border-color .3s}.productCard__container:hover{border-color:var(--color-gray-primary)}.productCard__container-photo{width:148px;height:129px}@media (min-width: 640px){.productCard__container-photo{width:173px;height:202px}}@media (min-width: 1200px){.productCard__container-photo{width:208px;height:196px}}.productCard__container-title{text-align:center;height:58px;padding-top:16px}.productCard__container-price{display:flex;justify-content:center;gap:8px;font-size:22px;line-height:31px}.productCard__container-specifications{display:flex;flex-direction:column;gap:8px;padding-top:8px;padding-bottom:8px}.productCard__container-buttons{display:flex;gap:8px}.productCard__photo{width:100%;height:100%;object-fit:contain}.productCard__title{font-family:Mont-Regular,sans-serif;color:var(--color-gray-primary);font-size:14px;font-weight:600}.productCard__price-regular{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-weight:500;text-decoration-line:line-through}.productCard__price-discount,.productCard__price-regular-without-discount{font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-weight:800}.productCard__divider{display:block;height:1px;background-color:var(--color-gray-elements)}.productCard__block{width:100%;height:15px;display:flex;justify-content:space-between;font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.productCard__info{color:var(--color-gray-secondary)}.productCard__value{color:var(--color-gray-primary)}.productCard__button{padding:11px 0;border:none;border-radius:5px;cursor:pointer;font-family:Mont-Regular,sans-serif;color:var(--color-bg);font-size:14px;font-weight:700;line-height:8px}.productCard__button-card{background-color:var(--color-gray-primary);width:100%;transition:box-shadow .3s}.productCard__button-card:hover{box-shadow:0 3px 13px #17203166}.productCard__button-card--active{background-color:var(--color-bg);color:var(--color-green);border:1px solid var(--color-gray-elements);pointer-events:none}.productCard__button-card--active:hover{box-shadow:none;border-color:inherit}.productCard__button-favorites{background-color:var(--color-bg);width:40px;flex-shrink:0;border:1px solid var(--color-gray-icons-placeholders);border-radius:5px;transition:border-color .3s}.productCard__button-favorites:hover{border-color:var(--color-gray-primary)}.productCard__button-favorites--active{border:1px solid var(--color-gray-elements)}.productCard:hover .productCard__container-photo{transform:scale(1.05)} diff --git a/public/assets/ProductCard-n_G8EIMu.js b/public/assets/ProductCard-n_G8EIMu.js new file mode 100644 index 00000000000..a9a0637385b --- /dev/null +++ b/public/assets/ProductCard-n_G8EIMu.js @@ -0,0 +1 @@ +import{r,G as C,j as a,L as x,c as l,I as _,i as m}from"./index-DZu0jUOh.js";const h=r.memo(({product:s,displayType:c})=>{const{cart:t,favorites:d,toggleFavorites:u,addToCart:p,theme:i}=r.useContext(C),n=r.useMemo(()=>t.some(({id:e})=>e===s.itemId),[t,s.itemId]),o=r.useMemo(()=>d.some(({itemId:e})=>e===s.itemId),[d,s.itemId]);return a.jsx("div",{className:"productCard",children:a.jsxs(x,{className:"productCard__container",to:`/${s.category}/${s.itemId}`,children:[a.jsx("div",{className:"productCard__container-photo",children:a.jsx("img",{src:s.image,alt:"Product's photo",className:"productCard__photo"})}),a.jsx("div",{className:"productCard__container-title",children:a.jsx("span",{className:"productCard__title",children:s.name})}),a.jsxs("div",{className:"productCard__container-price",children:[c==="fullPrice"&&a.jsx("span",{className:"productCard__price-regular-without-discount",children:`$${s.fullPrice}`}),c==="with-discount"&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"productCard__price-discount",children:`$${s.price}`}),a.jsx("span",{className:"productCard__price-regular",children:`$${s.fullPrice}`})]})]}),a.jsx("div",{className:"productCard__divider"}),a.jsxs("div",{className:"productCard__container-specifications",children:[a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"Screen"}),a.jsx("span",{className:"productCard__value",children:s.screen})]}),a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"Capacity"}),a.jsx("span",{className:"productCard__value",children:s.capacity})]}),a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"RAM"}),a.jsx("span",{className:"productCard__value",children:s.ram})]})]}),a.jsxs("div",{className:"productCard__container-buttons",children:[a.jsx("button",{className:l("productCard__button","productCard__button-card",{"productCard__button-card--active":n}),onClick:e=>{e.preventDefault(),p(s)},children:n?"Added":"Add to cart"}),a.jsx("button",{className:l("productCard__button","productCard__button-favorites",{"productCard__button-favorites--active":o}),onClick:e=>{e.preventDefault(),u(s)},children:o?a.jsx(_,{icon:m.favorites__filled[i]}):a.jsx(_,{icon:m.favorites[i]})})]})]})})});h.displayName="ProductCard";export{h as P}; diff --git a/public/assets/ProductsList-Bz-DDO8l.css b/public/assets/ProductsList-Bz-DDO8l.css new file mode 100644 index 00000000000..55583659a69 --- /dev/null +++ b/public/assets/ProductsList-Bz-DDO8l.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productsList{margin-top:24px;gap:40px 16px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.productsList{--columns: 12}}@media (min-width: 1200px){.productsList{--columns: 24}}@media (max-width: 640px){.productsList .productItem{grid-column:1/-1}}@media (min-width: 640px){.productsList .productItem{grid-column:span 6}}@media (min-width: 768px){.productsList .productItem{grid-column:span 4}}@media (min-width: 1200px){.productsList .productItem{grid-column:span 6}} diff --git a/public/assets/ProductsList-C8WnN_nq.js b/public/assets/ProductsList-C8WnN_nq.js new file mode 100644 index 00000000000..ea215db258e --- /dev/null +++ b/public/assets/ProductsList-C8WnN_nq.js @@ -0,0 +1 @@ +import{j as s}from"./index-DZu0jUOh.js";import{P as o}from"./ProductCard-n_G8EIMu.js";const m=({products:t,displayType:i})=>s.jsx("div",{className:"productsList",children:t.map(r=>s.jsx("div",{className:"productItem",children:s.jsx(o,{product:r,displayType:i})},r.id))});export{m as P}; diff --git a/public/assets/ProductsSlider-CAHW4_99.css b/public/assets/ProductsSlider-CAHW4_99.css new file mode 100644 index 00000000000..2bf3eebba62 --- /dev/null +++ b/public/assets/ProductsSlider-CAHW4_99.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productsSlider{padding-left:16px}@media (min-width: 1200px){.productsSlider{margin-block:80px;padding-inline:16px;max-width:1136px}}@media (min-width: 1200px) and (min-width: 640px){.productsSlider{padding-inline:24px}}@media (min-width: 1200px) and (min-width: 1200px){.productsSlider{padding-inline:0;margin-inline:auto}}.productsSlider__container-top{padding-right:16px;display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;gap:72px}.productsSlider__title{font-size:22px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary)}@media (min-width: 640px){.productsSlider__title{font-size:32px}}.productsSlider__buttons{display:flex;gap:16px}.productsSlider__button{width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border .3s,background-color .3s}.productsSlider__button--disabled{cursor:not-allowed;border:1px solid var(--color-gray-elements);background-color:inherit}.productsSlider__button--disabled:hover{border:1px solid var(--color-gray-elements)}.productsSlider__viewport{overflow:hidden;width:100%}@media (min-width: 1200px){.productsSlider__viewport{width:1136px}}.productsSlider__track{display:flex;gap:16px;transition:transform .5s ease-in-out}.productsSlider__item{flex:0 0 auto;width:212px;height:442px}@media (min-width: 640px){.productsSlider__item{width:237px;height:515px}}@media (min-width: 1200px){.productsSlider__item{width:272px;height:509px}}body.theme_dark .productsSlider__button{border:none;background-color:var(--color-surface-2)}.productsSlider__button:not(.productsSlider__button--disabled):hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}body.theme_dark .productsSlider__button:not(.productsSlider__button--disabled):hover{border:none;background-color:var(--color-gray-icons-placeholders)}body.theme_dark .productsSlider__button--disabled{border:1px solid var(--color-gray-elements);background-color:inherit} diff --git a/public/assets/ProductsSlider-CeN1XtqL.js b/public/assets/ProductsSlider-CeN1XtqL.js new file mode 100644 index 00000000000..ed0c6359ae1 --- /dev/null +++ b/public/assets/ProductsSlider-CeN1XtqL.js @@ -0,0 +1 @@ +import{r,G as v,j as s,c as _,I as a,i as n}from"./index-DZu0jUOh.js";import{P as b}from"./ProductCard-n_G8EIMu.js";const f=({title:m,products:c,displayType:h})=>{const{theme:d}=r.useContext(v),[l,o]=r.useState(272),p=16,[t,u]=r.useState(0);r.useEffect(()=>{const e=()=>{const x=window.innerWidth;x<640?o(212):x<1200?o(237):o(272)};return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]);const i=r.useMemo(()=>c.length-4,[c.length]),j=r.useCallback(()=>{te+1)},[t,i]),S=r.useCallback(()=>{t>0&&u(e=>e-1)},[t]);return s.jsxs("div",{className:"productsSlider",children:[s.jsxs("div",{className:"productsSlider__container-top",children:[s.jsx("h2",{className:"productsSlider__title",children:m}),s.jsxs("div",{className:"productsSlider__buttons",children:[s.jsx("div",{className:_("productsSlider__button",{"productsSlider__button--disabled":t===0}),onClick:S,children:t===0?s.jsx(a,{icon:n.arrow_left__disabled[d]}):s.jsx(a,{icon:n.arrow_left[d]})}),s.jsx("div",{className:_("productsSlider__button",{"productsSlider__button--disabled":t===i}),onClick:j,children:t===i?s.jsx(a,{icon:n.arrow_right__disabled[d]}):s.jsx(a,{icon:n.arrow_right[d]})})]})]}),s.jsx("div",{className:"productsSlider__viewport",children:s.jsx("div",{className:"productsSlider__track",style:{transform:`translateX(-${t*(l+p)}px)`},children:c.map(e=>s.jsx("div",{className:"productsSlider__item",style:{width:`${l}px`},children:s.jsx(b,{product:e,displayType:h})},e.id))})})]})};export{f as P}; diff --git a/public/assets/favicon-DR5FOLsX.svg b/public/assets/favicon-DR5FOLsX.svg new file mode 100644 index 00000000000..e1eb131d6dd --- /dev/null +++ b/public/assets/favicon-DR5FOLsX.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/index--M-vjEFs.js b/public/assets/index--M-vjEFs.js new file mode 100644 index 00000000000..39ad56f809b --- /dev/null +++ b/public/assets/index--M-vjEFs.js @@ -0,0 +1 @@ +import{r as c,G as g,j as e,I as _,i as u,L as p}from"./index-DZu0jUOh.js";import{P as x}from"./ProductsSlider-CeN1XtqL.js";import"./ProductCard-n_G8EIMu.js";const C=({allNewestProducts:r})=>{const i=r.map(a=>a.image),d=r.map(a=>a.name),m=r.map(a=>a.category+"/"+a.itemId),[l,o]=c.useState(0),{theme:t}=c.useContext(g),s=c.useRef(null),n=c.useCallback(()=>o(a=>(a+1)%i.length),[i.length]),y=c.useCallback(()=>o(a=>(a-1+i.length)%i.length),[i.length]);c.useEffect(()=>(s.current&&clearInterval(s.current),s.current=setInterval(n,3e3),()=>{s.current&&clearInterval(s.current)}),[]);const j=c.useCallback(a=>{o(a),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n]),b=c.useCallback(()=>{n(),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n]),N=c.useCallback(()=>{y(),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n,y]);return e.jsxs("div",{className:"picturesSlider",children:[e.jsxs("div",{className:"picturesSlider__container",children:[e.jsx("div",{className:"picturesSlider__button",onClick:N,children:e.jsx(_,{icon:u.arrow_left[t]})}),e.jsxs("div",{className:"picturesSlider__content",children:[e.jsxs("div",{className:"picturesSlider__aside",children:[e.jsxs("div",{children:[e.jsxs("div",{children:[e.jsx("div",{className:"picturesSlider__aside-title",children:"Now available"}),e.jsxs("div",{className:"picturesSlider__aside-title",children:["in our store! ",e.jsx(_,{icon:u.ok[t]})]})]}),e.jsx("div",{className:"picturesSlider__aside-description",children:"Be the first"})]}),e.jsx(p,{to:m[l],className:"picturesSlider__aside-action",children:"Order now"}),e.jsx("p",{className:"",children:d[l]})]}),e.jsx("div",{className:"picturesSlider__container-image",children:i.map((a,h)=>e.jsx("img",{src:a,alt:"Slide",className:l===h?"picturesSlider__image picturesSlider__image--active":"picturesSlider__image"},h))})]}),e.jsx("div",{className:"picturesSlider__button",onClick:b,children:e.jsx(_,{icon:u.arrow_right[t]})})]}),e.jsx("div",{className:"picturesSlider__dots",children:i.map((a,h)=>e.jsx("div",{className:l===h?"picturesSlider__dot picturesSlider__dot--active":"picturesSlider__dot",onClick:()=>j(h)},h))})]})},v=()=>{const{allProducts:r}=c.useContext(g),{phonesLength:i,tabletsLength:d,accessoriesLength:m}=c.useMemo(()=>{const l=[],o=[],t=[];return r.forEach(s=>{s.category==="phones"&&l.push(s.id),s.category==="tablets"&&o.push(s.id),s.category==="accessories"&&t.push(s.id)}),{phonesLength:l.length,tabletsLength:o.length,accessoriesLength:t.length}},[r]);return e.jsx("div",{className:"shopByCategory",children:e.jsxs("div",{className:"shopByCategory__container",children:[e.jsx("h2",{className:"shopByCategory__title",children:"Shop by category"}),e.jsxs("div",{className:"shopByCategory__content",children:[e.jsx(p,{to:"/phones",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-phones.webp",alt:"Category Phones",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Mobile phones"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${i} models`})]})}),e.jsx(p,{to:"/tablets",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-tablets.webp",alt:"Category Tablets",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Tablets"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${d} models`})]})}),e.jsx(p,{to:"/accessories",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-accessories.webp",alt:"Category Accessories",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Accessories"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${m} models`})]})})]})]})})},f=()=>{const{allProducts:r}=c.useContext(g);let i=[];const d=c.useMemo(()=>[...r].filter(t=>t.category==="phones").sort((t,s)=>s.year-t.year).slice(0,20),[r]),m=c.useMemo(()=>[...r].filter(t=>t.category==="tablets").sort((t,s)=>s.year-t.year).slice(0,20),[r]),l=c.useMemo(()=>[...r].filter(t=>t.category==="accessories").sort((t,s)=>s.year-t.year).slice(0,20),[r]);i=[...d.slice(0,5),...m.slice(0,5),...l.slice(0,5)];const o=c.useMemo(()=>[...r].map(t=>({...t,discount:(t.fullPrice-t.price)/t.fullPrice*100})).sort((t,s)=>s.discount-t.discount).slice(0,20),[r]);return e.jsxs("div",{className:"homePage",children:[e.jsx("h1",{className:"homePage__title",children:"Welcome to Nice Gadgets store!"}),e.jsx(C,{allNewestProducts:i}),e.jsx(x,{title:"Brand new models",products:d,displayType:"fullPrice"}),e.jsx(v,{}),e.jsx(x,{title:"Hot prices",products:o,displayType:"with-discount"})]})};export{f as HomePage}; diff --git a/public/assets/index-80CrQ2vW.css b/public/assets/index-80CrQ2vW.css new file mode 100644 index 00000000000..9d69bcd52a1 --- /dev/null +++ b/public/assets/index-80CrQ2vW.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.homePage__title{margin-block:24px;font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.homePage__title{padding-inline:24px}}@media (min-width: 1200px){.homePage__title{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.homePage__title{font-size:48px;line-height:56px;margin-block:32px}}@media (min-width: 1200px){.homePage__title{margin-block:56px}}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}p{font-family:Mont-Bold,sans-serif;color:#fff}.picturesSlider{margin-bottom:56px}@media (min-width: 640px){.picturesSlider{padding-inline:16px;max-width:1136px;margin-bottom:64px}}@media (min-width: 640px) and (min-width: 640px){.picturesSlider{padding-inline:24px}}@media (min-width: 640px) and (min-width: 1200px){.picturesSlider{padding-inline:0;margin-inline:auto}}@media (min-width: 1200px){.picturesSlider{margin-bottom:80px}}.picturesSlider__container{display:flex;justify-content:center;width:100%}.picturesSlider__container-image{position:relative;width:100%;aspect-ratio:1/1;flex:1}@media (min-width: 640px){.picturesSlider__container-image{min-height:189px;max-height:400px;aspect-ratio:400/189}}.picturesSlider__content{display:flex;padding:16px;margin-inline:16px;background-color:#000;width:100%}.picturesSlider__aside{display:none;flex:1;justify-content:space-between;flex-direction:column;background-color:#222;border-radius:16px;padding:16px}@media (min-width: 640px){.picturesSlider__aside{display:flex}}.picturesSlider__aside-title{font-family:Mont-Bold,sans-serif;color:#fff;background-image:linear-gradient(90deg,#7c4af4 30%,#d862ff,#7c4af4 70%);background-size:400%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-size:32px;line-height:1;animation:shimmer 1.5s infinite linear}@keyframes shimmer{0%{background-position:100% 100%}to{background-position:0 0}}.picturesSlider__aside-description{font-family:Mont-Regular,sans-serif;color:#aeaeae;margin-top:8px;font-size:12px}.picturesSlider__aside-action{font-family:Mont-Bold,sans-serif;width:fit-content;border:1px solid #444;padding:12px 16px;border-radius:16px;text-decoration:none;color:#fff;font-size:12px}.picturesSlider__image{width:100%;height:100%;object-fit:contain;position:absolute;top:0;left:0;transition:opacity .5s ease-in-out;opacity:0}.picturesSlider__image--active{opacity:1}.picturesSlider__button{display:none;transition:border-color .3s ease,background-color .3s ease}@media (min-width: 640px){.picturesSlider__button{display:flex;align-items:center;justify-content:center;width:32px;background-color:var(--color-bg);border:1px solid var(--color-gray-icons-placeholders);cursor:pointer}}.picturesSlider__button:hover{border-color:var(--color-gray-primary);background-color:var(--color-hover)}.picturesSlider__dots{height:24px;display:flex;margin:0 auto;justify-content:center}.picturesSlider__dot{width:24px;height:24px;cursor:pointer;position:relative}.picturesSlider__dot:after{content:"";position:absolute;width:14px;height:4px;background-color:var(--color-gray-elements);top:50%;left:50%;transform:translate(-50%,-50%)}.picturesSlider__dot--active:after{background-color:var(--color-gray-primary)}body.theme_dark .picturesSlider__button{border:none;background-color:var(--color-surface-2)}body.theme_dark .picturesSlider__button:hover{background-color:var(--color-gray-icons-placeholders)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.shopByCategory__container{margin-block:56px;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.shopByCategory__container{padding-inline:24px}}@media (min-width: 1200px){.shopByCategory__container{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.shopByCategory__container{margin-block:64px}}.shopByCategory__title{font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;line-height:30.8px;letter-spacing:-.01em;color:var(--color-gray-primary);margin-bottom:24px}@media (min-width: 640px){.shopByCategory__title{font-family:Mont-Bold,sans-serif;font-size:32px;line-height:41px}}.shopByCategory__content{gap:32px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.shopByCategory__content{--columns: 12}}@media (min-width: 1200px){.shopByCategory__content{--columns: 24}}.shopByCategory__link{text-decoration:none;grid-column:1/-1}@media (min-width: 640px){.shopByCategory__link{grid-column:span 4}}@media (min-width: 1200px){.shopByCategory__link{grid-column:span 8}}.shopByCategory__block{display:flex;flex-direction:column;align-items:center}.shopByCategory__block-image{display:block;max-width:auto;height:400px;border:0;transform:translate(10px,5px);transition:transform .3s}.shopByCategory__block-image:hover{transform:scale(1.05)}@media (min-width: 640px){.shopByCategory__block-image{max-width:100%}}.shopByCategory__block-title{margin-top:24px;font-family:Mont-SemiBold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}.shopByCategory__block-description{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:14px;font-weight:600;line-height:21px;margin-top:4px} diff --git a/public/assets/index-BD-w6JY5.css b/public/assets/index-BD-w6JY5.css new file mode 100644 index 00000000000..48825ac3512 --- /dev/null +++ b/public/assets/index-BD-w6JY5.css @@ -0,0 +1 @@ +.container{text-align:center;margin-top:40px;font-family:Mont-SemiBold,sans-serif;color:var(--color-gray-primary);font-size:48px} diff --git a/public/assets/index-BV-oWgkF.css b/public/assets/index-BV-oWgkF.css new file mode 100644 index 00000000000..aca972f3a55 --- /dev/null +++ b/public/assets/index-BV-oWgkF.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.detailsPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.detailsPage{padding-inline:24px}}@media (min-width: 1200px){.detailsPage{padding-inline:0;margin-inline:auto}}.detailsPage__title{margin-bottom:32px;font-size:22px;font-family:Mont-Bold,sans-serif;font-weight:800;line-height:41px;letter-spacing:-.01em;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__title{margin-bottom:40px;font-size:32px}}.detailsPage__error-message{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.detailsPage__image{width:100%;height:100%;object-fit:contain;position:absolute;opacity:0;transition:opacity .3s ease;z-index:-1}.detailsPage__image.detailsPage__image--active{opacity:1}.detailsPage__content-top{display:flex;flex-direction:column;width:100%}@media (min-width: 640px){.detailsPage__content-top{flex-direction:row;grid-column:1/-1;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 640px) and (min-width: 640px){.detailsPage__content-top{--columns: 12}}@media (min-width: 640px) and (min-width: 1200px){.detailsPage__content-top{--columns: 24}}.detailsPage__container-imageSlider{order:2;display:flex;gap:8px;margin-bottom:40px}@media (min-width: 640px){.detailsPage__container-imageSlider{grid-column:1/2;flex-direction:column;justify-content:flex-start;gap:16px;margin:0}}@media (min-width: 1200px){.detailsPage__container-imageSlider{grid-column:span 2}}.detailsPage__container-photos{padding:2px;border:1px solid var(--color-gray-elements);transition:border .3s ease;display:flex;align-items:center;justify-content:center}.detailsPage__container-photos--active{border:1px solid var(--color-gray-primary)}.detailsPage__container-price{display:flex;gap:8px;margin-top:32px;align-items:center}.detailsPage__container-specifications{display:flex;flex-direction:column;padding-block:8px;gap:8px;margin-top:32px}.detailsPage__container-buttons{margin-top:16px;width:100%;display:flex;gap:8px}.detailsPage__photo{width:100%;aspect-ratio:1/1;object-fit:contain;cursor:pointer}.detailsPage__photo-mask{order:1;aspect-ratio:1/1;margin-bottom:16px;position:relative}@media (min-width: 640px){.detailsPage__photo-mask{order:2;grid-column:span 6;margin-bottom:0}}@media (min-width: 1200px){.detailsPage__photo-mask{grid-column:span 10}}.detailsPage__characteristics{order:3;width:100%;margin-right:16px;display:flex;flex-direction:column}@media (min-width: 640px){.detailsPage__characteristics{grid-column:span 5}}@media (min-width: 1200px){.detailsPage__characteristics{grid-column:14/21}}.detailsPage__colors{display:flex;flex-direction:column;gap:8px}.detailsPage__colors-list{list-style:none;display:flex;gap:5px}.detailsPage__color-item{display:flex;justify-content:center;align-items:center;cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-elements);border-radius:50%;transition:border .3s}.detailsPage__color-item--selected{border:1px solid var(--color-gray-primary)}.detailsPage__color-circle{width:30px;height:30px;box-sizing:border-box;border-radius:50%;border:2px solid var(--color-bg)}.detailsPage__line{height:1px;background-color:var(--color-gray-elements);margin-top:24px}.detailsPage__line-bottom{margin-top:16px}.detailsPage__capacity{margin-top:24px;display:flex;flex-direction:column;gap:8px}.detailsPage__capacity-list{display:flex;gap:8px;list-style:none}.detailsPage__capacity-block{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;color:var(--color-gray-primary)}.detailsPage__capacity-block--selected{color:var(--color-bg)}.detailsPage__capacity-item{padding:6px;border:1px solid var(--color-gray-icons-placeholders);cursor:pointer;transition:border-color .3s}.detailsPage__capacity-item:hover{border-color:var(--color-gray-primary)}.detailsPage__capacity-item--selected{background-color:var(--color-gray-primary)}.detailsPage__price-regular{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:22px;font-weight:500;text-decoration-line:line-through}.detailsPage__price-discount{font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em}.detailsPage__block{width:100%;height:15px;display:flex;justify-content:space-between;font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.detailsPage__block-about{width:560px}.detailsPage__block-techSpecs{width:512px}.detailsPage__block-title{font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;line-height:30.8px;color:var(--color-gray-primary)}.detailsPage__button{border:none;cursor:pointer;background-color:var(--color-bg);font-family:Mont-Regular,sans-serif;color:var(--color-bg);font-size:14px;font-weight:700;line-height:21px;height:40px;display:flex;align-items:center;justify-content:center}.detailsPage__button-card{background-color:var(--color-gray-primary);width:100%;transition:box-shadow .3s}.detailsPage__button-card:hover{box-shadow:0 3px 13px #17203166}.detailsPage__button-card--active{background-color:var(--color-bg);color:var(--color-green);border:1px solid var(--color-gray-elements)}.detailsPage__button-favorites{width:40px;flex-shrink:0;border:1px solid var(--color-gray-icons-placeholders)}.detailsPage__button-favorites--active{border:1px solid var(--color-gray-elements)}.detailsPage__info{color:var(--color-gray-secondary);font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.detailsPage__value{color:var(--color-gray-primary)}.detailsPage__content-buttom{display:flex;gap:64px;margin-top:80px}.detailsPage__section-title{font-family:Mont-SemiBold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}.detailsPage__section-description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs{display:flex;flex-direction:column;gap:8px}.detailsPage__techSpecs-content{display:flex;flex-direction:column;gap:24px}.detailsPage__techSpecs-title{color:var(--color-gray-primary)}.detailsPage__techSpecs-list{list-style:none;display:flex;flex-direction:column;gap:8px}.detailsPage__techSpecs-item{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-primary)}.detailsPage__techSpecs-item-description{color:var(--color-gray-secondary)}.detailsPage__container-photos:not(.detailsPage__container-photos--active):hover{border:1px solid var(--color-gray-icons-placeholders)}.detailsPage__color-item:not(.detailsPage__color-item--selected):hover{border:1px solid var(--color-gray-icons-placeholders)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.detailsPage__content-buttom{gap:32px;display:flex;flex-direction:column;margin-bottom:56px}@media (min-width: 640px){.detailsPage__content-buttom{margin-bottom:64px}}@media (min-width: 1200px){.detailsPage__content-buttom{margin-block:80px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 1200px) and (min-width: 640px){.detailsPage__content-buttom{--columns: 12}}@media (min-width: 1200px) and (min-width: 1200px){.detailsPage__content-buttom{--columns: 24}}.detailsPage__block-about{width:100%}@media (min-width: 1200px){.detailsPage__block-about{grid-column:1/13}}.detailsPage__block-techSpecs{width:100%}@media (min-width: 1200px){.detailsPage__block-techSpecs{grid-column:14/-1}}.detailsPage__block-title{font-family:Mont-Bold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__block-title{font-size:22px;font-weight:800;line-height:30.8px}}.detailsPage__line-bottom{width:100%;height:1px;background-color:var(--color-gray-elements);margin-top:16px}.detailsPage__description{margin-top:32px;display:flex;flex-direction:column;gap:32px}.detailsPage__section{display:flex;flex-direction:column;gap:16px}.detailsPage__section-title{font-family:Mont-SemiBold,sans-serif;font-size:16px;font-weight:700;line-height:20.45px;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__section-title{font-size:20px;font-weight:700;line-height:25.56px}}.detailsPage__section-title--bottom{margin-top:80px;margin-bottom:24px}.detailsPage__section-description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs-content{display:flex;flex-direction:column;gap:8px;margin-top:25px}.detailsPage__techSpecs-block{display:flex;justify-content:space-between;gap:20px}.detailsPage__techSpecs-title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs-value{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-primary)} diff --git a/public/assets/index-C4ngy4_v.js b/public/assets/index-C4ngy4_v.js new file mode 100644 index 00000000000..ead57cdaee5 --- /dev/null +++ b/public/assets/index-C4ngy4_v.js @@ -0,0 +1 @@ +import{j as o,L as e}from"./index-DZu0jUOh.js";const s=()=>o.jsxs("div",{className:"container",children:[o.jsx("p",{children:"Page not found"}),o.jsx(e,{to:"/",children:"Go to HomePage"})]});export{s as NotFoundPage}; diff --git a/public/assets/index-C5E6A8ui.js b/public/assets/index-C5E6A8ui.js new file mode 100644 index 00000000000..87206c78b40 --- /dev/null +++ b/public/assets/index-C5E6A8ui.js @@ -0,0 +1 @@ +import{r as a,G as n,u as c,j as e}from"./index-DZu0jUOh.js";import{P as l}from"./ProductsList-C8WnN_nq.js";import{L as m}from"./Linkline-BVE7q3mI.js";import"./ProductCard-n_G8EIMu.js";const v=()=>{const{favorites:r}=a.useContext(n),[o]=c(),s=o.get("query")||"",t=a.useMemo(()=>s.length?r.filter(({name:i})=>i.toLowerCase().includes(s.toLowerCase().trim())):r,[r,s]);return e.jsxs("div",{className:"favoritesPage",children:[e.jsx(m,{productType:"Favorites"}),e.jsx("h1",{className:"favoritesPage__title",children:"Favorites"}),e.jsx("span",{className:"favoritesPage__description",children:`${t.length} ${t.length===1?"model":"models"}`}),t.length?e.jsx("div",{className:"favoritesPage__content",children:e.jsx(l,{products:t,displayType:"with-discount"})}):e.jsx("div",{className:"favoritesPage__empty-content",children:s.length?"No favorites match your query":"Your favorites list is empty"})]})};export{v as FavoritesPage}; diff --git a/public/assets/index-C9RfMEqD.css b/public/assets/index-C9RfMEqD.css new file mode 100644 index 00000000000..94f848242bd --- /dev/null +++ b/public/assets/index-C9RfMEqD.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.favoritesPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.favoritesPage{padding-inline:24px}}@media (min-width: 1200px){.favoritesPage{padding-inline:0;margin-inline:auto}}.favoritesPage__empty-content{margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);display:flex;align-items:center;justify-content:center}.favoritesPage__title{margin-top:16px;margin-bottom:40px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}.favoritesPage__description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)} diff --git a/public/assets/index-CDfWgnoX.js b/public/assets/index-CDfWgnoX.js new file mode 100644 index 00000000000..6762d099ab9 --- /dev/null +++ b/public/assets/index-CDfWgnoX.js @@ -0,0 +1 @@ +import{r as s,G as w,j as e,I as g,i as _,c as C,u as R,a as $}from"./index-DZu0jUOh.js";import{L as q,c as B}from"./Linkline-BVE7q3mI.js";import{P as F}from"./ProductsList-C8WnN_nq.js";import{L as G}from"./Loader-CdfK6LLs.js";import"./ProductCard-n_G8EIMu.js";const M=s.memo(({label:r,selected:u,options:t,onChange:a})=>{const{theme:n}=s.useContext(w),[o,p]=s.useState(!1),c=s.useRef(null);s.useEffect(()=>{const l=x=>{c.current&&!c.current.contains(x.target)&&p(!1)};return document.addEventListener("mousedown",l),()=>{document.removeEventListener("mousedown",l)}},[]);const i=s.useCallback(()=>p(l=>!l),[]),d=s.useCallback(l=>{a(l),p(!1)},[a]);return e.jsxs("div",{ref:c,className:"dropdown",children:[e.jsx("div",{className:"dropdown__label",children:r}),e.jsxs("button",{className:`dropdown__button ${o?"dropdown__button--open":""}`,onClick:i,children:[e.jsx("div",{className:"dropdown__title",children:u}),e.jsx("div",{className:"dropdown__icon",children:e.jsx(g,{icon:o?_.arrow_down[n]:_.arrow_right[n]})})]}),o&&e.jsx("ul",{className:"dropdown__options",children:t.map(l=>e.jsx("li",{className:"dropdown__option",onClick:()=>d(l),children:l},l))})]})});M.displayName="Dropdown";const N=4,D=({total:r,perPage:u,currentPage:t,onPageChange:a})=>{const{theme:n}=s.useContext(w),o=s.useMemo(()=>Math.ceil(r/u),[u,r]),[p,c]=s.useMemo(()=>{let i=Math.max(1,t-1),d=Math.min(o,t+2);return d-i+1a(t-1),disabled:t===1,children:t===1?e.jsx(g,{icon:_.arrow_left__disabled[n]}):e.jsx(g,{icon:_.arrow_left[n]})}),e.jsx("div",{className:"pagination__button-container",children:Array.from({length:c-p+1},(i,d)=>e.jsx("button",{className:C("pagination__button-page",{"pagination__button-page--active":t===p+d}),onClick:()=>a(p+d),children:p+d},p+d))}),e.jsx("button",{className:C("pagination__button",{"pagination__button--disabled":t===o}),onClick:()=>a(t+1),disabled:t===o,children:t===o?e.jsx(g,{icon:_.arrow_right__disabled[n]}):e.jsx(g,{icon:_.arrow_right[n]})}),e.jsxs("p",{children:["Total pages: ",o]})]})};function y(r,u){const t=new URLSearchParams(r.toString());return Object.entries(u).forEach(([a,n])=>{n===null?t.delete(a):Array.isArray(n)?(t.delete(a),n.forEach(o=>{t.append(a,o)})):t.set(a,n)}),t.toString()}const U=(r,{sortBy:u,query:t})=>{let a=[...r];switch(t&&(a=a.filter(n=>n.name.toLowerCase().includes(t.toLowerCase().trim()))),u){case"Newest":return a.sort((n,o)=>o.year-n.year);case"Alphabetically":return a.sort((n,o)=>n.name.localeCompare(o.name));case"Cheapest":return a.sort((n,o)=>n.fullPrice-o.fullPrice);default:return a}},K=({category:r})=>{const{allProducts:u}=s.useContext(w),{theme:t}=s.useContext(w),[a,n]=s.useState(!1),[o,p]=s.useState(null),[c,i]=R(),d=c.get("sort")||"Alphabetically",l=c.get("perPage")||"All",x=Number(c.get("page"))||1,j=c.get("query")||"",k=$(),A=s.useCallback(()=>{window.scrollTo({top:0,behavior:"smooth"})},[]),v=s.useMemo(()=>k.pathname.split("/")[1],[k.pathname]),L=s.useMemo(()=>u.filter(m=>m.category===r),[u,r]),h=s.useMemo(()=>U(L,{sortBy:d,query:j}),[L,j,d]),b=s.useMemo(()=>h.length,[h.length]),S=s.useCallback(m=>{i(y(c,m==="Alphabetically"?{sort:null}:{sort:m}))},[c,i]),T=s.useCallback(m=>{i(y(c,m==="All"?{perPage:null,page:null}:{perPage:m,page:"1"}))},[c,i]),E=s.useCallback(m=>{const P=m===1?{page:null}:{page:String(m)};i(y(c,P))},[c,i]),I=s.useMemo(()=>l==="All"?1:Math.ceil(b/+l),[b,l]),f=s.useMemo(()=>(x-1)*+l,[x,l]),O=s.useMemo(()=>l==="All"?h:h.slice(f,f+ +l),[l,f,h]);return s.useEffect(()=>{n(!0),p(null);const m=setTimeout(()=>{try{(!u||u.length===0)&&p("Failed to load products")}catch{p("Failed to load products")}finally{n(!1)}},1e3);return()=>clearTimeout(m)},[r,u]),e.jsxs("div",{className:"productsPage",children:[a&&e.jsx(G,{}),!a&&o&&e.jsxs("div",{className:"productsPage__error",children:[e.jsx("p",{children:"Something went wrong. Please try again."}),e.jsx("button",{onClick:()=>window.location.reload(),children:"Reload"})]}),!a&&!o&&!h.length&&!j?e.jsx("div",{className:"productsPage__no-products",children:e.jsxs("p",{children:["There are no ",r," yet."]})}):null,!a&&!o&&!h.length&&j?e.jsx("p",{className:"productsPage__no-products",children:`There are no ${v} matching the query`}):null,!a&&!o&&h.length?e.jsxs(e.Fragment,{children:[e.jsx(q,{productType:r}),e.jsx("h1",{className:"productsPage__title",children:r&&`${B(r)} page`}),e.jsx("span",{className:"productsPage__description",children:`${b} model${b!==1?"s":""}`}),e.jsxs("div",{className:"productsPage__dropdown",children:[e.jsx("div",{className:"productsPage__dropdown--sortBy",children:e.jsx(M,{label:"Sort by",selected:d,options:["Newest","Cheapest","Alphabetically"],onChange:S})}),e.jsx("div",{className:"productsPage__dropdown--itemsPerPage",children:e.jsx(M,{label:"Items on page",selected:l,options:["4","8","16","All"],onChange:T})})]}),e.jsx("button",{className:"buttonUp",onClick:A,children:e.jsx(g,{icon:_.arrow_left[t]})}),e.jsx(F,{products:O,displayType:"with-discount"}),l!=="All"&&I>1&&e.jsx(D,{total:b,perPage:+l,currentPage:x,onPageChange:E})]}):null]})};export{K as ProductPage}; diff --git a/public/assets/index-CS6BVxGO.css b/public/assets/index-CS6BVxGO.css new file mode 100644 index 00000000000..aca5be5f3da --- /dev/null +++ b/public/assets/index-CS6BVxGO.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}*{margin:0;padding:0}.Layout{display:flex;flex-direction:column;min-height:100vh;position:relative;min-width:320px;scroll-behavior:smooth}.Layout__content{flex-grow:1}.Layout__header{position:sticky;top:0;z-index:1}body.theme_dark{background-color:var(--color-bg)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.header__logo{width:64px;height:22px}@media (min-width: 1200px){.header__logo{width:80px;height:28px}}.header__logo-container{display:flex;height:100%;width:96px;align-items:center;justify-content:center;flex-shrink:0}@media (min-width: 1200px){.header__logo-container{width:128px}}.header__menu{display:none}@media (min-width: 640px){.header__menu{display:flex}}.header__list{list-style:none;display:flex;align-items:center;gap:24px;text-decoration:none}@media (min-width: 1200px){.header__list{gap:64px}}.header__item{position:relative;display:inline-block;text-transform:uppercase;text-decoration:none;line-height:48px;font-family:Mont-Bold,sans-serif;color:var(--color-gray-secondary);font-size:12px;font-weight:800;letter-spacing:.04em;box-sizing:border-box}@media (min-width: 1200px){.header__item{line-height:64px}}.header__item:hover{color:var(--color-gray-primary)}.header__item:after,.header__icon:after{content:"";position:absolute;display:block;height:0;width:100%;background-color:var(--color-gray-primary);transition:height .3s ease,transform .3s ease;transform-origin:left;bottom:0;box-sizing:border-box}.header__item:hover:after,.header__icon:hover:after{height:2px;transform:scale(1)}.header__item--active{color:var(--color-gray-primary)}.header__item--active:after{height:2px;transition:none}.header__switch-theme{background:none;border:none;cursor:pointer;order:1;color:var(--color-gray-secondary);font-size:12px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;text-decoration:none;line-height:48px;font-family:Mont-Bold,sans-serif;box-sizing:border-box;flex-shrink:0;position:relative;display:inline-block}@media (min-width: 640px){.header__switch-theme{order:0}}@media (min-width: 1200px){.header__switch-theme{line-height:64px}}.header__switch-theme:hover{color:var(--color-gray-primary)}.header__buttons-right{height:100%;flex-grow:1;display:flex;justify-content:flex-end;align-items:center}.header__buttons-wrapper{display:none}@media (min-width: 640px){.header__buttons-wrapper{display:flex}}.header__buttons-wrapper--bottom{display:flex;position:fixed;bottom:0;left:0;right:0;justify-content:space-between;background-color:var(--color-bg);height:64px;border-top:1px solid var(--color-gray-elements)}.header__icon{width:48px;height:48px;box-shadow:-1px 0 0 0 var(--color-gray-elements);display:flex;align-items:center;justify-content:center;position:relative}@media (min-width: 640px){.header__icon{display:flex}}@media (min-width: 1200px){.header__icon{width:64px;height:64px}}.header__buttons-wrapper--bottom .header__icon{width:100%;height:100%;align-items:center;justify-content:center}.header__icon:hover{color:var(--color-gray-primary);background:var(--color-hover)}body.theme_dark .header__icon:hover{transition:background-color .3s}body.theme_dark .header__icon:hover:hover{background-color:var(--color-gray-icons-placeholders)}.header__icon--active:after{content:"";position:absolute;width:64px;width:100%;background-color:var(--color-gray-primary)}.header__icon-wrapper{width:28px;height:28px;position:relative;display:flex;align-items:center;justify-content:center}.header__quantity{position:absolute;top:0;right:0;background-color:var(--color-red);color:#fff;border:1px solid white;border-radius:50%;width:14px;height:14px;display:flex;justify-content:center;align-items:center;font-family:Mont-Regular,sans-serif;font-size:9px;font-weight:700}.header__icon--menu{display:flex;order:2}@media (min-width: 640px){.header__icon--menu{display:none}}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.icon__picture{display:flex;width:16px;height:16px}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.header{height:48px;display:flex;align-items:center;justify-content:space-between;width:100%;gap:16px;box-shadow:0 1px 0 0 var(--color-gray-elements);background-color:var(--color-bg)}@media (min-width: 1200px){.header{height:64px}}.header__search-wrapper{position:relative;display:flex;align-items:center;margin-right:16px}.header__search-input{height:48px;box-shadow:-1px 0 0 0 var(--color-gray-elements);width:100%;padding-inline:8px;background-color:var(--color-bg);font-family:Mont-Regular,sans-serif;color:var(--color-gray-primary);font-size:14px;font-weight:400;line-height:21px;outline:none;border:none}@media (min-width: 640px){.header__search-input{flex-grow:1}}@media (min-width: 1200px){.header__search-input{height:64px}}.header__search-input .header__search-input::placeholder{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:12px;font-weight:400;line-height:21px;transition:opacity .3s ease}.header__search-input .header__search-input:focus::placeholder{opacity:0}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.menu{display:flex;flex-direction:column;align-items:center;justify-content:center;position:fixed;top:48px;bottom:64px;width:100%;background-color:var(--color-bg);transform:translate(-100%);transition:transform .3s ease,opacity .3s ease;opacity:0;z-index:1;pointer-events:none}.menu__list{list-style:none;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:24px}.menu__link{position:relative;font-family:Molt-Bold,sans-serif;font-weight:800;font-size:12px;letter-spacing:.04em;text-align:center;text-transform:uppercase;color:var(--color-gray-secondary);text-decoration:none;display:flex}.menu__link:hover{color:var(--color-gray-primary)}.menu__link:after{content:"";position:absolute;display:block;height:0;width:100%;background-color:var(--color-gray-primary);bottom:-8px;left:0;transition:height .3s ease;box-sizing:content-box}.menu__link:hover:after{height:1px}.menu--open{transform:translate(0);opacity:1;pointer-events:all}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.footer{box-shadow:0 -1px 0 0 var(--color-gray-elements)}.footer__container{display:flex;flex-direction:column;gap:32px;padding-block:32px;margin-top:64px;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.footer__container{padding-inline:24px}}@media (min-width: 1200px){.footer__container{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.footer__container{flex-direction:row;justify-content:space-between;align-items:center}}@media (min-width: 1200px){.footer__container{margin-top:80px}}.footer__logo{width:89px;height:32px}@media (min-width: 640px){.footer__logo-container{flex-grow:1}}.footer__items{display:flex;flex-direction:column;gap:16px}@media (min-width: 640px){.footer__items{flex-direction:row;justify-content:space-between}}@media (min-width: 1200px){.footer__items{align-items:center}}.footer__link{text-transform:uppercase;text-decoration:none;font-family:Mont-Bold,sans-serif;font-size:12px;font-weight:800;line-height:11px;letter-spacing:.04em;color:var(--color-gray-secondary);transition:color .3s}.footer__link:hover{color:var(--color-gray-primary)}.footer__block{display:flex;align-items:center;justify-content:center;gap:16px;cursor:pointer}@media (min-width: 640px){.footer__block{justify-content:end;flex-grow:1}}.footer__button{cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);transform:rotate(90deg);transition:border-color .3s ease}.footer__button:hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}.footer__button-title{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:700;color:var(--color-gray-secondary)}body.theme_dark .footer__button{border:none;background-color:var(--color-surface-2);transition:background-color .3s}body.theme_dark .footer__button:hover{background-color:var(--color-gray-icons-placeholders)} diff --git a/public/assets/index-D68rl43-.js b/public/assets/index-D68rl43-.js new file mode 100644 index 00000000000..884ed68cb3f --- /dev/null +++ b/public/assets/index-D68rl43-.js @@ -0,0 +1 @@ +import{r as c,G as p,j as t,L as j,c as N,I as d,i as _,a as g}from"./index-DZu0jUOh.js";import{B as C}from"./ButtonBack-DRk2FjGf.js";const x=c.memo(({cartProduct:{id:e,product:{name:n,price:r,image:i,category:m},quantity:a}})=>{const{updateQuantity:o,theme:s}=c.useContext(p),l=c.useMemo(()=>r*a,[r,a]);return t.jsxs("div",{className:"cartItem",children:[t.jsxs("div",{className:"cartItem__wrapperTop",children:[t.jsx("button",{className:"cartItem__icon-close",onClick:()=>o(e,0)}),t.jsxs(j,{to:`/${m}/${e}`,className:"cartItem__link",children:[t.jsx("img",{src:i,alt:"Image product",className:"cartItem__image"}),t.jsx("div",{className:"cartItem__title",children:n})]})]}),t.jsxs("div",{className:"cartItem__wrapperBottom",children:[t.jsxs("div",{className:"cartItem__counter-container",children:[t.jsx("button",{className:N("cartItem__button",{"cartItem__button--disabled":a===1}),onClick:()=>{a>1&&o(e,a-1)},children:a===1?t.jsx(d,{icon:_.minus__disabled[s]}):t.jsx(d,{icon:_.minus[s]})}),t.jsx("div",{className:"cartItem__counter",children:a}),t.jsx("button",{className:"cartItem__button",onClick:()=>o(e,a+1),children:t.jsx(d,{icon:_.plus[s]})})]}),t.jsx("div",{className:"cartItem__price",children:`$${l}`})]})]})});x.displayName="CartItem";const v=()=>{const{cart:e,clearShoppingCart:n}=c.useContext(p),{pathname:r}=g(),i=c.useMemo(()=>r.slice(1,2).toUpperCase()+r.slice(2),[r]),{totalCount:m,totalQuantity:a}=c.useMemo(()=>{let s=0,l=0;for(const{quantity:u,product:{price:h}}of e)s+=u,l+=u*h;return{totalQuantity:s,totalCount:l}},[e]),o=c.useCallback(()=>{confirm("Checkout is not implemented yet. Do you want to clear the Cart?")&&n()},[n]);return t.jsxs("div",{className:"cartPage",children:[t.jsx(C,{}),t.jsx("h1",{className:"cartPage__title",children:i}),e.length?null:t.jsxs("div",{className:"cartPage__empty-content",children:[t.jsx("span",{className:"cartPage__empty-content-title",children:"Your cart is empty"}),t.jsx("img",{src:"img/cart-is-empty.png",alt:"Empty shopping cart",className:"cartPage__image-empty"})]}),e.length?t.jsxs("div",{className:"cartPage__content",children:[t.jsx("div",{className:"cartPage__content-container",children:e.map(s=>t.jsx(x,{cartProduct:s},s.id))}),t.jsxs("div",{className:"cartPage__total",children:[t.jsxs("div",{className:"cartPage__total-count",children:["$",m]}),t.jsxs("div",{className:"cartPage__total-title",children:["Total for ",a," items"]}),t.jsx("div",{className:"cartPage__line"}),t.jsx("button",{className:"cartPage__button-checkout",onClick:o,children:"Checkout"})]})]}):null]})};export{v as ShoppingCartPage}; diff --git a/public/assets/index-DZGfIgcM.js b/public/assets/index-DZGfIgcM.js new file mode 100644 index 00000000000..eea0027dc26 --- /dev/null +++ b/public/assets/index-DZGfIgcM.js @@ -0,0 +1,4 @@ +import{r as c,G as C,j as e,c as g,N as S,I as f,i as k,b as I,a as L,g as D,L as T}from"./index-DZu0jUOh.js";import{L as E}from"./Linkline-BVE7q3mI.js";import{P as M}from"./ProductsSlider-CeN1XtqL.js";import{B as R}from"./ButtonBack-DRk2FjGf.js";import{L as G}from"./Loader-CdfK6LLs.js";import"./ProductCard-n_G8EIMu.js";const w={graphite:"#383838",gold:"#FFD700",sierrablue:"#6CABDD",black:"#000000",rosegold:"#B76E79",silver:"#C0C0C0",spacegray:"#4B4F54",white:"#FFFFFF",yellow:"#FFFF00",red:"#FF0000",coral:"#FF7F50",midnight:"#2C3E50",purple:"#800080",spaceblack:"#1D1D1D",blue:"#0000FF",pink:"#FFC0CB",green:"#008000",midnightgreen:"#004953"},y=(s,l)=>s.find(t=>t.itemId===l),z=({selectedProduct:s,specificProducts:l})=>{const{allProducts:t,cart:n,favorites:r,toggleFavorites:P,addToCart:h,theme:p}=c.useContext(C),[x,o]=c.useState(0),_=c.useCallback(a=>{const i=y(t,a.id);i&&h(i)},[h,t]),N=c.useCallback(a=>{const i=y(t,a.id);i&&P(i)},[t,P]),m=c.useCallback((a,i)=>{const{color:F,namespaceId:$,capacity:A}=s,u=l.find(({color:v,namespaceId:B,capacity:b})=>B===$&&(a==="color"&&v===i&&b===A||a==="capacity"&&b===i&&v===F));return(u==null?void 0:u.id)??""},[s,l]),d=c.useMemo(()=>n.some(a=>a.id===s.id),[n,s.id]),j=c.useMemo(()=>r.some(a=>a.itemId===s.id),[r,s.id]);return e.jsxs("div",{className:"detailsPage__content-top",children:[e.jsx("div",{className:"detailsPage__container-imageSlider",children:s.images.map((a,i)=>e.jsx("div",{className:g("detailsPage__container-photos",{"detailsPage__container-photos--active":x===i}),children:e.jsx("img",{src:`./${a}`,alt:`Thumbnail ${i+1}`,className:"detailsPage__photo",onClick:()=>o(i)})},i))}),e.jsx("div",{className:"detailsPage__photo-mask",children:s.images.map((a,i)=>e.jsx("img",{src:`./${a}`,alt:`Selected Photo ${i+1}`,className:g("detailsPage__image",{"detailsPage__image--active":x===i})},i))}),e.jsxs("div",{className:"detailsPage__characteristics",children:[e.jsxs("div",{className:"detailsPage__colors",children:[e.jsx("span",{className:` + detailsPage__colors-title detailsPage__info`,children:"Available colors"}),e.jsx("ul",{className:"detailsPage__colors-list",children:s.colorsAvailable.map(a=>e.jsx(S,{to:`/${s.category}/${m("color",a)}`,children:e.jsx("li",{className:g("detailsPage__color-item",{"detailsPage__color-item--selected":s.color===a}),children:e.jsx("span",{className:"detailsPage__color-circle",style:{backgroundColor:w[a]}})},a)},a))})]}),e.jsx("div",{className:"detailsPage__line"}),e.jsxs("div",{className:"detailsPage__capacity",children:[e.jsx("span",{className:` + detailsPage__capacity-title detailsPage__info`,children:"Select capacity"}),e.jsx("ul",{className:"detailsPage__capacity-list",children:s.capacityAvailable.map(a=>e.jsx(S,{to:`/${s.category}/${m("capacity",a)}`,style:{textDecoration:"none"},children:e.jsx("li",{className:g("detailsPage__capacity-item",{"detailsPage__capacity-item--selected":s.capacity===a}),children:e.jsx("span",{className:g("detailsPage__capacity-block",{"detailsPage__capacity-block--selected":s.capacity===a}),children:a.split("GB").join(" GB")})},a)},a))})]}),e.jsx("div",{className:"detailsPage__line"}),e.jsxs("div",{className:"detailsPage__container-price",children:[e.jsx("span",{className:"detailsPage__price-discount",children:`$${s.priceDiscount}`}),e.jsx("span",{className:"detailsPage__price-regular",children:`$${s.priceRegular}`})]}),e.jsxs("div",{className:"detailsPage__container-buttons",children:[e.jsx("button",{className:g("detailsPage__button","detailsPage__button-card",{"detailsPage__button-card--active":d}),onClick:()=>_(s),children:d?"Added":"Add to cart"}),e.jsx("button",{className:g("detailsPage__button","detailsPage__button-favorites",{"detailsPage__button-favorites--active":j}),onClick:()=>N(s),children:j?e.jsx(f,{icon:k.favorites__filled[p]}):e.jsx(f,{icon:k.favorites[p]})})]}),e.jsxs("div",{className:"detailsPage__container-specifications",children:[e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Screen"}),e.jsx("span",{className:"detailsPage__value",children:s.screen})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Resolution"}),e.jsx("span",{className:"detailsPage__value",children:s.resolution})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Processor"}),e.jsx("span",{className:"detailsPage__value",children:s.processor})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"RAM"}),e.jsx("span",{className:"detailsPage__value",children:s.ram})]})]})]})]})},H=({selectedProduct:s})=>e.jsxs("div",{className:"detailsPage__content-buttom",children:[e.jsxs("div",{className:"detailsPage__block-about",children:[e.jsx("h3",{className:"detailsPage__block-title",children:"About"}),e.jsx("div",{className:"detailsPage__line-bottom"}),e.jsx("div",{className:"detailsPage__description",children:s.description.map((l,t)=>e.jsxs("div",{className:"detailsPage__section",children:[e.jsx("span",{className:"detailsPage__section-title",children:l.title}),e.jsx("span",{className:"detailsPage__section-description",children:l.text})]},t))})]}),e.jsxs("div",{className:"detailsPage__block-techSpecs",children:[e.jsx("h3",{className:"detailsPage__block-title",children:"Tech specs"}),e.jsx("div",{className:"productDetailsPage__line-bottom"}),e.jsxs("div",{className:"detailsPage__techSpecs-content",children:[e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Screen"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.screen})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Resolution"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.resolution})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Processor"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.processor})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"RAM"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.ram})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Capacity"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.capacity})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Camera"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.camera})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Zoom"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.zoom})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Cell"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.cell.join(", ")})]})]})]})]}),Y=(s,l,t)=>s.filter(n=>n.category===l&&n.itemId!==t).sort(()=>.5-Math.random()),U=()=>{const{allProducts:s}=c.useContext(C),{productId:l=""}=I(),[t,n]=c.useState(null),[r,P]=c.useState([]),[h,p]=c.useState(!0),[x,o]=c.useState(""),_=L().pathname.split("/")[1];c.useEffect(()=>{p(!0),o("");const m=setTimeout(()=>{D(_).then(d=>{P(d);const j=d.find(a=>a.id===l);j?(n(j),o("")):(n(null),o("Product not found"))}).catch(d=>{o(` + Error loading products: The product category "${_}" does not exist. ${d.name}`)}).finally(()=>{p(!1)})},500);return()=>clearTimeout(m)},[_]),c.useEffect(()=>{if(!l||!r.length)return;const m=r.find(d=>d.id===l);m?(n(m),o("")):(n(null),o("Product not found"))},[l,r]);const N=l?Y(s,_,l):[];if(h)return e.jsx("div",{className:"detailsPage",children:e.jsx(G,{})});if(x&&!h)return e.jsx("div",{className:"detailsPage",children:e.jsxs("div",{className:"detailsPage__error-message",children:[e.jsx("span",{children:x}),e.jsx(T,{to:"/",className:"detailsPage__error-link",children:"Go to HomePage"})]})});if(t)return e.jsxs("div",{className:"detailsPage",children:[e.jsx(E,{productType:_,productName:t.name}),e.jsx(R,{}),e.jsx("h2",{className:"detailsPage__title",children:t.name}),e.jsx(z,{selectedProduct:t,specificProducts:r}),e.jsx(H,{selectedProduct:t}),e.jsx("div",{className:"detailsPage__like-block",children:e.jsx(M,{title:"You may also like",products:N,displayType:"with-discount"})})]})};export{U as ProductDetailsPage}; diff --git a/public/assets/index-DZu0jUOh.js b/public/assets/index-DZu0jUOh.js new file mode 100644 index 00000000000..d4d11be7f3c --- /dev/null +++ b/public/assets/index-DZu0jUOh.js @@ -0,0 +1,72 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index--M-vjEFs.js","assets/ProductsSlider-CeN1XtqL.js","assets/ProductCard-n_G8EIMu.js","assets/ProductCard-CtH8lf1i.css","assets/ProductsSlider-CAHW4_99.css","assets/index-80CrQ2vW.css","assets/index-CDfWgnoX.js","assets/Linkline-BVE7q3mI.js","assets/Linkline-B_ez10jd.css","assets/ProductsList-C8WnN_nq.js","assets/ProductsList-Bz-DDO8l.css","assets/Loader-CdfK6LLs.js","assets/Loader-DU6sTv_g.css","assets/index-DlB5k-ir.css","assets/index-DZGfIgcM.js","assets/ButtonBack-DRk2FjGf.js","assets/ButtonBack-w6P-UJJ0.css","assets/index-BV-oWgkF.css","assets/index-D68rl43-.js","assets/index-urnOVSjv.css","assets/index-C5E6A8ui.js","assets/index-C9RfMEqD.css","assets/index-C4ngy4_v.js","assets/index-BD-w6JY5.css"])))=>i.map(i=>d[i]); +function af(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function zs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var js={exports:{}},wl={},Os={exports:{}},O={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ar=Symbol.for("react.element"),cf=Symbol.for("react.portal"),ff=Symbol.for("react.fragment"),df=Symbol.for("react.strict_mode"),pf=Symbol.for("react.profiler"),hf=Symbol.for("react.provider"),mf=Symbol.for("react.context"),vf=Symbol.for("react.forward_ref"),gf=Symbol.for("react.suspense"),yf=Symbol.for("react.memo"),wf=Symbol.for("react.lazy"),pu=Symbol.iterator;function Sf(e){return e===null||typeof e!="object"?null:(e=pu&&e[pu]||e["@@iterator"],typeof e=="function"?e:null)}var Is={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ms=Object.assign,Fs={};function gn(e,t,n){this.props=e,this.context=t,this.refs=Fs,this.updater=n||Is}gn.prototype.isReactComponent={};gn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};gn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ds(){}Ds.prototype=gn.prototype;function vi(e,t,n){this.props=e,this.context=t,this.refs=Fs,this.updater=n||Is}var gi=vi.prototype=new Ds;gi.constructor=vi;Ms(gi,gn.prototype);gi.isPureReactComponent=!0;var hu=Array.isArray,Us=Object.prototype.hasOwnProperty,yi={current:null},$s={key:!0,ref:!0,__self:!0,__source:!0};function As(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Us.call(t,r)&&!$s.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(u===1)l.children=n;else if(1>>1,Z=P[K];if(0>>1;Kl(Al,j))Ptl(gr,Al)?(P[K]=gr,P[Pt]=j,K=Pt):(P[K]=Al,P[Ct]=j,K=Ct);else if(Ptl(gr,j))P[K]=gr,P[Pt]=j,K=Pt;else break e}}return T}function l(P,T){var j=P.sortIndex-T.sortIndex;return j!==0?j:P.id-T.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();e.unstable_now=function(){return i.now()-u}}var s=[],a=[],h=1,p=null,m=3,w=!1,y=!1,S=!1,x=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(P){for(var T=n(a);T!==null;){if(T.callback===null)r(a);else if(T.startTime<=P)r(a),T.sortIndex=T.expirationTime,t(s,T);else break;T=n(a)}}function v(P){if(S=!1,d(P),!y)if(n(s)!==null)y=!0,Ul(E);else{var T=n(a);T!==null&&$l(v,T.startTime-P)}}function E(P,T){y=!1,S&&(S=!1,f(R),R=-1),w=!0;var j=m;try{for(d(T),p=n(s);p!==null&&(!(p.expirationTime>T)||P&&!ge());){var K=p.callback;if(typeof K=="function"){p.callback=null,m=p.priorityLevel;var Z=K(p.expirationTime<=T);T=e.unstable_now(),typeof Z=="function"?p.callback=Z:p===n(s)&&r(s),d(T)}else r(s);p=n(s)}if(p!==null)var vr=!0;else{var Ct=n(a);Ct!==null&&$l(v,Ct.startTime-T),vr=!1}return vr}finally{p=null,m=j,w=!1}}var N=!1,L=null,R=-1,A=5,z=-1;function ge(){return!(e.unstable_now()-zP||125K?(P.sortIndex=j,t(a,P),n(s)===null&&P===n(a)&&(S?(f(R),R=-1):S=!0,$l(v,j-K))):(P.sortIndex=Z,t(s,P),y||w||(y=!0,Ul(E))),P},e.unstable_shouldYield=ge,e.unstable_wrapCallback=function(P){var T=m;return function(){var j=m;m=T;try{return P.apply(this,arguments)}finally{m=j}}}})(Qs);Hs.exports=Qs;var Of=Hs.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var If=g,ke=Of;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),yo=Object.prototype.hasOwnProperty,Mf=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,vu={},gu={};function Ff(e){return yo.call(gu,e)?!0:yo.call(vu,e)?!1:Mf.test(e)?gu[e]=!0:(vu[e]=!0,!1)}function Df(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Uf(e,t,n,r){if(t===null||typeof t>"u"||Df(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function fe(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var ne={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ne[e]=new fe(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ne[t]=new fe(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ne[e]=new fe(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ne[e]=new fe(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ne[e]=new fe(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ne[e]=new fe(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ne[e]=new fe(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ne[e]=new fe(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ne[e]=new fe(e,5,!1,e.toLowerCase(),null,!1,!1)});var Si=/[\-:]([a-z])/g;function ki(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ne[e]=new fe(e,1,!1,e.toLowerCase(),null,!1,!1)});ne.xlinkHref=new fe("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ne[e]=new fe(e,1,!1,e.toLowerCase(),null,!0,!0)});function _i(e,t,n,r){var l=ne.hasOwnProperty(t)?ne[t]:null;(l!==null?l.type!==0:r||!(2u||l[i]!==o[u]){var s=` +`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=i&&0<=u);break}}}finally{Wl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?zn(e):""}function $f(e){switch(e.tag){case 5:return zn(e.type);case 16:return zn("Lazy");case 13:return zn("Suspense");case 19:return zn("SuspenseList");case 0:case 2:case 15:return e=Hl(e.type,!1),e;case 11:return e=Hl(e.type.render,!1),e;case 1:return e=Hl(e.type,!0),e;default:return""}}function _o(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ht:return"Fragment";case Wt:return"Portal";case wo:return"Profiler";case xi:return"StrictMode";case So:return"Suspense";case ko:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Xs:return(e.displayName||"Context")+".Consumer";case Ys:return(e._context.displayName||"Context")+".Provider";case Ei:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ci:return t=e.displayName||null,t!==null?t:_o(e.type)||"Memo";case nt:t=e._payload,e=e._init;try{return _o(e(t))}catch{}}return null}function Af(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return _o(t);case 8:return t===xi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function yt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Js(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Bf(e){var t=Js(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=Bf(e))}function Zs(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Js(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Yr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function xo(e,t){var n=t.checked;return W({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function wu(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=yt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function qs(e,t){t=t.checked,t!=null&&_i(e,"checked",t,!1)}function Eo(e,t){qs(e,t);var n=yt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Co(e,t.type,n):t.hasOwnProperty("defaultValue")&&Co(e,t.type,yt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Su(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Co(e,t,n){(t!=="number"||Yr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var jn=Array.isArray;function tn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=kr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Qn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Mn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Vf=["Webkit","ms","Moz","O"];Object.keys(Mn).forEach(function(e){Vf.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Mn[t]=Mn[e]})});function na(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Mn.hasOwnProperty(e)&&Mn[e]?(""+t).trim():t+"px"}function ra(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=na(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Wf=W({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Lo(e,t){if(t){if(Wf[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function Ro(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var To=null;function Pi(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var zo=null,nn=null,rn=null;function xu(e){if(e=dr(e)){if(typeof zo!="function")throw Error(k(280));var t=e.stateNode;t&&(t=El(t),zo(e.stateNode,e.type,t))}}function la(e){nn?rn?rn.push(e):rn=[e]:nn=e}function oa(){if(nn){var e=nn,t=rn;if(rn=nn=null,xu(e),t)for(e=0;e>>=0,e===0?32:31-(ed(e)/td|0)|0}var _r=64,xr=4194304;function On(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Zr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var u=i&~l;u!==0?r=On(u):(o&=i,o!==0&&(r=On(o)))}else i=n&~l,i!==0?r=On(i):o!==0&&(r=On(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function cr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ie(t),e[t]=n}function od(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Dn),ju=" ",Ou=!1;function Ca(e,t){switch(e){case"keyup":return Od.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Qt=!1;function Md(e,t){switch(e){case"compositionend":return Pa(t);case"keypress":return t.which!==32?null:(Ou=!0,ju);case"textInput":return e=t.data,e===ju&&Ou?null:e;default:return null}}function Fd(e,t){if(Qt)return e==="compositionend"||!Ii&&Ca(e,t)?(e=xa(),Ur=zi=it=null,Qt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Du(n)}}function Ta(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ta(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function za(){for(var e=window,t=Yr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Yr(e.document)}return t}function Mi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Qd(e){var t=za(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ta(n.ownerDocument.documentElement,n)){if(r!==null&&Mi(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Uu(n,o);var i=Uu(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Kt=null,Do=null,$n=null,Uo=!1;function $u(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Uo||Kt==null||Kt!==Yr(r)||(r=Kt,"selectionStart"in r&&Mi(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),$n&&Zn($n,r)||($n=r,r=el(Do,"onSelect"),0Gt||(e.current=Ho[Gt],Ho[Gt]=null,Gt--)}function F(e,t){Gt++,Ho[Gt]=e.current,e.current=t}var wt={},ie=kt(wt),he=kt(!1),It=wt;function cn(e,t){var n=e.type.contextTypes;if(!n)return wt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function me(e){return e=e.childContextTypes,e!=null}function nl(){U(he),U(ie)}function Ku(e,t,n){if(ie.current!==wt)throw Error(k(168));F(ie,t),F(he,n)}function Aa(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,Af(e)||"Unknown",l));return W({},n,r)}function rl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||wt,It=ie.current,F(ie,e),F(he,he.current),!0}function Yu(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=Aa(e,t,It),r.__reactInternalMemoizedMergedChildContext=e,U(he),U(ie),F(ie,e)):U(he),F(he,n)}var We=null,Cl=!1,lo=!1;function Ba(e){We===null?We=[e]:We.push(e)}function rp(e){Cl=!0,Ba(e)}function _t(){if(!lo&&We!==null){lo=!0;var e=0,t=M;try{var n=We;for(M=1;e>=i,l-=i,Qe=1<<32-Ie(t)+l|n<R?(A=L,L=null):A=L.sibling;var z=m(f,L,d[R],v);if(z===null){L===null&&(L=A);break}e&&L&&z.alternate===null&&t(f,L),c=o(z,c,R),N===null?E=z:N.sibling=z,N=z,L=A}if(R===d.length)return n(f,L),$&&Nt(f,R),E;if(L===null){for(;RR?(A=L,L=null):A=L.sibling;var ge=m(f,L,z.value,v);if(ge===null){L===null&&(L=A);break}e&&L&&ge.alternate===null&&t(f,L),c=o(ge,c,R),N===null?E=ge:N.sibling=ge,N=ge,L=A}if(z.done)return n(f,L),$&&Nt(f,R),E;if(L===null){for(;!z.done;R++,z=d.next())z=p(f,z.value,v),z!==null&&(c=o(z,c,R),N===null?E=z:N.sibling=z,N=z);return $&&Nt(f,R),E}for(L=r(f,L);!z.done;R++,z=d.next())z=w(L,f,R,z.value,v),z!==null&&(e&&z.alternate!==null&&L.delete(z.key===null?R:z.key),c=o(z,c,R),N===null?E=z:N.sibling=z,N=z);return e&&L.forEach(function(kn){return t(f,kn)}),$&&Nt(f,R),E}function x(f,c,d,v){if(typeof d=="object"&&d!==null&&d.type===Ht&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case wr:e:{for(var E=d.key,N=c;N!==null;){if(N.key===E){if(E=d.type,E===Ht){if(N.tag===7){n(f,N.sibling),c=l(N,d.props.children),c.return=f,f=c;break e}}else if(N.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===nt&&Ju(E)===N.type){n(f,N.sibling),c=l(N,d.props),c.ref=Ln(f,N,d),c.return=f,f=c;break e}n(f,N);break}else t(f,N);N=N.sibling}d.type===Ht?(c=Ot(d.props.children,f.mode,v,d.key),c.return=f,f=c):(v=Kr(d.type,d.key,d.props,null,f.mode,v),v.ref=Ln(f,c,d),v.return=f,f=v)}return i(f);case Wt:e:{for(N=d.key;c!==null;){if(c.key===N)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(f,c.sibling),c=l(c,d.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=po(d,f.mode,v),c.return=f,f=c}return i(f);case nt:return N=d._init,x(f,c,N(d._payload),v)}if(jn(d))return y(f,c,d,v);if(xn(d))return S(f,c,d,v);Tr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,d),c.return=f,f=c):(n(f,c),c=fo(d,f.mode,v),c.return=f,f=c),i(f)):n(f,c)}return x}var dn=Qa(!0),Ka=Qa(!1),il=kt(null),ul=null,qt=null,$i=null;function Ai(){$i=qt=ul=null}function Bi(e){var t=il.current;U(il),e._currentValue=t}function Yo(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function on(e,t){ul=e,$i=qt=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(pe=!0),e.firstContext=null)}function Le(e){var t=e._currentValue;if($i!==e)if(e={context:e,memoizedValue:t,next:null},qt===null){if(ul===null)throw Error(k(308));qt=e,ul.dependencies={lanes:0,firstContext:e}}else qt=qt.next=e;return t}var Tt=null;function Vi(e){Tt===null?Tt=[e]:Tt.push(e)}function Ya(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Vi(t)):(n.next=l.next,l.next=n),t.interleaved=n,Ze(e,r)}function Ze(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var rt=!1;function Wi(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Xa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Xe(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,I&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Ze(e,n)}return l=r.interleaved,l===null?(t.next=t,Vi(r)):(t.next=l.next,l.next=t),r.interleaved=t,Ze(e,n)}function Ar(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Li(e,n)}}function Zu(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=i:o=o.next=i,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function sl(e,t,n,r){var l=e.updateQueue;rt=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,u=l.shared.pending;if(u!==null){l.shared.pending=null;var s=u,a=s.next;s.next=null,i===null?o=a:i.next=a,i=s;var h=e.alternate;h!==null&&(h=h.updateQueue,u=h.lastBaseUpdate,u!==i&&(u===null?h.firstBaseUpdate=a:u.next=a,h.lastBaseUpdate=s))}if(o!==null){var p=l.baseState;i=0,h=a=s=null,u=o;do{var m=u.lane,w=u.eventTime;if((r&m)===m){h!==null&&(h=h.next={eventTime:w,lane:0,tag:u.tag,payload:u.payload,callback:u.callback,next:null});e:{var y=e,S=u;switch(m=t,w=n,S.tag){case 1:if(y=S.payload,typeof y=="function"){p=y.call(w,p,m);break e}p=y;break e;case 3:y.flags=y.flags&-65537|128;case 0:if(y=S.payload,m=typeof y=="function"?y.call(w,p,m):y,m==null)break e;p=W({},p,m);break e;case 2:rt=!0}}u.callback!==null&&u.lane!==0&&(e.flags|=64,m=l.effects,m===null?l.effects=[u]:m.push(u))}else w={eventTime:w,lane:m,tag:u.tag,payload:u.payload,callback:u.callback,next:null},h===null?(a=h=w,s=p):h=h.next=w,i|=m;if(u=u.next,u===null){if(u=l.shared.pending,u===null)break;m=u,u=m.next,m.next=null,l.lastBaseUpdate=m,l.shared.pending=null}}while(!0);if(h===null&&(s=p),l.baseState=s,l.firstBaseUpdate=a,l.lastBaseUpdate=h,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Dt|=i,e.lanes=i,e.memoizedState=p}}function qu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=io.transition;io.transition={};try{e(!1),t()}finally{M=n,io.transition=r}}function fc(){return Re().memoizedState}function up(e,t,n){var r=mt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},dc(e))pc(t,n);else if(n=Ya(e,t,n,r),n!==null){var l=ae();Me(n,e,r,l),hc(n,t,r)}}function sp(e,t,n){var r=mt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(dc(e))pc(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,u=o(i,n);if(l.hasEagerState=!0,l.eagerState=u,Fe(u,i)){var s=t.interleaved;s===null?(l.next=l,Vi(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Ya(e,t,l,r),n!==null&&(l=ae(),Me(n,e,r,l),hc(n,t,r))}}function dc(e){var t=e.alternate;return e===V||t!==null&&t===V}function pc(e,t){An=cl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Li(e,n)}}var fl={readContext:Le,useCallback:re,useContext:re,useEffect:re,useImperativeHandle:re,useInsertionEffect:re,useLayoutEffect:re,useMemo:re,useReducer:re,useRef:re,useState:re,useDebugValue:re,useDeferredValue:re,useTransition:re,useMutableSource:re,useSyncExternalStore:re,useId:re,unstable_isNewReconciler:!1},ap={readContext:Le,useCallback:function(e,t){return Ue().memoizedState=[e,t===void 0?null:t],e},useContext:Le,useEffect:es,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Vr(4194308,4,ic.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Vr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Vr(4,2,e,t)},useMemo:function(e,t){var n=Ue();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ue();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=up.bind(null,V,e),[r.memoizedState,e]},useRef:function(e){var t=Ue();return e={current:e},t.memoizedState=e},useState:bu,useDebugValue:Zi,useDeferredValue:function(e){return Ue().memoizedState=e},useTransition:function(){var e=bu(!1),t=e[0];return e=ip.bind(null,e[1]),Ue().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=V,l=Ue();if($){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),b===null)throw Error(k(349));Ft&30||qa(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,es(ec.bind(null,r,o,e),[e]),r.flags|=2048,or(9,ba.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ue(),t=b.identifierPrefix;if($){var n=Ke,r=Qe;n=(r&~(1<<32-Ie(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=rr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[$e]=t,e[er]=r,Ec(e,t,!1,!1),t.stateNode=e;e:{switch(i=Ro(n,r),n){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lmn&&(t.flags|=128,r=!0,Rn(o,!1),t.lanes=4194304)}else{if(!r)if(e=al(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Rn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!$)return le(t),null}else 2*Y()-o.renderingStartTime>mn&&n!==1073741824&&(t.flags|=128,r=!0,Rn(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Y(),t.sibling=null,n=B.current,F(B,r?n&1|2:n&1),t):(le(t),null);case 22:case 23:return ru(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ye&1073741824&&(le(t),t.subtreeFlags&6&&(t.flags|=8192)):le(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function gp(e,t){switch(Di(t),t.tag){case 1:return me(t.type)&&nl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pn(),U(he),U(ie),Ki(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Qi(t),null;case 13:if(U(B),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));fn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return U(B),null;case 4:return pn(),null;case 10:return Bi(t.type._context),null;case 22:case 23:return ru(),null;case 24:return null;default:return null}}var jr=!1,oe=!1,yp=typeof WeakSet=="function"?WeakSet:Set,C=null;function bt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){H(e,t,r)}else n.current=null}function ni(e,t,n){try{n()}catch(r){H(e,t,r)}}var fs=!1;function wp(e,t){if($o=qr,e=za(),Mi(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,u=-1,s=-1,a=0,h=0,p=e,m=null;t:for(;;){for(var w;p!==n||l!==0&&p.nodeType!==3||(u=i+l),p!==o||r!==0&&p.nodeType!==3||(s=i+r),p.nodeType===3&&(i+=p.nodeValue.length),(w=p.firstChild)!==null;)m=p,p=w;for(;;){if(p===e)break t;if(m===n&&++a===l&&(u=i),m===o&&++h===r&&(s=i),(w=p.nextSibling)!==null)break;p=m,m=p.parentNode}p=w}n=u===-1||s===-1?null:{start:u,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ao={focusedElem:e,selectionRange:n},qr=!1,C=t;C!==null;)if(t=C,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,C=e;else for(;C!==null;){t=C;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var S=y.memoizedProps,x=y.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?S:ze(t.type,S),x);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(v){H(t,t.return,v)}if(e=t.sibling,e!==null){e.return=t.return,C=e;break}C=t.return}return y=fs,fs=!1,y}function Bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&ni(t,n,o)}l=l.next}while(l!==r)}}function Ll(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ri(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Nc(e){var t=e.alternate;t!==null&&(e.alternate=null,Nc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[$e],delete t[er],delete t[Wo],delete t[tp],delete t[np])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Lc(e){return e.tag===5||e.tag===3||e.tag===4}function ds(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Lc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function li(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=tl));else if(r!==4&&(e=e.child,e!==null))for(li(e,t,n),e=e.sibling;e!==null;)li(e,t,n),e=e.sibling}function oi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(oi(e,t,n),e=e.sibling;e!==null;)oi(e,t,n),e=e.sibling}var ee=null,je=!1;function tt(e,t,n){for(n=n.child;n!==null;)Rc(e,t,n),n=n.sibling}function Rc(e,t,n){if(Ae&&typeof Ae.onCommitFiberUnmount=="function")try{Ae.onCommitFiberUnmount(Sl,n)}catch{}switch(n.tag){case 5:oe||bt(n,t);case 6:var r=ee,l=je;ee=null,tt(e,t,n),ee=r,je=l,ee!==null&&(je?(e=ee,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):ee.removeChild(n.stateNode));break;case 18:ee!==null&&(je?(e=ee,n=n.stateNode,e.nodeType===8?ro(e.parentNode,n):e.nodeType===1&&ro(e,n),Gn(e)):ro(ee,n.stateNode));break;case 4:r=ee,l=je,ee=n.stateNode.containerInfo,je=!0,tt(e,t,n),ee=r,je=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&ni(n,t,i),l=l.next}while(l!==r)}tt(e,t,n);break;case 1:if(!oe&&(bt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){H(n,t,u)}tt(e,t,n);break;case 21:tt(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,tt(e,t,n),oe=r):tt(e,t,n);break;default:tt(e,t,n)}}function ps(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new yp),t.forEach(function(r){var l=Lp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Te(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=Y()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*kp(r/1960))-r,10e?16:e,ut===null)var r=!1;else{if(e=ut,ut=null,hl=0,I&6)throw Error(k(331));var l=I;for(I|=4,C=e.current;C!==null;){var o=C,i=o.child;if(C.flags&16){var u=o.deletions;if(u!==null){for(var s=0;sY()-tu?jt(e,0):eu|=n),ve(e,t)}function Dc(e,t){t===0&&(e.mode&1?(t=xr,xr<<=1,!(xr&130023424)&&(xr=4194304)):t=1);var n=ae();e=Ze(e,t),e!==null&&(cr(e,t,n),ve(e,n))}function Np(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Dc(e,n)}function Lp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Dc(e,n)}var Uc;Uc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||he.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,mp(e,t,n);pe=!!(e.flags&131072)}else pe=!1,$&&t.flags&1048576&&Va(t,ol,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Wr(e,t),e=t.pendingProps;var l=cn(t,ie.current);on(t,n),l=Xi(null,t,r,e,l,n);var o=Gi();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,me(r)?(o=!0,rl(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Wi(t),l.updater=Nl,t.stateNode=l,l._reactInternals=t,Go(t,r,e,n),t=qo(null,t,r,!0,o,n)):(t.tag=0,$&&o&&Fi(t),se(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Wr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Tp(r),e=ze(r,e),l){case 0:t=Zo(null,t,r,e,n);break e;case 1:t=ss(null,t,r,e,n);break e;case 11:t=is(null,t,r,e,n);break e;case 14:t=us(null,t,r,ze(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Zo(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),ss(e,t,r,l,n);case 3:e:{if(kc(t),e===null)throw Error(k(387));r=t.pendingProps,o=t.memoizedState,l=o.element,Xa(e,t),sl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=hn(Error(k(423)),t),t=as(e,t,r,n,l);break e}else if(r!==l){l=hn(Error(k(424)),t),t=as(e,t,r,n,l);break e}else for(we=dt(t.stateNode.containerInfo.firstChild),Se=t,$=!0,Oe=null,n=Ka(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(fn(),r===l){t=qe(e,t,n);break e}se(e,t,r,n)}t=t.child}return t;case 5:return Ga(t),e===null&&Ko(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,Bo(r,l)?i=null:o!==null&&Bo(r,o)&&(t.flags|=32),Sc(e,t),se(e,t,i,n),t.child;case 6:return e===null&&Ko(t),null;case 13:return _c(e,t,n);case 4:return Hi(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=dn(t,null,r,n):se(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),is(e,t,r,l,n);case 7:return se(e,t,t.pendingProps,n),t.child;case 8:return se(e,t,t.pendingProps.children,n),t.child;case 12:return se(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,F(il,r._currentValue),r._currentValue=i,o!==null)if(Fe(o.value,i)){if(o.children===l.children&&!he.current){t=qe(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){i=o.child;for(var s=u.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Xe(-1,n&-n),s.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var h=a.pending;h===null?s.next=s:(s.next=h.next,h.next=s),a.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),Yo(o.return,n,t),u.lanes|=n;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(k(341));i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Yo(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}se(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,on(t,n),l=Le(l),r=r(l),t.flags|=1,se(e,t,r,n),t.child;case 14:return r=t.type,l=ze(r,t.pendingProps),l=ze(r.type,l),us(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Wr(e,t),t.tag=1,me(r)?(e=!0,rl(t)):e=!1,on(t,n),mc(t,r,l),Go(t,r,l,n),qo(null,t,r,!0,e,n);case 19:return xc(e,t,n);case 22:return wc(e,t,n)}throw Error(k(156,t.tag))};function $c(e,t){return da(e,t)}function Rp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pe(e,t,n,r){return new Rp(e,t,n,r)}function ou(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Tp(e){if(typeof e=="function")return ou(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ei)return 11;if(e===Ci)return 14}return 2}function vt(e,t){var n=e.alternate;return n===null?(n=Pe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Kr(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")ou(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Ht:return Ot(n.children,l,o,t);case xi:i=8,l|=8;break;case wo:return e=Pe(12,n,t,l|2),e.elementType=wo,e.lanes=o,e;case So:return e=Pe(13,n,t,l),e.elementType=So,e.lanes=o,e;case ko:return e=Pe(19,n,t,l),e.elementType=ko,e.lanes=o,e;case Gs:return Tl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ys:i=10;break e;case Xs:i=9;break e;case Ei:i=11;break e;case Ci:i=14;break e;case nt:i=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=Pe(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Ot(e,t,n,r){return e=Pe(7,e,r,t),e.lanes=n,e}function Tl(e,t,n,r){return e=Pe(22,e,r,t),e.elementType=Gs,e.lanes=n,e.stateNode={isHidden:!1},e}function fo(e,t,n){return e=Pe(6,e,null,t),e.lanes=n,e}function po(e,t,n){return t=Pe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Kl(0),this.expirationTimes=Kl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Kl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function iu(e,t,n,r,l,o,i,u,s){return e=new zp(e,t,n,u,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Pe(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Wi(o),e}function jp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Wc)}catch(e){console.error(e)}}Wc(),Ws.exports=_e;var Dp=Ws.exports,Hc,ks=Dp;Hc=ks.createRoot,ks.hydrateRoot;/** + * @remix-run/router v1.18.0 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function ur(){return ur=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function cu(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function $p(){return Math.random().toString(36).substr(2,8)}function xs(e,t){return{usr:e.state,key:e.key,idx:t}}function ci(e,t,n,r){return n===void 0&&(n=null),ur({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Bt(t):t,{state:n,key:t&&t.key||r||$p()})}function gl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Bt(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Ap(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:o=!1}=r,i=l.history,u=st.Pop,s=null,a=h();a==null&&(a=0,i.replaceState(ur({},i.state,{idx:a}),""));function h(){return(i.state||{idx:null}).idx}function p(){u=st.Pop;let x=h(),f=x==null?null:x-a;a=x,s&&s({action:u,location:S.location,delta:f})}function m(x,f){u=st.Push;let c=ci(S.location,x,f);n&&n(c,x),a=h()+1;let d=xs(c,a),v=S.createHref(c);try{i.pushState(d,"",v)}catch(E){if(E instanceof DOMException&&E.name==="DataCloneError")throw E;l.location.assign(v)}o&&s&&s({action:u,location:S.location,delta:1})}function w(x,f){u=st.Replace;let c=ci(S.location,x,f);n&&n(c,x),a=h();let d=xs(c,a),v=S.createHref(c);i.replaceState(d,"",v),o&&s&&s({action:u,location:S.location,delta:0})}function y(x){let f=l.location.origin!=="null"?l.location.origin:l.location.href,c=typeof x=="string"?x:gl(x);return c=c.replace(/ $/,"%20"),Q(f,"No window.location.(origin|href) available to create URL for href: "+c),new URL(c,f)}let S={get action(){return u},get location(){return e(l,i)},listen(x){if(s)throw new Error("A history only accepts one active listener");return l.addEventListener(_s,p),s=x,()=>{l.removeEventListener(_s,p),s=null}},createHref(x){return t(l,x)},createURL:y,encodeLocation(x){let f=y(x);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:m,replace:w,go(x){return i.go(x)}};return S}var Es;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Es||(Es={}));function Bp(e,t,n){return n===void 0&&(n="/"),Vp(e,t,n)}function Vp(e,t,n,r){let l=typeof t=="string"?Bt(t):t,o=vn(l.pathname||"/",n);if(o==null)return null;let i=Qc(e);Wp(i);let u=null;for(let s=0;u==null&&s{let s={relativePath:u===void 0?o.path||"":u,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};s.relativePath.startsWith("/")&&(Q(s.relativePath.startsWith(r),'Absolute route path "'+s.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),s.relativePath=s.relativePath.slice(r.length));let a=gt([r,s.relativePath]),h=n.concat(s);o.children&&o.children.length>0&&(Q(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+a+'".')),Qc(o.children,t,h,a)),!(o.path==null&&!o.index)&&t.push({path:a,score:Jp(a,o.index),routesMeta:h})};return e.forEach((o,i)=>{var u;if(o.path===""||!((u=o.path)!=null&&u.includes("?")))l(o,i);else for(let s of Kc(o.path))l(o,i,s)}),t}function Kc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return l?[o,""]:[o];let i=Kc(r.join("/")),u=[];return u.push(...i.map(s=>s===""?o:[o,s].join("/"))),l&&u.push(...i),u.map(s=>e.startsWith("/")&&s===""?"/":s)}function Wp(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:Zp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Hp=/^:[\w-]+$/,Qp=3,Kp=2,Yp=1,Xp=10,Gp=-2,Cs=e=>e==="*";function Jp(e,t){let n=e.split("/"),r=n.length;return n.some(Cs)&&(r+=Gp),t&&(r+=Kp),n.filter(l=>!Cs(l)).reduce((l,o)=>l+(Hp.test(o)?Qp:o===""?Yp:Xp),r)}function Zp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function qp(e,t,n){let{routesMeta:r}=e,l={},o="/",i=[];for(let u=0;u{let{paramName:m,isOptional:w}=h;if(m==="*"){let S=u[p]||"";i=o.slice(0,o.length-S.length).replace(/(.)\/+$/,"$1")}const y=u[p];return w&&!y?a[m]=void 0:a[m]=(y||"").replace(/%2F/g,"/"),a},{}),pathname:o,pathnameBase:i,pattern:e}}function bp(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),cu(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(i,u,s)=>(r.push({paramName:u,isOptional:s!=null}),s?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function eh(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return cu(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function vn(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function th(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?Bt(e):e;return{pathname:n?n.startsWith("/")?n:nh(n,t):t,search:oh(r),hash:ih(l)}}function nh(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function ho(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function rh(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function Yc(e,t){let n=rh(e);return t?n.map((r,l)=>l===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Xc(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=Bt(e):(l=ur({},e),Q(!l.pathname||!l.pathname.includes("?"),ho("?","pathname","search",l)),Q(!l.pathname||!l.pathname.includes("#"),ho("#","pathname","hash",l)),Q(!l.search||!l.search.includes("#"),ho("#","search","hash",l)));let o=e===""||l.pathname==="",i=o?"/":l.pathname,u;if(i==null)u=n;else{let p=t.length-1;if(!r&&i.startsWith("..")){let m=i.split("/");for(;m[0]==="..";)m.shift(),p-=1;l.pathname=m.join("/")}u=p>=0?t[p]:"/"}let s=th(l,u),a=i&&i!=="/"&&i.endsWith("/"),h=(o||i===".")&&n.endsWith("/");return!s.pathname.endsWith("/")&&(a||h)&&(s.pathname+="/"),s}const gt=e=>e.join("/").replace(/\/\/+/g,"/"),lh=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),oh=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,ih=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function uh(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Gc=["post","put","patch","delete"];new Set(Gc);const sh=["get",...Gc];new Set(sh);/** + * React Router v6.25.1 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function sr(){return sr=Object.assign?Object.assign.bind():function(e){for(var t=1;t{u.current=!0}),g.useCallback(function(a,h){if(h===void 0&&(h={}),!u.current)return;if(typeof a=="number"){r.go(a);return}let p=Xc(a,JSON.parse(i),o,h.relative==="path");e==null&&t!=="/"&&(p.pathname=p.pathname==="/"?t:gt([t,p.pathname])),(h.replace?r.replace:r.push)(p,h.state,h)},[t,r,i,o,e])}const fh=g.createContext(null);function dh(e){let t=g.useContext(et).outlet;return t&&g.createElement(fh.Provider,{value:e},t)}function am(){let{matches:e}=g.useContext(et),t=e[e.length-1];return t?t.params:{}}function Dl(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=g.useContext(xt),{matches:l}=g.useContext(et),{pathname:o}=Et(),i=JSON.stringify(Yc(l,r.v7_relativeSplatPath));return g.useMemo(()=>Xc(e,JSON.parse(i),o,n==="path"),[e,i,o,n])}function ph(e,t){return hh(e,t)}function hh(e,t,n,r){hr()||Q(!1);let{navigator:l}=g.useContext(xt),{matches:o}=g.useContext(et),i=o[o.length-1],u=i?i.params:{};i&&i.pathname;let s=i?i.pathnameBase:"/";i&&i.route;let a=Et(),h;if(t){var p;let x=typeof t=="string"?Bt(t):t;s==="/"||(p=x.pathname)!=null&&p.startsWith(s)||Q(!1),h=x}else h=a;let m=h.pathname||"/",w=m;if(s!=="/"){let x=s.replace(/^\//,"").split("/");w="/"+m.replace(/^\//,"").split("/").slice(x.length).join("/")}let y=Bp(e,{pathname:w}),S=wh(y&&y.map(x=>Object.assign({},x,{params:Object.assign({},u,x.params),pathname:gt([s,l.encodeLocation?l.encodeLocation(x.pathname).pathname:x.pathname]),pathnameBase:x.pathnameBase==="/"?s:gt([s,l.encodeLocation?l.encodeLocation(x.pathnameBase).pathname:x.pathnameBase])})),o,n,r);return t&&S?g.createElement(Fl.Provider,{value:{location:sr({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:st.Pop}},S):S}function mh(){let e=xh(),t=uh(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return g.createElement(g.Fragment,null,g.createElement("h2",null,"Unexpected Application Error!"),g.createElement("h3",{style:{fontStyle:"italic"}},t),n?g.createElement("pre",{style:l},n):null,null)}const vh=g.createElement(mh,null);class gh extends g.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?g.createElement(et.Provider,{value:this.props.routeContext},g.createElement(Zc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function yh(e){let{routeContext:t,match:n,children:r}=e,l=g.useContext(Ml);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),g.createElement(et.Provider,{value:t},r)}function wh(e,t,n,r){var l;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var o;if((o=n)!=null&&o.errors)e=n.matches;else return null}let i=e,u=(l=n)==null?void 0:l.errors;if(u!=null){let h=i.findIndex(p=>p.route.id&&(u==null?void 0:u[p.route.id])!==void 0);h>=0||Q(!1),i=i.slice(0,Math.min(i.length,h+1))}let s=!1,a=-1;if(n&&r&&r.v7_partialHydration)for(let h=0;h=0?i=i.slice(0,a+1):i=[i[0]];break}}}return i.reduceRight((h,p,m)=>{let w,y=!1,S=null,x=null;n&&(w=u&&p.route.id?u[p.route.id]:void 0,S=p.route.errorElement||vh,s&&(a<0&&m===0?(Ch("route-fallback"),y=!0,x=null):a===m&&(y=!0,x=p.route.hydrateFallbackElement||null)));let f=t.concat(i.slice(0,m+1)),c=()=>{let d;return w?d=S:y?d=x:p.route.Component?d=g.createElement(p.route.Component,null):p.route.element?d=p.route.element:d=h,g.createElement(yh,{match:p,routeContext:{outlet:h,matches:f,isDataRoute:n!=null},children:d})};return n&&(p.route.ErrorBoundary||p.route.errorElement||m===0)?g.createElement(gh,{location:n.location,revalidation:n.revalidation,component:S,error:w,children:c(),routeContext:{outlet:null,matches:f,isDataRoute:!0}}):c()},null)}var ef=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(ef||{}),tf=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(tf||{});function Sh(e){let t=g.useContext(Ml);return t||Q(!1),t}function kh(e){let t=g.useContext(Jc);return t||Q(!1),t}function _h(e){let t=g.useContext(et);return t||Q(!1),t}function nf(e){let t=_h(),n=t.matches[t.matches.length-1];return n.route.id||Q(!1),n.route.id}function xh(){var e;let t=g.useContext(Zc),n=kh(),r=nf();return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function Eh(){let{router:e}=Sh(ef.UseNavigateStable),t=nf(tf.UseNavigateStable),n=g.useRef(!1);return qc(()=>{n.current=!0}),g.useCallback(function(l,o){o===void 0&&(o={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,sr({fromRouteId:t},o)))},[e,t])}const Ps={};function Ch(e,t,n){Ps[e]||(Ps[e]=!0)}function Ph(e){return dh(e.context)}function ue(e){Q(!1)}function Nh(e){let{basename:t="/",children:n=null,location:r,navigationType:l=st.Pop,navigator:o,static:i=!1,future:u}=e;hr()&&Q(!1);let s=t.replace(/^\/*/,"/"),a=g.useMemo(()=>({basename:s,navigator:o,static:i,future:sr({v7_relativeSplatPath:!1},u)}),[s,u,o,i]);typeof r=="string"&&(r=Bt(r));let{pathname:h="/",search:p="",hash:m="",state:w=null,key:y="default"}=r,S=g.useMemo(()=>{let x=vn(h,s);return x==null?null:{location:{pathname:x,search:p,hash:m,state:w,key:y},navigationType:l}},[s,h,p,m,w,y,l]);return S==null?null:g.createElement(xt.Provider,{value:a},g.createElement(Fl.Provider,{children:n,value:S}))}function Lh(e){let{children:t,location:n}=e;return ph(di(t),n)}new Promise(()=>{});function di(e,t){t===void 0&&(t=[]);let n=[];return g.Children.forEach(e,(r,l)=>{if(!g.isValidElement(r))return;let o=[...t,l];if(r.type===g.Fragment){n.push.apply(n,di(r.props.children,o));return}r.type!==ue&&Q(!1),!r.props.index||!r.props.children||Q(!1);let i={id:r.props.id||o.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(i.children=di(r.props.children,o)),n.push(i)}),n}/** + * React Router DOM v6.25.1 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function yl(){return yl=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function Rh(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Th(e,t){return e.button===0&&(!t||t==="_self")&&!Rh(e)}function pi(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(l=>[n,l]):[[n,r]])},[]))}function zh(e,t){let n=pi(e);return t&&t.forEach((r,l)=>{n.has(l)||t.getAll(l).forEach(o=>{n.append(l,o)})}),n}const jh=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"],Oh=["aria-current","caseSensitive","className","end","style","to","unstable_viewTransition","children"],Ih="6";try{window.__reactRouterVersion=Ih}catch{}const Mh=g.createContext({isTransitioning:!1}),Fh="startTransition",Ns=Pf[Fh];function Dh(e){let{basename:t,children:n,future:r,window:l}=e,o=g.useRef();o.current==null&&(o.current=Up({window:l,v5Compat:!0}));let i=o.current,[u,s]=g.useState({action:i.action,location:i.location}),{v7_startTransition:a}=r||{},h=g.useCallback(p=>{a&&Ns?Ns(()=>s(p)):s(p)},[s,a]);return g.useLayoutEffect(()=>i.listen(h),[i,h]),g.createElement(Nh,{basename:t,children:n,location:u.location,navigationType:u.action,navigator:i,future:r})}const Uh=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",$h=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,sn=g.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:o,replace:i,state:u,target:s,to:a,preventScrollReset:h,unstable_viewTransition:p}=t,m=rf(t,jh),{basename:w}=g.useContext(xt),y,S=!1;if(typeof a=="string"&&$h.test(a)&&(y=a,Uh))try{let d=new URL(window.location.href),v=a.startsWith("//")?new URL(d.protocol+a):new URL(a),E=vn(v.pathname,w);v.origin===d.origin&&E!=null?a=E+v.search+v.hash:S=!0}catch{}let x=ah(a,{relative:l}),f=Bh(a,{replace:i,state:u,target:s,preventScrollReset:h,relative:l,unstable_viewTransition:p});function c(d){r&&r(d),d.defaultPrevented||f(d)}return g.createElement("a",yl({},m,{href:y||x,onClick:S||o?r:c,ref:n,target:s}))}),mo=g.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:l=!1,className:o="",end:i=!1,style:u,to:s,unstable_viewTransition:a,children:h}=t,p=rf(t,Oh),m=Dl(s,{relative:p.relative}),w=Et(),y=g.useContext(Jc),{navigator:S,basename:x}=g.useContext(xt),f=y!=null&&Wh(m)&&a===!0,c=S.encodeLocation?S.encodeLocation(m).pathname:m.pathname,d=w.pathname,v=y&&y.navigation&&y.navigation.location?y.navigation.location.pathname:null;l||(d=d.toLowerCase(),v=v?v.toLowerCase():null,c=c.toLowerCase()),v&&x&&(v=vn(v,x)||v);const E=c!=="/"&&c.endsWith("/")?c.length-1:c.length;let N=d===c||!i&&d.startsWith(c)&&d.charAt(E)==="/",L=v!=null&&(v===c||!i&&v.startsWith(c)&&v.charAt(c.length)==="/"),R={isActive:N,isPending:L,isTransitioning:f},A=N?r:void 0,z;typeof o=="function"?z=o(R):z=[o,N?"active":null,L?"pending":null,f?"transitioning":null].filter(Boolean).join(" ");let ge=typeof u=="function"?u(R):u;return g.createElement(sn,yl({},p,{"aria-current":A,className:z,ref:n,style:ge,to:s,unstable_viewTransition:a}),typeof h=="function"?h(R):h)});var hi;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(hi||(hi={}));var Ls;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ls||(Ls={}));function Ah(e){let t=g.useContext(Ml);return t||Q(!1),t}function Bh(e,t){let{target:n,replace:r,state:l,preventScrollReset:o,relative:i,unstable_viewTransition:u}=t===void 0?{}:t,s=bc(),a=Et(),h=Dl(e,{relative:i});return g.useCallback(p=>{if(Th(p,n)){p.preventDefault();let m=r!==void 0?r:gl(a)===gl(h);s(e,{replace:m,state:l,preventScrollReset:o,relative:i,unstable_viewTransition:u})}},[a,s,h,r,l,n,e,o,i,u])}function Vh(e){let t=g.useRef(pi(e)),n=g.useRef(!1),r=Et(),l=g.useMemo(()=>zh(r.search,n.current?null:t.current),[r.search]),o=bc(),i=g.useCallback((u,s)=>{const a=pi(typeof u=="function"?u(l):u);n.current=!0,o("?"+a,s)},[o,l]);return[l,i]}function Wh(e,t){t===void 0&&(t={});let n=g.useContext(Mh);n==null&&Q(!1);let{basename:r}=Ah(hi.useViewTransitionState),l=Dl(e,{relative:t.relative});if(!n.isTransitioning)return!1;let o=vn(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=vn(n.nextLocation.pathname,r)||n.nextLocation.pathname;return fi(l.pathname,i)!=null||fi(l.pathname,o)!=null}var lf={exports:{}};/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/(function(e){(function(){var t={}.hasOwnProperty;function n(){for(var o="",i=0;i{try{const l=localStorage.getItem(e);return l?JSON.parse(l):t}catch(l){return localStorage.removeItem(e),alert(`Error reading localStorage key "${e}": ${l}`),t}});return g.useEffect(()=>{try{localStorage.setItem(e,JSON.stringify(n))}catch(l){throw new Error(`Error saving localStorage key "${e}": ${l}`)}},[e,n]),[n,r]}const Kh=()=>{const[e,t]=mi("theme","light");g.useEffect(()=>{document.body.classList.toggle("theme_dark",e==="dark")},[e]);const n=g.useCallback(()=>{t(e==="light"?"dark":"light")},[e,t]);return{theme:e,toggleTheme:n}},mr=g.createContext({allProducts:[],setAllProducts:()=>{},cart:[],setCart:()=>{},favorites:[],setFavorites:()=>{},updateQuantity:()=>{},clearShoppingCart:()=>{},isMenuOpen:!1,setIsMenuOpen:()=>{},toggleMenu:()=>{},toggleFavorites:()=>{},addToCart:()=>{},theme:"light",toggleTheme:()=>{}}),Yh=({children:e})=>{const{theme:t,toggleTheme:n}=Kh(),[r,l]=g.useState([]),[o,i]=mi("shoppingCart",[]),[u,s]=mi("favorites",[]),[a,h]=g.useState(!1);g.useEffect(()=>{Qh().then(f=>l(f))},[]);const p=g.useCallback((f,c)=>{i(d=>d.map(v=>v.id===f?{...v,quantity:c}:v).filter(v=>v.quantity>0))},[i]),m=g.useCallback(()=>h(f=>!f),[]);g.useEffect(()=>{const f=a?"hidden":"auto";return document.body.style.overflow=f,()=>{document.body.style.overflow="auto"}},[a]);const w=g.useCallback(f=>{if(f&&!o.some(d=>d.product.itemId===f.itemId)){const d={id:f.itemId,quantity:1,product:f};i(v=>[...v,d])}},[o,i]),y=g.useCallback(f=>{const c=u.some(d=>d.itemId===f.itemId);s(d=>c?d.filter(v=>v.itemId!==f.itemId):[...d,f])},[u,s]),S=g.useCallback(()=>{i([])},[i]),x=g.useMemo(()=>({allProducts:r,setAllProducts:l,cart:o,setCart:i,favorites:u,setFavorites:s,updateQuantity:p,clearShoppingCart:S,isMenuOpen:a,setIsMenuOpen:h,toggleMenu:m,toggleFavorites:y,addToCart:w,theme:t,toggleTheme:n}),[r,o,u,l,i,s,S,p,a,h,m,y,w,t,n]);return _.jsx(mr.Provider,{value:x,children:e})},He={logo:{light:{title:"Logo icon",path:"/icons/logo.svg"},dark:{title:"Logo dark icon",path:"/icons/logo_dark.svg"}},close:{light:{title:"Close icon",path:"../../src/icons/Close.svg"},dark:{title:"Close dark icon",path:"../../src/icons/close_dark.svg"}},menu:{light:{title:"Menu icon",path:"../../src/icons/Menu.svg"},dark:{title:"Menu dark icon",path:"../../src/icons/menu_dark.svg"}},search:{light:{title:"Search icon",path:"../../src/icons/search.svg"},dark:{title:"Search dark icon",path:"../../src/icons/search_dark.svg"}},favorites:{light:{title:"Favorites icon",path:"../../src/icons/favorites.svg"},dark:{title:"Favorites dark icon",path:"../../src/icons/favorites_dark.svg"}},favorites__filled:{light:{title:"Favorites filled icon",path:"../../src/icons/favorites__filled.svg"},dark:{title:"Favorites filled dark icon",path:"../../src/icons/favorites__filled.svg"}},shopping_cart:{light:{title:"Shopping cart icon",path:"../../src/icons/shopping_cart.svg"},dark:{title:"Shopping cart dark icon",path:"../../src/icons/shopping_cart_dark.svg"}},arrow_left:{light:{title:"Arrow left icon",path:"../../src/icons/arrow_left.svg"},dark:{title:"Arrow left dark icon",path:"../../src/icons/arrow_left_dark.svg"}},arrow_left__disabled:{light:{title:"Arrow left disabled icon",path:"../../src/icons/arrow_left__disabled.svg"},dark:{title:"Arrow left disabled dark icon",path:"../../src/icons/arrow_left_dark__disabled.svg"}},arrow_right:{light:{title:"Arrow right icon",path:"../../src/icons/arrow_right.svg"},dark:{title:"Arrow right dark icon",path:"../../src/icons/arrow_right_dark.svg"}},arrow_right__disabled:{light:{title:"Arrow right disabled icon",path:"../../src/icons/arrow_right__disabled.svg"},dark:{title:"Arrow right disabled dark icon",path:"../../src/icons/arrow_right_dark__disabled.svg"}},arrow_down:{light:{title:"Arrow down icon",path:"../../src/icons/arrow_down_dark.svg"},dark:{title:"Arrow down dark icon",path:"../../src/icons/arrow_down_dark.svg"}},home:{light:{title:"Home icon",path:"../../src/icons/Home.svg"},dark:{title:"Home dark icon",path:"../../src/icons/home_dark.svg"}},plus:{light:{title:"Plus icon",path:"../../src/icons/Plus.svg"},dark:{title:"Plus dark icon",path:"../../src/icons/Union.svg"}},minus:{light:{title:"Minus icon",path:"../../src/icons/Minus.svg"},dark:{title:"Minus dark icon",path:"../../src/icons/minus_dark.svg"}},minus__disabled:{light:{title:"Minus icon",path:"../../src/icons/minus__disabled.svg"},dark:{title:"Minus dark icon",path:"../../src/icons/MinusDarkDisabled.svg"}},ok:{light:{title:"ok",path:"../../src/icons/image 15.svg"},dark:{title:"ok",path:"../../src/icons/image 15.svg"}}},Ye=g.memo(({icon:e})=>_.jsx("img",{src:e.path,alt:e.title,className:"icon"}));Ye.displayName="icon";const uf=[{title:"Home",path:"/"},{title:"Phones",path:"/phones"},{title:"Tablets",path:"/tablets"},{title:"Accessories",path:"/accessories"}];function Xh(e,t){const n=new URLSearchParams(t);for(const[r,l]of Object.entries(e))l===null?n.delete(r):Array.isArray(l)?(n.delete(r),l.forEach(o=>n.append(r,o.toString()))):n.set(r,l.toString());return n.toString()}const Gh=()=>{const[e,t]=Vh(),n=e.get("query")||"",{theme:r}=g.useContext(mr),l=Et(),o=g.useMemo(()=>["/phones","/tablets","/accessories","/favorites"].includes(l.pathname),[l.pathname]),i=g.useCallback(()=>{t(a=>{const h=new URLSearchParams(a);return h.delete("query"),h})},[t]),u=g.useCallback(a=>{const h=Xh(a,e);t(h)},[e,t]),s=g.useCallback(a=>{u({query:a.target.value.trim()||null})},[u]);return g.useEffect(()=>{i()},[l.pathname]),o&&_.jsxs("div",{className:"header__search-wrapper",children:[_.jsx("input",{type:"text",placeholder:"Search product...",className:"header__search-input",value:n,onChange:s}),n?_.jsx("div",{className:"header__clear-button",onClick:i,children:_.jsx(Ye,{icon:He.close[r]})}):_.jsx(Ye,{icon:He.search[r]})]})},Jh=({isActive:e})=>fu("header__item",{"header__item--active":e}),Rs=({isActive:e})=>fu("header__icon",{"header__icon--active":e}),Zh=()=>{const{cart:e,favorites:t,toggleMenu:n,isMenuOpen:r,theme:l,toggleTheme:o}=g.useContext(mr),i=g.useMemo(()=>e.reduce((u,s)=>u+s.quantity,0),[e]);return _.jsxs("div",{className:"header",children:[_.jsx(sn,{to:"/",className:"header__logo-container",children:_.jsx(Ye,{icon:He.logo[l]})}),_.jsx("div",{className:"header__menu",children:_.jsx("div",{className:"header__list",children:uf.map(u=>_.jsx(mo,{to:u.path,className:Jh,children:u.title},u.title))})}),_.jsxs("div",{className:"header__buttons-right",children:[_.jsx(Gh,{}),_.jsx("div",{onClick:n,className:"header__icon header__icon--menu",children:_.jsx(Ye,{icon:r?He.close[l]:He.menu[l]})}),_.jsx("button",{className:"header__icon header__switch-theme",onClick:o,children:l==="light"?"Dark":"Light"}),_.jsxs("div",{className:fu("header__buttons-wrapper",{"header__buttons-wrapper--bottom":r}),onClick:()=>{r&&n()},children:[_.jsx(mo,{className:Rs,to:"/favorites",children:_.jsxs("div",{className:"header__icon-wrapper",children:[t.length?_.jsx("span",{className:"header__quantity",children:t.length}):null,_.jsx(Ye,{icon:He.favorites[l]})]})}),_.jsx(mo,{className:Rs,to:"/cart",children:_.jsxs("div",{className:"header__icon-wrapper",children:[_.jsx(Ye,{icon:He.shopping_cart[l]}),i>0&&_.jsx("span",{className:"header__quantity",children:i})]})})]})]})]})},qh=()=>{const{isMenuOpen:e,toggleMenu:t}=g.useContext(mr);return g.useEffect(()=>{const n=()=>{window.innerWidth>640&&e&&t()};return window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[e,t]),_.jsx("nav",{className:`menu ${e?"menu--open":""}`,children:_.jsx("div",{className:"menu__list",children:uf.map(n=>_.jsx(sn,{to:n.path,className:"menu__link",onClick:t,children:n.title},n.title))})})},bh=()=>{const{theme:e}=g.useContext(mr),t=g.useCallback(()=>{window.scrollTo({top:0,behavior:"smooth"})},[]);return _.jsx("div",{className:"footer",children:_.jsxs("div",{className:"footer__container",children:[_.jsx(Ye,{icon:He.logo[e]}),_.jsxs("div",{className:"footer__items",children:[_.jsx(sn,{to:"https://github.com/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Github"}),_.jsx(sn,{to:"/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Contacts"}),_.jsx(sn,{to:"/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Rights"})]}),_.jsxs("div",{className:"footer__block",onClick:t,children:[_.jsx("span",{className:"footer__button-title",children:"Back to top"}),_.jsx("button",{className:"footer__button",children:_.jsx(Ye,{icon:He.arrow_left[e]})})]})]})})},em=()=>{const e=Et();return g.useEffect(()=>{window.scrollTo({top:0,behavior:"smooth"})},[e.pathname]),_.jsxs("div",{className:"Layout",children:[_.jsx("header",{className:"Layout__header",children:_.jsx(Zh,{})}),_.jsx("div",{className:"Layout__menu",children:_.jsx(qh,{})}),_.jsx("main",{className:"Layout__content",children:_.jsx(g.Suspense,{children:_.jsx(Ph,{})})}),_.jsx("footer",{className:"Layout__footer",children:_.jsx(bh,{})})]})},tm="modulepreload",nm=function(e){return"/react_phone-catalog/"+e},Ts={},Sn=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),u=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));l=Promise.allSettled(n.map(s=>{if(s=nm(s),s in Ts)return;Ts[s]=!0;const a=s.endsWith(".css"),h=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${h}`))return;const p=document.createElement("link");if(p.rel=a?"stylesheet":tm,a||(p.as="script"),p.crossOrigin="",p.href=s,u&&p.setAttribute("nonce",u),document.head.appendChild(p),a)return new Promise((m,w)=>{p.addEventListener("load",m),p.addEventListener("error",()=>w(new Error(`Unable to preload CSS for ${s}`)))})}))}function o(i){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=i,window.dispatchEvent(u),!u.defaultPrevented)throw i}return l.then(i=>{for(const u of i||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})},rm=g.lazy(()=>Sn(async()=>{const{HomePage:e}=await import("./index--M-vjEFs.js");return{HomePage:e}},__vite__mapDeps([0,1,2,3,4,5])).then(({HomePage:e})=>({default:e}))),vo=g.lazy(()=>Sn(async()=>{const{ProductPage:e}=await import("./index-CDfWgnoX.js");return{ProductPage:e}},__vite__mapDeps([6,7,8,9,2,3,10,11,12,13])).then(({ProductPage:e})=>({default:e}))),go=g.lazy(()=>Sn(async()=>{const{ProductDetailsPage:e}=await import("./index-DZGfIgcM.js");return{ProductDetailsPage:e}},__vite__mapDeps([14,7,8,1,2,3,4,15,16,11,12,17])).then(({ProductDetailsPage:e})=>({default:e}))),lm=g.lazy(()=>Sn(async()=>{const{ShoppingCartPage:e}=await import("./index-D68rl43-.js");return{ShoppingCartPage:e}},__vite__mapDeps([18,15,16,19])).then(({ShoppingCartPage:e})=>({default:e}))),om=g.lazy(()=>Sn(async()=>{const{FavoritesPage:e}=await import("./index-C5E6A8ui.js");return{FavoritesPage:e}},__vite__mapDeps([20,9,2,3,10,7,8,21])).then(({FavoritesPage:e})=>({default:e}))),im=g.lazy(()=>Sn(async()=>{const{NotFoundPage:e}=await import("./index-C4ngy4_v.js");return{NotFoundPage:e}},__vite__mapDeps([22,23])).then(({NotFoundPage:e})=>({default:e}))),um=()=>_.jsx(Dh,{children:_.jsx(Lh,{children:_.jsxs(ue,{path:"/",element:_.jsx(em,{}),children:[_.jsx(ue,{index:!0,element:_.jsx(rm,{})}),_.jsxs(ue,{path:"phones",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"phones"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsxs(ue,{path:"tablets",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"tablets"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsxs(ue,{path:"accessories",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"accessories"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsx(ue,{path:"favorites",element:_.jsx(om,{})}),_.jsx(ue,{path:"cart",element:_.jsx(lm,{})}),_.jsx(ue,{path:"*",element:_.jsx(im,{})})]})})}),sm=()=>_.jsx(Yh,{children:_.jsx(um,{})});Hc(document.getElementById("root")).render(_.jsx(sm,{}));export{mr as G,Ye as I,sn as L,mo as N,Et as a,am as b,fu as c,bc as d,cm as g,He as i,_ as j,g as r,Vh as u}; diff --git a/public/assets/index-DlB5k-ir.css b/public/assets/index-DlB5k-ir.css new file mode 100644 index 00000000000..f1b90fea2c3 --- /dev/null +++ b/public/assets/index-DlB5k-ir.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.buttonUp{position:sticky;top:70px;cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);transform:rotate(90deg);transition:border-color .3s ease}.buttonUp:hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}body.theme_dark .buttonUp{border:1px solid var(--color-gray-icons-placeholders);background-color:none;transition:background-color .3s}body.theme_dark .buttonUp:hover{background-color:var(--color-gray-icons-placeholders)}.productsPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.productsPage{padding-inline:24px}}@media (min-width: 1200px){.productsPage{padding-inline:0;margin-inline:auto}}.productsPage__title{font-family:Mont-Bold,sans-serif;font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em;color:var(--color-gray-primary);margin-bottom:8px}@media (min-width: 640px){.productsPage__title{font-size:48px;line-height:56px}}.productsPage__description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)}.productsPage__dropdown{margin-top:32px;gap:16px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.productsPage__dropdown{--columns: 12}}@media (min-width: 1200px){.productsPage__dropdown{--columns: 24}}@media (min-width: 640px){.productsPage__dropdown{margin-top:40px}}.productsPage__dropdown--sortBy{grid-column:span 2}@media (min-width: 640px){.productsPage__dropdown--sortBy{grid-column:span 4}}.productsPage__dropdown--itemsPerPage{grid-column:span 2}@media (min-width: 640px){.productsPage__dropdown--itemsPerPage{grid-column:span 3}}.productsPage__content{display:flex;flex-wrap:wrap;gap:40px 16px;margin-top:24px}.productsPage__no-products{margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);text-align:center}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.dropdown{position:relative}.dropdown__label{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:700;color:var(--color-gray-secondary)}.dropdown__icon{width:16px;height:16px;transition:transform .3s ease}.dropdown__title{font-family:Mont-SemiBold,sans-serif;font-size:14px;line-height:14px;font-weight:700;color:var(--color-gray-primary)}.dropdown__options{position:absolute;width:100%;top:calc(100% + 8px);padding-block:8px;background-color:var(--color-bg);border:1px solid var(--color-gray-icons-placeholders);box-shadow:0 2px 5px #0000001a;max-height:200px;overflow-y:auto;transition:all .3s ease-in-out;z-index:1}.dropdown__option{padding:9px 12px;cursor:pointer;font-family:Mont-Regular,sans-serif;font-size:14px;line-height:14px;color:var(--color-gray-secondary)}.dropdown__option:hover{color:var(--color-gray-primary);background-color:var(--color-hover)}.dropdown__button{padding:11px 12px;background:none;border:1px solid var(--color-gray-icons-placeholders);width:100%;display:flex;justify-content:space-between;align-items:center;cursor:pointer;transition:border .3s}.dropdown__button:focus{border-color:var(--color-accent)}.dropdown__button:not(.dropdown__button--open){border-color:var(--color-gray-icons-placeholders)}.dropdown__button:hover:not(.dropdown__button--open){border-color:var(--color-gray-secondary)}.dropdown__button--open{border-color:var(--color-accent);background-color:var(--color-surface-2)}body.theme_dark .dropdown__option:hover{color:var(--color-gray-primary);background-color:var(--color-surface-2)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.pagination{height:32px;display:flex;gap:16px;justify-content:center;align-items:center;margin:40px auto 80px}.pagination__button-container{display:flex;gap:8px}.pagination__button-page,.pagination__button{padding:0;margin:0;position:relative;width:32px;height:32px;border:1px solid var(--color-gray-elements);background-color:var(--color-bg);box-sizing:border-box;cursor:pointer;color:var(--color-gray-primary);font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;display:flex;justify-content:center;align-items:center;transition:background-color .3s,border-color .3s}body.theme_dark .pagination__button-page,body.theme_dark .pagination__button{border:none;background-color:var(--color-surface-1);color:var(--color-gray-primary)}.pagination__button-page:not(.pagination__button-page--active):hover{border-color:var(--color-gray-primary)}body.theme_dark .pagination__button-page:not(.pagination__button-page--active):hover{background-color:var(--color-gray-elements)}.pagination__button:not(.pagination__button--disabled):hover{border-color:var(--color-gray-primary)}body.theme_dark .pagination__button:not(.pagination__button--disabled):hover{background-color:var(--color-gray-elements)}.pagination__button-page--active{background-color:var(--color-gray-primary);color:var(--color-bg)}body.theme_dark .pagination__button-page--active{background-color:var(--color-accent)}.pagination__button--disabled{cursor:not-allowed}body.theme_dark .pagination__button--disabled{background-color:var(--color-bg);border:1px solid var(--color-gray-elements)}body.theme_dark p{color:var(--color-gray-primary);font-family:Mont-Regular,sans-serif} diff --git a/public/assets/index-urnOVSjv.css b/public/assets/index-urnOVSjv.css new file mode 100644 index 00000000000..349d290909e --- /dev/null +++ b/public/assets/index-urnOVSjv.css @@ -0,0 +1 @@ +@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.cartPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.cartPage{padding-inline:24px}}@media (min-width: 1200px){.cartPage{padding-inline:0;margin-inline:auto}}.cartPage__title{margin-top:16px;margin-bottom:32px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}.cartPage__content{display:flex;flex-direction:column;gap:32px}@media (min-width: 1200px){.cartPage__content{--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 1200px) and (min-width: 640px){.cartPage__content{--columns: 12}}@media (min-width: 1200px) and (min-width: 1200px){.cartPage__content{--columns: 24}}.cartPage__content-container{display:flex;flex-direction:column;gap:16px}@media (min-width: 1200px){.cartPage__content-container{grid-column:span 16}}.cartPage__empty-content{display:flex;width:100%;align-items:center;justify-content:center}.cartPage__empty-content-title{font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);display:flex;justify-content:center;width:460px}.cartPage__image-empty{width:40%}.cartPage__total{height:fit-content;padding:24px;text-align:center;border:1px solid var(--color-gray-elements)}@media (min-width: 1200px){.cartPage__total{grid-column:span 8}}.cartPage__total-count{font-family:Mont-Bold,sans-serif;font-size:32px;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary)}.cartPage__total-title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.cartPage__line{width:100%;height:1px;background-color:var(--color-gray-elements);margin-block:24px}.cartPage__button-checkout{width:100%;padding:12px 0;background-color:var(--color-gray-primary);border:none;font-family:Mont-SemiBold,sans-serif;font-size:14px;font-weight:700;line-height:21px;text-align:center;color:var(--color-bg);cursor:pointer;transition:background-color .3s ease,box-shadow .3s ease,color .3s ease;transition:box-shadow .3s}.cartPage__button-checkout:hover{box-shadow:0 3px 13px #17203166}body.theme_dark .cartPage__button-checkout{background-color:var(--color-accent);color:var(--color-gray-primary);transition:background-color .3s ease,box-shadow .3s ease,color .3s ease}body.theme_dark .cartPage__button-checkout:hover{background-color:var(--color-accent-hover)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.cartItem{padding:16px;display:flex;flex-direction:column;gap:16px;border:1px solid var(--color-gray-elements);transition:border-color .3s ease;justify-content:space-between}@media (min-width: 640px){.cartItem{flex-direction:row;padding:24px}}.cartItem:hover{border:1px solid var(--color-gray-primary);transition:border-color .3s ease}.cartItem__wrapperTop{display:flex;gap:16px;align-items:center}@media (min-width: 640px){.cartItem__wrapperTop{gap:24px}}.cartItem__wrapperBottom{display:flex;align-items:center;justify-content:space-between}@media (min-width: 640px){.cartItem__wrapperBottom{gap:24px}}.cartItem__icon-close{border:none;background-color:var(--color-bg);cursor:pointer;width:16px;height:16px;background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4721%204.47138C12.7324%204.21103%2012.7324%203.78892%2012.4721%203.52858C12.2117%203.26823%2011.7896%203.26823%2011.5292%203.52858L8.00065%207.05717L4.47206%203.52858C4.21171%203.26823%203.7896%203.26823%203.52925%203.52858C3.2689%203.78892%203.2689%204.21103%203.52925%204.47138L7.05784%207.99998L3.52925%2011.5286C3.2689%2011.7889%203.2689%2012.211%203.52925%2012.4714C3.7896%2012.7317%204.21171%2012.7317%204.47206%2012.4714L8.00065%208.94279L11.5292%2012.4714C11.7896%2012.7317%2012.2117%2012.7317%2012.4721%2012.4714C12.7324%2012.211%2012.7324%2011.7889%2012.4721%2011.5286L8.94346%207.99998L12.4721%204.47138Z'%20fill='%23B4BDC4'/%3e%3c/svg%3e")}.cartItem__icon-close:hover{background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4714%204.4714C12.7318%204.21105%2012.7318%203.78894%2012.4714%203.52859C12.2111%203.26824%2011.789%203.26824%2011.5286%203.52859L8.00004%207.05719L4.47145%203.52859C4.2111%203.26824%203.78899%203.26824%203.52864%203.52859C3.26829%203.78894%203.26829%204.21105%203.52864%204.4714L7.05723%207.99999L3.52864%2011.5286C3.26829%2011.7889%203.26829%2012.211%203.52864%2012.4714C3.78899%2012.7317%204.2111%2012.7317%204.47145%2012.4714L8.00004%208.9428L11.5286%2012.4714C11.789%2012.7317%2012.2111%2012.7317%2012.4714%2012.4714C12.7318%2012.211%2012.7318%2011.7889%2012.4714%2011.5286L8.94285%207.99999L12.4714%204.4714Z'%20fill='%23313237'/%3e%3c/svg%3e")}.cartItem__link{display:flex;align-items:center;text-decoration:none}.cartItem__title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-primary)}.cartItem__counter-container{display:flex}.cartItem__price{width:80px;text-align:right;font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;color:var(--color-gray-primary)}.cartItem__counter{width:32px;font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;text-align:center;line-height:32px}.cartItem__button{border:1px solid var(--color-gray-icons-placeholders);border-radius:50%;background-color:#fff;width:32px;height:32px;cursor:pointer;transition:border .3s ease}.cartItem__button--disabled{border:1px solid var(--color-gray-elements);cursor:not-allowed}.cartItem__button:not(.cartItem__button--disabled):hover{background-color:var(--color-gray-icons-placeholders);border:none}.cartItem__image{height:80px;width:80px;object-fit:contain;transition:transform .3s ease}.cartItem__image:hover{transform:scale(1.05)}body.theme_dark .cartItem__counter{color:var(--color-gray-primary)}body.theme_dark .cartItem__button{background-color:var(--color-surface-2);border:none}body.theme_dark .cartItem__button--disabled{background-color:var(--color-bg);border:1px solid var(--color-gray-elements)}body.theme_dark .cartItem__button:not(.cartItem__button--disabled):hover{background-color:var(--color-gray-icons-placeholders);border:none}body.theme_dark .cartItem__icon-close{border:none;background-color:var(--color-bg);cursor:pointer;width:16px;height:16px;background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4714%204.4714C12.7318%204.21105%2012.7318%203.78894%2012.4714%203.52859C12.2111%203.26824%2011.789%203.26824%2011.5286%203.52859L8.00004%207.05719L4.47145%203.52859C4.2111%203.26824%203.78899%203.26824%203.52864%203.52859C3.26829%203.78894%203.26829%204.21105%203.52864%204.4714L7.05723%207.99999L3.52864%2011.5286C3.26829%2011.7889%203.26829%2012.211%203.52864%2012.4714C3.78899%2012.7317%204.2111%2012.7317%204.47145%2012.4714L8.00004%208.9428L11.5286%2012.4714C11.789%2012.7317%2012.2111%2012.7317%2012.4714%2012.4714C12.7318%2012.211%2012.7318%2011.7889%2012.4714%2011.5286L8.94285%207.99999L12.4714%204.4714Z'%20fill='%23313237'/%3e%3c/svg%3e")}body.theme_dark .cartItem__icon-close:hover{background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4721%204.47138C12.7324%204.21103%2012.7324%203.78892%2012.4721%203.52858C12.2117%203.26823%2011.7896%203.26823%2011.5292%203.52858L8.00065%207.05717L4.47206%203.52858C4.21171%203.26823%203.7896%203.26823%203.52925%203.52858C3.2689%203.78892%203.2689%204.21103%203.52925%204.47138L7.05784%207.99998L3.52925%2011.5286C3.2689%2011.7889%203.2689%2012.211%203.52925%2012.4714C3.7896%2012.7317%204.21171%2012.7317%204.47206%2012.4714L8.00065%208.94279L11.5292%2012.4714C11.7896%2012.7317%2012.2117%2012.7317%2012.4721%2012.4714C12.7324%2012.211%2012.7324%2011.7889%2012.4721%2011.5286L8.94346%207.99998L12.4721%204.47138Z'%20fill='%23B4BDC4'/%3e%3c/svg%3e")} diff --git a/src/constants/icons.ts b/src/constants/icons.ts index 58cfd6b3e9e..d9103ce1380 100644 --- a/src/constants/icons.ts +++ b/src/constants/icons.ts @@ -1,4 +1,5 @@ type Icon = Record<'light' | 'dark', { title: string; path: string }>; + export const icons: Record = { logo: { light: { @@ -13,172 +14,172 @@ export const icons: Record = { close: { light: { title: 'Close icon', - path: '../../src/icons/Close.svg', + path: '/icons/Close.svg', }, dark: { title: 'Close dark icon', - path: '../../src/icons/close_dark.svg', + path: '/icons/close_dark.svg', }, }, close__disabled: { light: { title: 'Close icon', - path: '../../src/icons/close__disabled.svg', + path: '/icons/close__disabled.svg', }, dark: { title: 'Close dark icon', - path: '../../src/icons/close__disabled.svg', + path: '/icons/close__disabled.svg', }, }, menu: { light: { title: 'Menu icon', - path: '../../src/icons/Menu.svg', + path: '/icons/Menu.svg', }, dark: { title: 'Menu dark icon', - path: '../../src/icons/menu_dark.svg', + path: '/icons/menu_dark.svg', }, }, search: { light: { title: 'Search icon', - path: '../../src/icons/search.svg', + path: '/icons/search.svg', }, dark: { title: 'Search dark icon', - path: '../../src/icons/search_dark.svg', + path: '/icons/search_dark.svg', }, }, favorites: { light: { title: 'Favorites icon', - path: '../../src/icons/favorites.svg', + path: '/icons/favorites.svg', }, dark: { title: 'Favorites dark icon', - path: '../../src/icons/favorites_dark.svg', + path: '/icons/favorites_dark.svg', }, }, favorites__filled: { light: { title: 'Favorites filled icon', - path: '../../src/icons/favorites__filled.svg', + path: '/icons/favorites__filled.svg', }, dark: { title: 'Favorites filled dark icon', - path: '../../src/icons/favorites__filled.svg', + path: '/icons/favorites__filled.svg', }, }, shopping_cart: { light: { title: 'Shopping cart icon', - path: '../../src/icons/shopping_cart.svg', + path: '/icons/shopping_cart.svg', }, dark: { title: 'Shopping cart dark icon', - path: '../../src/icons/shopping_cart_dark.svg', + path: '/icons/shopping_cart_dark.svg', }, }, arrow_left: { light: { title: 'Arrow left icon', - path: '../../src/icons/arrow_left.svg', + path: '/icons/arrow_left.svg', }, dark: { title: 'Arrow left dark icon', - path: '../../src/icons/arrow_left_dark.svg', + path: '/icons/arrow_left_dark.svg', }, }, arrow_left__disabled: { light: { title: 'Arrow left disabled icon', - path: '../../src/icons/arrow_left__disabled.svg', + path: '/icons/arrow_left__disabled.svg', }, dark: { title: 'Arrow left disabled dark icon', - path: '../../src/icons/arrow_left_dark__disabled.svg', + path: '/icons/arrow_left_dark__disabled.svg', }, }, arrow_right: { light: { title: 'Arrow right icon', - path: '../../src/icons/arrow_right.svg', + path: '/icons/arrow_right.svg', }, dark: { title: 'Arrow right dark icon', - path: '../../src/icons/arrow_right_dark.svg', + path: '/icons/arrow_right_dark.svg', }, }, arrow_right__disabled: { light: { title: 'Arrow right disabled icon', - path: '../../src/icons/arrow_right__disabled.svg', + path: '/icons/arrow_right__disabled.svg', }, dark: { title: 'Arrow right disabled dark icon', - path: '../../src/icons/arrow_right_dark__disabled.svg', + path: '/icons/arrow_right_dark__disabled.svg', }, }, arrow_down: { light: { title: 'Arrow down icon', - path: '../../src/icons/arrow_down_dark.svg', + path: '/icons/arrow_down_dark.svg', }, dark: { title: 'Arrow down dark icon', - path: '../../src/icons/arrow_down_dark.svg', + path: '/icons/arrow_down_dark.svg', }, }, home: { light: { title: 'Home icon', - path: '../../src/icons/Home.svg', + path: '/icons/Home.svg', }, dark: { title: 'Home dark icon', - path: '../../src/icons/home_dark.svg', + path: '/icons/home_dark.svg', }, }, plus: { light: { title: 'Plus icon', - path: '../../src/icons/Plus.svg', + path: '/icons/Plus.svg', }, dark: { title: 'Plus dark icon', - path: '../../src/icons/Union.svg', + path: '/icons/Union.svg', }, }, minus: { light: { title: 'Minus icon', - path: '../../src/icons/Minus.svg', + path: '/icons/Minus.svg', }, dark: { title: 'Minus dark icon', - path: '../../src/icons/minus_dark.svg', + path: '/icons/minus_dark.svg', }, }, minus__disabled: { light: { title: 'Minus icon', - path: '../../src/icons/minus__disabled.svg', + path: '/icons/minus__disabled.svg', }, dark: { title: 'Minus dark icon', - path: '../../src/icons/MinusDarkDisabled.svg', + path: '/icons/MinusDarkDisabled.svg', }, }, ok: { light: { title: 'ok', - path: '../../src/icons/image 15.svg', + path: '/icons/image 15.svg', }, dark: { title: 'ok', - path: '../../src/icons/image 15.svg', + path: '/icons/image 15.svg', }, }, }; From 580f9556e29a09cfff6cd6d7dc77e5b379156644 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sun, 29 Jun 2025 15:54:30 +0200 Subject: [PATCH 06/11] copy6 --- deploy.sh | 30 ++ package-lock.json | 1238 +++++++++++---------------------------------- package.json | 4 +- vite.config.ts | 3 +- 4 files changed, 320 insertions(+), 955 deletions(-) create mode 100644 deploy.sh diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 00000000000..1250856ea26 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +# abort on errors +set -e + +# build +npm run build + +# navigate into the build output directory +cd dist + +# place .nojekyll to bypass Jekyll processing +echo > .nojekyll + +# if you are deploying to a custom domain +# echo 'www.example.com' > CNAME + +git init +git checkout -B main +git add -A +git commit -m 'deploy' + +# if you are deploying to https://.github.io +# git push -f git@github.com:/.github.io.git main + +# if you are deploying to https://.github.io/ +# git push -f git@github.com:/.git main:gh-pages +git push -f git@github.com:SerhiiSemennikov/react_phone-catalog.git main:gh-pages + +cd - diff --git a/package-lock.json b/package-lock.json index eec6a5ca492..78f4208ce31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^2.1.1", + "@mate-academy/scripts": "^0.9.9", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", "@types/lodash.debounce": "^4.0.9", @@ -51,7 +51,7 @@ "sass": "^1.89.2", "stylelint": "^16.21.0", "typescript": "^5.2.2", - "vite": "^5.3.1" + "vite": "^6.3.5" } }, "node_modules/@ampproject/remapping": { @@ -546,371 +546,428 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1175,22 +1232,18 @@ } }, "node_modules/@mate-academy/scripts": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-2.1.1.tgz", - "integrity": "sha512-Tf97p/jZ/ZRsQSPGcZf2FpvxgUCl8DiUOsiDFHj7HBN8gMK0iZOBQEtyqcFsauVUAvPP8Ayo8cAiC12MMp45iQ==", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-0.9.9.tgz", + "integrity": "sha512-4CXwDho0CfuHWU0qo3mFYZiYb6xuSxwBmm8ryxLG1fMQuFfpL3eTlisOdCK5CP2Ak2C8aLWZkoeVudq9qqYb9w==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/rest": "^17.11.2", "@types/get-port": "^4.2.0", "commander": "^5.1.0", "cross-env": "^7.0.3", - "dotenv": "^8.6.0", "fs-extra": "^9.1.0", "get-port": "^5.1.1", - "open": "^7.4.2", - "sinon": "^9.2.4", - "tree-kill": "^1.2.2" + "open": "^7.4.2" }, "bin": { "mate-scripts": "bin/mateScripts.js" @@ -1521,401 +1574,6 @@ "node": ">= 8" } }, - "node_modules/@octokit/auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", - "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz", - "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==", - "dev": true, - "dependencies": { - "@octokit/types": "^4.1.6", - "deprecation": "^2.3.1" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", - "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", - "dev": true, - "dependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@octokit/rest": { - "version": "17.11.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", - "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", - "dev": true, - "dependencies": { - "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.2.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.17.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/auth-token/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/rest/node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/@octokit/rest/node_modules/@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", - "dev": true, - "dependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/@octokit/rest/node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/@octokit/rest/node_modules/universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "dependencies": { - "os-name": "^3.1.0" - } - }, - "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, "node_modules/@parcel/watcher": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", @@ -2533,41 +2191,6 @@ "win32" ] }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3401,13 +3024,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "dev": true, - "peer": true - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3637,9 +3253,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -4351,12 +3967,6 @@ "node": ">=0.4.0" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -4413,15 +4023,6 @@ "csstype": "^3.0.2" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4670,41 +4271,44 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -5488,29 +5092,11 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "peer": true + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -7176,12 +6762,6 @@ "node": ">=4.0" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7307,12 +6887,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -7544,18 +7118,6 @@ "yallist": "^3.0.2" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -8361,25 +7923,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -8388,26 +7931,6 @@ "license": "MIT", "optional": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -8644,34 +8167,12 @@ "node": ">= 0.8.0" } }, - "node_modules/os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "dependencies": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", "dev": true }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8789,22 +8290,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9903,55 +9388,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/sinon": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", - "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.0.4", - "supports-color": "^7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -10227,15 +9663,6 @@ "node": ">=4" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -10724,6 +10151,51 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -10769,21 +10241,6 @@ "node": ">= 4.0.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -10881,15 +10338,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -11009,13 +10457,6 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "dev": true, - "peer": true - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -11134,21 +10575,24 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -11157,19 +10601,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -11190,23 +10640,41 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/which": { @@ -11309,140 +10777,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "dev": true, - "dependencies": { - "execa": "^1.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/windows-release/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/windows-release/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/windows-release/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/windows-release/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/windows-release/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 8de60dbd7cd..be725e30a38 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^2.1.1", + "@mate-academy/scripts": "^0.9.9", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", "@types/lodash.debounce": "^4.0.9", @@ -47,7 +47,7 @@ "sass": "^1.89.2", "stylelint": "^16.21.0", "typescript": "^5.2.2", - "vite": "^5.3.1" + "vite": "^6.3.5" }, "scripts": { "start": "mate-scripts start -l", diff --git a/vite.config.ts b/vite.config.ts index 5a33944a9b4..d561862251d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,5 +3,6 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ + base: '/react_phone-catalog/', plugins: [react()], -}) +}); From fda882a52080750d0e131e2fff4e4e9a72436e41 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sun, 29 Jun 2025 16:54:09 +0200 Subject: [PATCH 07/11] copy7 --- package-lock.json | 4030 ++++++++++++----- package.json | 16 +- public/assets/ButtonBack-DRk2FjGf.js | 1 - public/assets/ButtonBack-w6P-UJJ0.css | 1 - public/assets/Linkline-BVE7q3mI.js | 1 - public/assets/Linkline-B_ez10jd.css | 1 - public/assets/Loader-CdfK6LLs.js | 1 - public/assets/Loader-DU6sTv_g.css | 1 - public/assets/ProductCard-CtH8lf1i.css | 1 - public/assets/ProductCard-n_G8EIMu.js | 1 - public/assets/ProductsList-Bz-DDO8l.css | 1 - public/assets/ProductsList-C8WnN_nq.js | 1 - public/assets/ProductsSlider-CAHW4_99.css | 1 - public/assets/ProductsSlider-CeN1XtqL.js | 1 - public/assets/favicon-DR5FOLsX.svg | 9 - public/assets/index--M-vjEFs.js | 1 - public/assets/index-80CrQ2vW.css | 1 - public/assets/index-BD-w6JY5.css | 1 - public/assets/index-BV-oWgkF.css | 1 - public/assets/index-C4ngy4_v.js | 1 - public/assets/index-C5E6A8ui.js | 1 - public/assets/index-C9RfMEqD.css | 1 - public/assets/index-CDfWgnoX.js | 1 - public/assets/index-CS6BVxGO.css | 1 - public/assets/index-D68rl43-.js | 1 - public/assets/index-DZGfIgcM.js | 4 - public/assets/index-DZu0jUOh.js | 72 - public/assets/index-DlB5k-ir.css | 1 - public/assets/index-urnOVSjv.css | 1 - .../ShopByCategory/ShopByCategory.tsx | 6 +- src/constants/icons.ts | 72 +- 31 files changed, 2984 insertions(+), 1249 deletions(-) delete mode 100644 public/assets/ButtonBack-DRk2FjGf.js delete mode 100644 public/assets/ButtonBack-w6P-UJJ0.css delete mode 100644 public/assets/Linkline-BVE7q3mI.js delete mode 100644 public/assets/Linkline-B_ez10jd.css delete mode 100644 public/assets/Loader-CdfK6LLs.js delete mode 100644 public/assets/Loader-DU6sTv_g.css delete mode 100644 public/assets/ProductCard-CtH8lf1i.css delete mode 100644 public/assets/ProductCard-n_G8EIMu.js delete mode 100644 public/assets/ProductsList-Bz-DDO8l.css delete mode 100644 public/assets/ProductsList-C8WnN_nq.js delete mode 100644 public/assets/ProductsSlider-CAHW4_99.css delete mode 100644 public/assets/ProductsSlider-CeN1XtqL.js delete mode 100644 public/assets/favicon-DR5FOLsX.svg delete mode 100644 public/assets/index--M-vjEFs.js delete mode 100644 public/assets/index-80CrQ2vW.css delete mode 100644 public/assets/index-BD-w6JY5.css delete mode 100644 public/assets/index-BV-oWgkF.css delete mode 100644 public/assets/index-C4ngy4_v.js delete mode 100644 public/assets/index-C5E6A8ui.js delete mode 100644 public/assets/index-C9RfMEqD.css delete mode 100644 public/assets/index-CDfWgnoX.js delete mode 100644 public/assets/index-CS6BVxGO.css delete mode 100644 public/assets/index-D68rl43-.js delete mode 100644 public/assets/index-DZGfIgcM.js delete mode 100644 public/assets/index-DZu0jUOh.js delete mode 100644 public/assets/index-DlB5k-ir.css delete mode 100644 public/assets/index-urnOVSjv.css diff --git a/package-lock.json b/package-lock.json index 78f4208ce31..8e621fd753e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,9 @@ "license": "GPL-3.0", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.2", - "@types/lodash": "^4.17.17", "bulma": "^1.0.1", "classnames": "^2.5.1", - "lodash": "^4.17.21", - "lodash.debounce": "^4.0.8", + "css": "^3.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.25.1", @@ -23,10 +21,9 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^0.9.9", + "@mate-academy/scripts": "^2.1.1", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", - "@types/lodash.debounce": "^4.0.9", "@types/node": "^20.14.10", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", @@ -47,11 +44,12 @@ "mochawesome": "^7.1.3", "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0", + "node-sass": "^9.0.0", "prettier": "^3.3.2", "sass": "^1.89.2", - "stylelint": "^16.21.0", + "stylelint": "^16.7.0", "typescript": "^5.2.2", - "vite": "^6.3.5" + "vite": "^5.4.19" } }, "node_modules/@ampproject/remapping": { @@ -546,9 +544,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -559,13 +557,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -576,13 +574,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -593,13 +591,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -610,13 +608,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -627,13 +625,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -644,13 +642,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -661,13 +659,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -678,13 +676,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -695,13 +693,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -712,13 +710,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -729,13 +727,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -746,13 +744,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -763,13 +761,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -780,13 +778,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -797,13 +795,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -814,13 +812,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -831,30 +829,13 @@ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -865,30 +846,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -899,13 +863,13 @@ "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -916,13 +880,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -933,13 +897,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -950,13 +914,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -967,7 +931,7 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1085,6 +1049,13 @@ "node": ">=6" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -1232,18 +1203,22 @@ } }, "node_modules/@mate-academy/scripts": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-0.9.9.tgz", - "integrity": "sha512-4CXwDho0CfuHWU0qo3mFYZiYb6xuSxwBmm8ryxLG1fMQuFfpL3eTlisOdCK5CP2Ak2C8aLWZkoeVudq9qqYb9w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-2.1.1.tgz", + "integrity": "sha512-Tf97p/jZ/ZRsQSPGcZf2FpvxgUCl8DiUOsiDFHj7HBN8gMK0iZOBQEtyqcFsauVUAvPP8Ayo8cAiC12MMp45iQ==", "dev": true, "license": "MIT", "dependencies": { + "@octokit/rest": "^17.11.2", "@types/get-port": "^4.2.0", "commander": "^5.1.0", "cross-env": "^7.0.3", + "dotenv": "^8.6.0", "fs-extra": "^9.1.0", "get-port": "^5.1.1", - "open": "^7.4.2" + "open": "^7.4.2", + "sinon": "^9.2.4", + "tree-kill": "^1.2.2" }, "bin": { "mate-scripts": "bin/mateScripts.js" @@ -1574,202 +1549,452 @@ "node": ">= 8" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, + "license": "ISC", "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "peer": true, "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 20" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/core": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.2.tgz", + "integrity": "sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" + "peer": true, + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.1", + "@octokit/request": "^10.0.2", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 20" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/endpoint": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", + "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" + "peer": true, + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 20" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], + "node_modules/@octokit/graphql": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", + "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "peer": true, + "dependencies": { + "@octokit/request": "^10.0.2", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 20" } }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "peer": true }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@octokit/types": "^6.40.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "@octokit/core": ">=2" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz", + "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^4.1.6", + "deprecation": "^2.3.1" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", + "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", + "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/endpoint": "^11.0.0", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", + "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/rest": { + "version": "17.11.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", + "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^2.4.3", + "@octokit/plugin-paginate-rest": "^2.2.0", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "3.17.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/auth-token/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", + "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.4.0", + "@octokit/types": "^5.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/rest/node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@octokit/rest/node_modules/@octokit/types": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", + "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/@octokit/rest/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@octokit/rest/node_modules/universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "os-name": "^3.1.0" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" ], "engines": { "node": ">= 10.0.0" @@ -1779,18 +2004,18 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { + "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">= 10.0.0" @@ -1800,10 +2025,10 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { + "node_modules/@parcel/watcher-darwin-x64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -1811,7 +2036,7 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">= 10.0.0" @@ -1821,18 +2046,18 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-win32-arm64": { + "node_modules/@parcel/watcher-freebsd-x64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">= 10.0.0" @@ -1842,18 +2067,18 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-win32-ia32": { + "node_modules/@parcel/watcher-linux-arm-glibc": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ - "ia32" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">= 10.0.0" @@ -1863,18 +2088,18 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-win32-x64": { + "node_modules/@parcel/watcher-linux-arm-musl": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">= 10.0.0" @@ -1884,19 +2109,166 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">= 10.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@remix-run/router": { + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@remix-run/router": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", @@ -2191,6 +2563,55 @@ "win32" ] }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2255,28 +2676,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/lodash": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", - "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", - "license": "MIT" - }, - "node_modules/@types/lodash.debounce": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz", - "integrity": "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/node": { "version": "20.14.10", @@ -2291,8 +2695,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.12", @@ -2565,6 +2968,13 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -2586,6 +2996,32 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2648,6 +3084,22 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2662,6 +3114,13 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -2682,6 +3141,21 @@ } ] }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2882,7 +3356,6 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -2926,6 +3399,15 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2941,6 +3423,18 @@ "node": ">= 4.0.0" } }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3024,6 +3518,14 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3149,6 +3651,46 @@ "resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.1.tgz", "integrity": "sha512-+xv/BIAEQakHkR0QVz+s+RjNqfC53Mx9ZYexyaFNFo9wx5i76HXArNdwW7bccyJxa5mgV/T5DcVGqsAB19nBJQ==" }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/cacheable": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", @@ -3279,6 +3821,23 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -3326,6 +3885,16 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3410,6 +3979,36 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -3470,6 +4069,13 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3542,6 +4148,17 @@ "node": ">= 8" } }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, "node_modules/css-functions-list": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", @@ -3566,6 +4183,15 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3640,67 +4266,6 @@ "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, - "node_modules/cypress/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cypress/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cypress/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/cypress/node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -3710,15 +4275,6 @@ "node": ">= 6" } }, - "node_modules/cypress/node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3854,7 +4410,6 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "peer": true, "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -3871,7 +4426,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -3881,11 +4435,19 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -3967,6 +4529,20 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true, + "license": "ISC" + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -4023,6 +4599,16 @@ "csstype": "^3.0.2" } }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4052,6 +4638,17 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4083,6 +4680,13 @@ "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4271,9 +4875,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4281,34 +4885,32 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -4831,21 +5433,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -4857,40 +5444,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4918,15 +5471,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4939,18 +5483,6 @@ "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5098,6 +5630,24 @@ "node >=0.6.0" ] }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5360,6 +5910,19 @@ "node": ">=10" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5422,14 +5985,48 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, "engines": { - "node": ">=6.9.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/get-caller-file": { @@ -5472,6 +6069,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -5645,7 +6252,6 @@ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5677,7 +6283,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5796,6 +6401,67 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -5825,7 +6491,6 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -5839,6 +6504,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -5890,6 +6565,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5924,7 +6606,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5937,7 +6618,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5949,8 +6629,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/html-tags": { "version": "3.3.1", @@ -5964,6 +6643,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -5978,6 +6679,20 @@ "node": ">=0.10" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -5987,6 +6702,30 @@ "node": ">=8.12.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6067,6 +6806,13 @@ "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6081,8 +6827,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -6107,6 +6852,27 @@ "node": ">= 0.4" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -6358,6 +7124,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6635,6 +7408,13 @@ "set-function-name": "^2.0.1" } }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6762,6 +7542,13 @@ "node": ">=4.0" } }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true, + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6879,12 +7666,15 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, "license": "MIT" }, "node_modules/lodash.isempty": { @@ -6945,76 +7735,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -7033,39 +7753,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -7118,10 +7805,23 @@ "yallist": "^3.0.2" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { "semver": "^6.0.0" @@ -7142,12 +7842,49 @@ "semver": "bin/semver.js" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -7248,7 +7985,6 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -7282,7 +8018,6 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "peer": true, "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -7297,11 +8032,134 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", @@ -7351,16 +8209,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/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, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -7428,21 +8276,6 @@ "node": ">=10.0.0" } }, - "node_modules/mochawesome-merge/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/mochawesome-merge/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -7474,24 +8307,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/mochawesome-merge/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/mochawesome-merge/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/mochawesome-merge/node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -7696,37 +8511,6 @@ "marge": "bin/cli.js" } }, - "node_modules/mochawesome-report-generator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mochawesome-report-generator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/mochawesome-report-generator/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -7741,24 +8525,6 @@ "node": ">=12" } }, - "node_modules/mochawesome-report-generator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/mochawesome-report-generator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/mochawesome-report-generator/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -7773,27 +8539,6 @@ "node": ">=12" } }, - "node_modules/mochawesome-report-generator/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/mochawesome-report-generator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mochawesome-report-generator/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -7821,129 +8566,741 @@ "node": ">=12" } }, - "node_modules/mochawesome/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/mochawesome/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true, + "license": "MIT" + }, + "node_modules/nise": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mochawesome/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/node-gyp/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 6" } }, - "node_modules/mochawesome/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/node-gyp/node_modules/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, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-sass": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", + "deprecated": "Node Sass is no longer supported. Please use `sass` or `sass-embedded` instead.", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-sass/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-sass/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-sass/node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-sass/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-sass/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/node-sass/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-sass/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-sass/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-sass/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-sass/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-sass/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, - "node_modules/mochawesome/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/node-sass/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/mochawesome/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/node-sass/node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/node-sass/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/node-sass/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "min-indent": "^1.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "node_modules/node-sass/node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">=8" + } }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "node_modules/node-sass/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "MIT" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "peer": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -7975,6 +9332,23 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8167,12 +9541,36 @@ "node": ">= 0.8.0" } }, + "node_modules/os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", "dev": true }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8290,6 +9688,23 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8604,6 +10019,34 @@ "node": ">= 0.6.0" } }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -8855,6 +10298,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -9015,6 +10473,16 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -9175,74 +10643,183 @@ "isarray": "^2.0.5" }, "engines": { - "node": ">=0.4" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/sass-graph/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "node_modules/sass-graph/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, "node_modules/sass/node_modules/chokidar": { @@ -9283,6 +10860,17 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -9388,6 +10976,36 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/sinon": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "deprecated": "16.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9411,38 +11029,56 @@ "node": ">=8" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 10" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } }, "node_modules/source-map-js": { "version": "1.2.1", @@ -9454,12 +11090,22 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -9469,15 +11115,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -9487,8 +11131,14 @@ "version": "3.0.18", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, - "peer": true + "license": "BSD-3-Clause" }, "node_modules/sshpk": { "version": "1.18.0", @@ -9515,6 +11165,69 @@ "node": ">=0.10.0" } }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/stdout-stream/node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdout-stream/node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -9527,6 +11240,16 @@ "node": ">= 0.4" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -9663,6 +11386,16 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -9954,6 +11687,19 @@ "node": ">=8" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-hyperlinks": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", @@ -9971,27 +11717,6 @@ "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/supports-hyperlinks/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/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", @@ -10052,46 +11777,13 @@ "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -10115,6 +11807,41 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/tcomb": { "version": "3.2.29", "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", @@ -10151,51 +11878,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -10241,6 +11923,23 @@ "node": ">= 4.0.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -10266,6 +11965,13 @@ "node": ">=0.10.0" } }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -10338,6 +12044,16 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -10457,6 +12173,40 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -10545,7 +12295,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -10575,24 +12324,21 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -10601,25 +12347,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -10640,41 +12380,25 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } + "license": "BSD-2-Clause" }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { @@ -10777,6 +12501,160 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/windows-release/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -10810,39 +12688,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10914,7 +12759,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "peer": true, "engines": { "node": ">=10" } diff --git a/package.json b/package.json index be725e30a38..aa36f3792a0 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,9 @@ "license": "GPL-3.0", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.2", - "@types/lodash": "^4.17.17", "bulma": "^1.0.1", "classnames": "^2.5.1", - "lodash": "^4.17.21", - "lodash.debounce": "^4.0.8", + "css": "^3.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.25.1", @@ -19,10 +17,9 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^0.9.9", + "@mate-academy/scripts": "^2.1.1", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", - "@types/lodash.debounce": "^4.0.9", "@types/node": "^20.14.10", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", @@ -43,11 +40,12 @@ "mochawesome": "^7.1.3", "mochawesome-merge": "^4.3.0", "mochawesome-report-generator": "^6.2.0", + "node-sass": "^9.0.0", "prettier": "^3.3.2", "sass": "^1.89.2", - "stylelint": "^16.21.0", + "stylelint": "^16.7.0", "typescript": "^5.2.2", - "vite": "^6.3.5" + "vite": "^5.4.19" }, "scripts": { "start": "mate-scripts start -l", @@ -61,7 +59,9 @@ "update": "mate-scripts update", "postinstall": "npm run update && cypress verify", "predeploy": "npm run build", - "deploy": "mate-scripts deploy" + "deploy": "mate-scripts deploy", + "build-css": "node-sass -o dist/css src/scss", + "watch-css": "node-sass -o dist/css src/scss --watch" }, "browserslist": { "production": [ diff --git a/public/assets/ButtonBack-DRk2FjGf.js b/public/assets/ButtonBack-DRk2FjGf.js deleted file mode 100644 index 4ce617bf918..00000000000 --- a/public/assets/ButtonBack-DRk2FjGf.js +++ /dev/null @@ -1 +0,0 @@ -import{r as a,G as n,d as c,j as t,I as i,i as r}from"./index-DZu0jUOh.js";const x=()=>{const{theme:e}=a.useContext(n),s=c(),o=a.useCallback(()=>{s(-1)},[s]);return t.jsxs("div",{className:"button",onClick:o,children:[t.jsx(i,{icon:r.arrow_left[e]}),t.jsx("div",{className:"button-title",children:"Back"})]})};export{x as B}; diff --git a/public/assets/ButtonBack-w6P-UJJ0.css b/public/assets/ButtonBack-w6P-UJJ0.css deleted file mode 100644 index e2171a84bbe..00000000000 --- a/public/assets/ButtonBack-w6P-UJJ0.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.button{margin-block:24px 16px;background-color:var(--color-bg);display:flex;align-items:center;gap:4px;cursor:pointer}@media (min-width: 640px){.button{margin-top:40px}}.button-title{font-family:Mont-SemiBold,sans-serif;font-size:12px;line-height:13px;font-weight:700;color:var(--color-gray-primary)} diff --git a/public/assets/Linkline-BVE7q3mI.js b/public/assets/Linkline-BVE7q3mI.js deleted file mode 100644 index 929f36bdc4e..00000000000 --- a/public/assets/Linkline-BVE7q3mI.js +++ /dev/null @@ -1 +0,0 @@ -import{r as c,G as o,j as e,I as s,i as a,L as t}from"./index-DZu0jUOh.js";function _(i){return i&&i.charAt(0).toUpperCase()+i.slice(1)}const x=({productType:i,productName:l})=>{const{theme:n}=c.useContext(o),r=c.useMemo(()=>_(i),[i]);return e.jsx("div",{className:"linkline",children:e.jsxs("div",{className:"linkline__container",children:[e.jsx("a",{href:"/",className:"linkline__link-home","aria-label":"Go to home page",children:e.jsx(s,{icon:a.home[n]})}),e.jsx("span",{className:"linkline__arrow",children:e.jsx(s,{icon:a.arrow_right__disabled[n]})}),l?e.jsxs(e.Fragment,{children:[e.jsx(t,{to:`/${i}`,children:e.jsx("span",{className:"linkline__item linkline__item--dark",children:r})}),e.jsx("span",{className:"linkline__arrow",children:e.jsx(s,{icon:a.arrow_right__disabled[n]})}),e.jsx("span",{className:"linkline__item",children:l})]}):e.jsx("span",{className:"linkline__item",children:r})]})})};export{x as L,_ as c}; diff --git a/public/assets/Linkline-B_ez10jd.css b/public/assets/Linkline-B_ez10jd.css deleted file mode 100644 index 4569ca27a14..00000000000 --- a/public/assets/Linkline-B_ez10jd.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.linkline__item{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600;color:var(--color-gray-secondary);display:inline-block;vertical-align:middle;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:100%}.linkline__item--dark{text-decoration:none;color:var(--color-gray-primary)}.linkline__link-home,.linkline__arrow{display:flex;align-items:center;justify-content:center}.linkline__container{height:16px;margin-block:24px;display:flex;align-items:center;gap:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media (min-width: 640px){.linkline__container{margin-bottom:40px}} diff --git a/public/assets/Loader-CdfK6LLs.js b/public/assets/Loader-CdfK6LLs.js deleted file mode 100644 index 4d3d3c3a03a..00000000000 --- a/public/assets/Loader-CdfK6LLs.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,G as t,j as s,I as a,i as r}from"./index-DZu0jUOh.js";const c=()=>{const{theme:o}=e.useContext(t);return s.jsx(s.Fragment,{children:s.jsxs("div",{className:"loader",children:[s.jsx(a,{icon:r.logo[o]}),s.jsx("div",{className:"loader__content"})]})})};export{c as L}; diff --git a/public/assets/Loader-DU6sTv_g.css b/public/assets/Loader-DU6sTv_g.css deleted file mode 100644 index 70fae6fea0f..00000000000 --- a/public/assets/Loader-DU6sTv_g.css +++ /dev/null @@ -1 +0,0 @@ -.loader{position:absolute;top:50%;left:50%;transform:translate(-75px,-75px)}.loader__content{border-radius:50%;width:2em;height:2em;margin:1em auto;border:.3em solid #ddd;border-left-color:#000;animation:load8 1.2s infinite linear}.loader__image{width:150px;height:150px}@keyframes load8{0%{transform:rotate(0)}to{transform:rotate(360deg)}} diff --git a/public/assets/ProductCard-CtH8lf1i.css b/public/assets/ProductCard-CtH8lf1i.css deleted file mode 100644 index d875cb37c4f..00000000000 --- a/public/assets/ProductCard-CtH8lf1i.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productCard__container{cursor:pointer;text-decoration:none;padding:32px;border:1px solid var(--color-gray-elements);display:flex;flex-direction:column;gap:8px;transition:border-color .3s}.productCard__container:hover{border-color:var(--color-gray-primary)}.productCard__container-photo{width:148px;height:129px}@media (min-width: 640px){.productCard__container-photo{width:173px;height:202px}}@media (min-width: 1200px){.productCard__container-photo{width:208px;height:196px}}.productCard__container-title{text-align:center;height:58px;padding-top:16px}.productCard__container-price{display:flex;justify-content:center;gap:8px;font-size:22px;line-height:31px}.productCard__container-specifications{display:flex;flex-direction:column;gap:8px;padding-top:8px;padding-bottom:8px}.productCard__container-buttons{display:flex;gap:8px}.productCard__photo{width:100%;height:100%;object-fit:contain}.productCard__title{font-family:Mont-Regular,sans-serif;color:var(--color-gray-primary);font-size:14px;font-weight:600}.productCard__price-regular{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-weight:500;text-decoration-line:line-through}.productCard__price-discount,.productCard__price-regular-without-discount{font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-weight:800}.productCard__divider{display:block;height:1px;background-color:var(--color-gray-elements)}.productCard__block{width:100%;height:15px;display:flex;justify-content:space-between;font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.productCard__info{color:var(--color-gray-secondary)}.productCard__value{color:var(--color-gray-primary)}.productCard__button{padding:11px 0;border:none;border-radius:5px;cursor:pointer;font-family:Mont-Regular,sans-serif;color:var(--color-bg);font-size:14px;font-weight:700;line-height:8px}.productCard__button-card{background-color:var(--color-gray-primary);width:100%;transition:box-shadow .3s}.productCard__button-card:hover{box-shadow:0 3px 13px #17203166}.productCard__button-card--active{background-color:var(--color-bg);color:var(--color-green);border:1px solid var(--color-gray-elements);pointer-events:none}.productCard__button-card--active:hover{box-shadow:none;border-color:inherit}.productCard__button-favorites{background-color:var(--color-bg);width:40px;flex-shrink:0;border:1px solid var(--color-gray-icons-placeholders);border-radius:5px;transition:border-color .3s}.productCard__button-favorites:hover{border-color:var(--color-gray-primary)}.productCard__button-favorites--active{border:1px solid var(--color-gray-elements)}.productCard:hover .productCard__container-photo{transform:scale(1.05)} diff --git a/public/assets/ProductCard-n_G8EIMu.js b/public/assets/ProductCard-n_G8EIMu.js deleted file mode 100644 index a9a0637385b..00000000000 --- a/public/assets/ProductCard-n_G8EIMu.js +++ /dev/null @@ -1 +0,0 @@ -import{r,G as C,j as a,L as x,c as l,I as _,i as m}from"./index-DZu0jUOh.js";const h=r.memo(({product:s,displayType:c})=>{const{cart:t,favorites:d,toggleFavorites:u,addToCart:p,theme:i}=r.useContext(C),n=r.useMemo(()=>t.some(({id:e})=>e===s.itemId),[t,s.itemId]),o=r.useMemo(()=>d.some(({itemId:e})=>e===s.itemId),[d,s.itemId]);return a.jsx("div",{className:"productCard",children:a.jsxs(x,{className:"productCard__container",to:`/${s.category}/${s.itemId}`,children:[a.jsx("div",{className:"productCard__container-photo",children:a.jsx("img",{src:s.image,alt:"Product's photo",className:"productCard__photo"})}),a.jsx("div",{className:"productCard__container-title",children:a.jsx("span",{className:"productCard__title",children:s.name})}),a.jsxs("div",{className:"productCard__container-price",children:[c==="fullPrice"&&a.jsx("span",{className:"productCard__price-regular-without-discount",children:`$${s.fullPrice}`}),c==="with-discount"&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"productCard__price-discount",children:`$${s.price}`}),a.jsx("span",{className:"productCard__price-regular",children:`$${s.fullPrice}`})]})]}),a.jsx("div",{className:"productCard__divider"}),a.jsxs("div",{className:"productCard__container-specifications",children:[a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"Screen"}),a.jsx("span",{className:"productCard__value",children:s.screen})]}),a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"Capacity"}),a.jsx("span",{className:"productCard__value",children:s.capacity})]}),a.jsxs("div",{className:"productCard__block",children:[a.jsx("span",{className:"productCard__info",children:"RAM"}),a.jsx("span",{className:"productCard__value",children:s.ram})]})]}),a.jsxs("div",{className:"productCard__container-buttons",children:[a.jsx("button",{className:l("productCard__button","productCard__button-card",{"productCard__button-card--active":n}),onClick:e=>{e.preventDefault(),p(s)},children:n?"Added":"Add to cart"}),a.jsx("button",{className:l("productCard__button","productCard__button-favorites",{"productCard__button-favorites--active":o}),onClick:e=>{e.preventDefault(),u(s)},children:o?a.jsx(_,{icon:m.favorites__filled[i]}):a.jsx(_,{icon:m.favorites[i]})})]})]})})});h.displayName="ProductCard";export{h as P}; diff --git a/public/assets/ProductsList-Bz-DDO8l.css b/public/assets/ProductsList-Bz-DDO8l.css deleted file mode 100644 index 55583659a69..00000000000 --- a/public/assets/ProductsList-Bz-DDO8l.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productsList{margin-top:24px;gap:40px 16px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.productsList{--columns: 12}}@media (min-width: 1200px){.productsList{--columns: 24}}@media (max-width: 640px){.productsList .productItem{grid-column:1/-1}}@media (min-width: 640px){.productsList .productItem{grid-column:span 6}}@media (min-width: 768px){.productsList .productItem{grid-column:span 4}}@media (min-width: 1200px){.productsList .productItem{grid-column:span 6}} diff --git a/public/assets/ProductsList-C8WnN_nq.js b/public/assets/ProductsList-C8WnN_nq.js deleted file mode 100644 index ea215db258e..00000000000 --- a/public/assets/ProductsList-C8WnN_nq.js +++ /dev/null @@ -1 +0,0 @@ -import{j as s}from"./index-DZu0jUOh.js";import{P as o}from"./ProductCard-n_G8EIMu.js";const m=({products:t,displayType:i})=>s.jsx("div",{className:"productsList",children:t.map(r=>s.jsx("div",{className:"productItem",children:s.jsx(o,{product:r,displayType:i})},r.id))});export{m as P}; diff --git a/public/assets/ProductsSlider-CAHW4_99.css b/public/assets/ProductsSlider-CAHW4_99.css deleted file mode 100644 index 2bf3eebba62..00000000000 --- a/public/assets/ProductsSlider-CAHW4_99.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.productsSlider{padding-left:16px}@media (min-width: 1200px){.productsSlider{margin-block:80px;padding-inline:16px;max-width:1136px}}@media (min-width: 1200px) and (min-width: 640px){.productsSlider{padding-inline:24px}}@media (min-width: 1200px) and (min-width: 1200px){.productsSlider{padding-inline:0;margin-inline:auto}}.productsSlider__container-top{padding-right:16px;display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;gap:72px}.productsSlider__title{font-size:22px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary)}@media (min-width: 640px){.productsSlider__title{font-size:32px}}.productsSlider__buttons{display:flex;gap:16px}.productsSlider__button{width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border .3s,background-color .3s}.productsSlider__button--disabled{cursor:not-allowed;border:1px solid var(--color-gray-elements);background-color:inherit}.productsSlider__button--disabled:hover{border:1px solid var(--color-gray-elements)}.productsSlider__viewport{overflow:hidden;width:100%}@media (min-width: 1200px){.productsSlider__viewport{width:1136px}}.productsSlider__track{display:flex;gap:16px;transition:transform .5s ease-in-out}.productsSlider__item{flex:0 0 auto;width:212px;height:442px}@media (min-width: 640px){.productsSlider__item{width:237px;height:515px}}@media (min-width: 1200px){.productsSlider__item{width:272px;height:509px}}body.theme_dark .productsSlider__button{border:none;background-color:var(--color-surface-2)}.productsSlider__button:not(.productsSlider__button--disabled):hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}body.theme_dark .productsSlider__button:not(.productsSlider__button--disabled):hover{border:none;background-color:var(--color-gray-icons-placeholders)}body.theme_dark .productsSlider__button--disabled{border:1px solid var(--color-gray-elements);background-color:inherit} diff --git a/public/assets/ProductsSlider-CeN1XtqL.js b/public/assets/ProductsSlider-CeN1XtqL.js deleted file mode 100644 index ed0c6359ae1..00000000000 --- a/public/assets/ProductsSlider-CeN1XtqL.js +++ /dev/null @@ -1 +0,0 @@ -import{r,G as v,j as s,c as _,I as a,i as n}from"./index-DZu0jUOh.js";import{P as b}from"./ProductCard-n_G8EIMu.js";const f=({title:m,products:c,displayType:h})=>{const{theme:d}=r.useContext(v),[l,o]=r.useState(272),p=16,[t,u]=r.useState(0);r.useEffect(()=>{const e=()=>{const x=window.innerWidth;x<640?o(212):x<1200?o(237):o(272)};return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]);const i=r.useMemo(()=>c.length-4,[c.length]),j=r.useCallback(()=>{te+1)},[t,i]),S=r.useCallback(()=>{t>0&&u(e=>e-1)},[t]);return s.jsxs("div",{className:"productsSlider",children:[s.jsxs("div",{className:"productsSlider__container-top",children:[s.jsx("h2",{className:"productsSlider__title",children:m}),s.jsxs("div",{className:"productsSlider__buttons",children:[s.jsx("div",{className:_("productsSlider__button",{"productsSlider__button--disabled":t===0}),onClick:S,children:t===0?s.jsx(a,{icon:n.arrow_left__disabled[d]}):s.jsx(a,{icon:n.arrow_left[d]})}),s.jsx("div",{className:_("productsSlider__button",{"productsSlider__button--disabled":t===i}),onClick:j,children:t===i?s.jsx(a,{icon:n.arrow_right__disabled[d]}):s.jsx(a,{icon:n.arrow_right[d]})})]})]}),s.jsx("div",{className:"productsSlider__viewport",children:s.jsx("div",{className:"productsSlider__track",style:{transform:`translateX(-${t*(l+p)}px)`},children:c.map(e=>s.jsx("div",{className:"productsSlider__item",style:{width:`${l}px`},children:s.jsx(b,{product:e,displayType:h})},e.id))})})]})};export{f as P}; diff --git a/public/assets/favicon-DR5FOLsX.svg b/public/assets/favicon-DR5FOLsX.svg deleted file mode 100644 index e1eb131d6dd..00000000000 --- a/public/assets/favicon-DR5FOLsX.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/assets/index--M-vjEFs.js b/public/assets/index--M-vjEFs.js deleted file mode 100644 index 39ad56f809b..00000000000 --- a/public/assets/index--M-vjEFs.js +++ /dev/null @@ -1 +0,0 @@ -import{r as c,G as g,j as e,I as _,i as u,L as p}from"./index-DZu0jUOh.js";import{P as x}from"./ProductsSlider-CeN1XtqL.js";import"./ProductCard-n_G8EIMu.js";const C=({allNewestProducts:r})=>{const i=r.map(a=>a.image),d=r.map(a=>a.name),m=r.map(a=>a.category+"/"+a.itemId),[l,o]=c.useState(0),{theme:t}=c.useContext(g),s=c.useRef(null),n=c.useCallback(()=>o(a=>(a+1)%i.length),[i.length]),y=c.useCallback(()=>o(a=>(a-1+i.length)%i.length),[i.length]);c.useEffect(()=>(s.current&&clearInterval(s.current),s.current=setInterval(n,3e3),()=>{s.current&&clearInterval(s.current)}),[]);const j=c.useCallback(a=>{o(a),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n]),b=c.useCallback(()=>{n(),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n]),N=c.useCallback(()=>{y(),s.current&&clearInterval(s.current),s.current=setInterval(n,3e3)},[n,y]);return e.jsxs("div",{className:"picturesSlider",children:[e.jsxs("div",{className:"picturesSlider__container",children:[e.jsx("div",{className:"picturesSlider__button",onClick:N,children:e.jsx(_,{icon:u.arrow_left[t]})}),e.jsxs("div",{className:"picturesSlider__content",children:[e.jsxs("div",{className:"picturesSlider__aside",children:[e.jsxs("div",{children:[e.jsxs("div",{children:[e.jsx("div",{className:"picturesSlider__aside-title",children:"Now available"}),e.jsxs("div",{className:"picturesSlider__aside-title",children:["in our store! ",e.jsx(_,{icon:u.ok[t]})]})]}),e.jsx("div",{className:"picturesSlider__aside-description",children:"Be the first"})]}),e.jsx(p,{to:m[l],className:"picturesSlider__aside-action",children:"Order now"}),e.jsx("p",{className:"",children:d[l]})]}),e.jsx("div",{className:"picturesSlider__container-image",children:i.map((a,h)=>e.jsx("img",{src:a,alt:"Slide",className:l===h?"picturesSlider__image picturesSlider__image--active":"picturesSlider__image"},h))})]}),e.jsx("div",{className:"picturesSlider__button",onClick:b,children:e.jsx(_,{icon:u.arrow_right[t]})})]}),e.jsx("div",{className:"picturesSlider__dots",children:i.map((a,h)=>e.jsx("div",{className:l===h?"picturesSlider__dot picturesSlider__dot--active":"picturesSlider__dot",onClick:()=>j(h)},h))})]})},v=()=>{const{allProducts:r}=c.useContext(g),{phonesLength:i,tabletsLength:d,accessoriesLength:m}=c.useMemo(()=>{const l=[],o=[],t=[];return r.forEach(s=>{s.category==="phones"&&l.push(s.id),s.category==="tablets"&&o.push(s.id),s.category==="accessories"&&t.push(s.id)}),{phonesLength:l.length,tabletsLength:o.length,accessoriesLength:t.length}},[r]);return e.jsx("div",{className:"shopByCategory",children:e.jsxs("div",{className:"shopByCategory__container",children:[e.jsx("h2",{className:"shopByCategory__title",children:"Shop by category"}),e.jsxs("div",{className:"shopByCategory__content",children:[e.jsx(p,{to:"/phones",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-phones.webp",alt:"Category Phones",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Mobile phones"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${i} models`})]})}),e.jsx(p,{to:"/tablets",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-tablets.webp",alt:"Category Tablets",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Tablets"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${d} models`})]})}),e.jsx(p,{to:"/accessories",className:"shopByCategory__link",children:e.jsxs("section",{className:"shopByCategory__block",children:[e.jsx("img",{src:"../../../public/img/category-accessories.webp",alt:"Category Accessories",className:"shopByCategory__block-image"}),e.jsx("h4",{className:"shopByCategory__block-title",children:"Accessories"}),e.jsx("span",{className:"shopByCategory__block-description",children:`${m} models`})]})})]})]})})},f=()=>{const{allProducts:r}=c.useContext(g);let i=[];const d=c.useMemo(()=>[...r].filter(t=>t.category==="phones").sort((t,s)=>s.year-t.year).slice(0,20),[r]),m=c.useMemo(()=>[...r].filter(t=>t.category==="tablets").sort((t,s)=>s.year-t.year).slice(0,20),[r]),l=c.useMemo(()=>[...r].filter(t=>t.category==="accessories").sort((t,s)=>s.year-t.year).slice(0,20),[r]);i=[...d.slice(0,5),...m.slice(0,5),...l.slice(0,5)];const o=c.useMemo(()=>[...r].map(t=>({...t,discount:(t.fullPrice-t.price)/t.fullPrice*100})).sort((t,s)=>s.discount-t.discount).slice(0,20),[r]);return e.jsxs("div",{className:"homePage",children:[e.jsx("h1",{className:"homePage__title",children:"Welcome to Nice Gadgets store!"}),e.jsx(C,{allNewestProducts:i}),e.jsx(x,{title:"Brand new models",products:d,displayType:"fullPrice"}),e.jsx(v,{}),e.jsx(x,{title:"Hot prices",products:o,displayType:"with-discount"})]})};export{f as HomePage}; diff --git a/public/assets/index-80CrQ2vW.css b/public/assets/index-80CrQ2vW.css deleted file mode 100644 index 9d69bcd52a1..00000000000 --- a/public/assets/index-80CrQ2vW.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.homePage__title{margin-block:24px;font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.homePage__title{padding-inline:24px}}@media (min-width: 1200px){.homePage__title{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.homePage__title{font-size:48px;line-height:56px;margin-block:32px}}@media (min-width: 1200px){.homePage__title{margin-block:56px}}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}p{font-family:Mont-Bold,sans-serif;color:#fff}.picturesSlider{margin-bottom:56px}@media (min-width: 640px){.picturesSlider{padding-inline:16px;max-width:1136px;margin-bottom:64px}}@media (min-width: 640px) and (min-width: 640px){.picturesSlider{padding-inline:24px}}@media (min-width: 640px) and (min-width: 1200px){.picturesSlider{padding-inline:0;margin-inline:auto}}@media (min-width: 1200px){.picturesSlider{margin-bottom:80px}}.picturesSlider__container{display:flex;justify-content:center;width:100%}.picturesSlider__container-image{position:relative;width:100%;aspect-ratio:1/1;flex:1}@media (min-width: 640px){.picturesSlider__container-image{min-height:189px;max-height:400px;aspect-ratio:400/189}}.picturesSlider__content{display:flex;padding:16px;margin-inline:16px;background-color:#000;width:100%}.picturesSlider__aside{display:none;flex:1;justify-content:space-between;flex-direction:column;background-color:#222;border-radius:16px;padding:16px}@media (min-width: 640px){.picturesSlider__aside{display:flex}}.picturesSlider__aside-title{font-family:Mont-Bold,sans-serif;color:#fff;background-image:linear-gradient(90deg,#7c4af4 30%,#d862ff,#7c4af4 70%);background-size:400%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-size:32px;line-height:1;animation:shimmer 1.5s infinite linear}@keyframes shimmer{0%{background-position:100% 100%}to{background-position:0 0}}.picturesSlider__aside-description{font-family:Mont-Regular,sans-serif;color:#aeaeae;margin-top:8px;font-size:12px}.picturesSlider__aside-action{font-family:Mont-Bold,sans-serif;width:fit-content;border:1px solid #444;padding:12px 16px;border-radius:16px;text-decoration:none;color:#fff;font-size:12px}.picturesSlider__image{width:100%;height:100%;object-fit:contain;position:absolute;top:0;left:0;transition:opacity .5s ease-in-out;opacity:0}.picturesSlider__image--active{opacity:1}.picturesSlider__button{display:none;transition:border-color .3s ease,background-color .3s ease}@media (min-width: 640px){.picturesSlider__button{display:flex;align-items:center;justify-content:center;width:32px;background-color:var(--color-bg);border:1px solid var(--color-gray-icons-placeholders);cursor:pointer}}.picturesSlider__button:hover{border-color:var(--color-gray-primary);background-color:var(--color-hover)}.picturesSlider__dots{height:24px;display:flex;margin:0 auto;justify-content:center}.picturesSlider__dot{width:24px;height:24px;cursor:pointer;position:relative}.picturesSlider__dot:after{content:"";position:absolute;width:14px;height:4px;background-color:var(--color-gray-elements);top:50%;left:50%;transform:translate(-50%,-50%)}.picturesSlider__dot--active:after{background-color:var(--color-gray-primary)}body.theme_dark .picturesSlider__button{border:none;background-color:var(--color-surface-2)}body.theme_dark .picturesSlider__button:hover{background-color:var(--color-gray-icons-placeholders)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.shopByCategory__container{margin-block:56px;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.shopByCategory__container{padding-inline:24px}}@media (min-width: 1200px){.shopByCategory__container{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.shopByCategory__container{margin-block:64px}}.shopByCategory__title{font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;line-height:30.8px;letter-spacing:-.01em;color:var(--color-gray-primary);margin-bottom:24px}@media (min-width: 640px){.shopByCategory__title{font-family:Mont-Bold,sans-serif;font-size:32px;line-height:41px}}.shopByCategory__content{gap:32px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.shopByCategory__content{--columns: 12}}@media (min-width: 1200px){.shopByCategory__content{--columns: 24}}.shopByCategory__link{text-decoration:none;grid-column:1/-1}@media (min-width: 640px){.shopByCategory__link{grid-column:span 4}}@media (min-width: 1200px){.shopByCategory__link{grid-column:span 8}}.shopByCategory__block{display:flex;flex-direction:column;align-items:center}.shopByCategory__block-image{display:block;max-width:auto;height:400px;border:0;transform:translate(10px,5px);transition:transform .3s}.shopByCategory__block-image:hover{transform:scale(1.05)}@media (min-width: 640px){.shopByCategory__block-image{max-width:100%}}.shopByCategory__block-title{margin-top:24px;font-family:Mont-SemiBold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}.shopByCategory__block-description{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:14px;font-weight:600;line-height:21px;margin-top:4px} diff --git a/public/assets/index-BD-w6JY5.css b/public/assets/index-BD-w6JY5.css deleted file mode 100644 index 48825ac3512..00000000000 --- a/public/assets/index-BD-w6JY5.css +++ /dev/null @@ -1 +0,0 @@ -.container{text-align:center;margin-top:40px;font-family:Mont-SemiBold,sans-serif;color:var(--color-gray-primary);font-size:48px} diff --git a/public/assets/index-BV-oWgkF.css b/public/assets/index-BV-oWgkF.css deleted file mode 100644 index aca972f3a55..00000000000 --- a/public/assets/index-BV-oWgkF.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.detailsPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.detailsPage{padding-inline:24px}}@media (min-width: 1200px){.detailsPage{padding-inline:0;margin-inline:auto}}.detailsPage__title{margin-bottom:32px;font-size:22px;font-family:Mont-Bold,sans-serif;font-weight:800;line-height:41px;letter-spacing:-.01em;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__title{margin-bottom:40px;font-size:32px}}.detailsPage__error-message{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.detailsPage__image{width:100%;height:100%;object-fit:contain;position:absolute;opacity:0;transition:opacity .3s ease;z-index:-1}.detailsPage__image.detailsPage__image--active{opacity:1}.detailsPage__content-top{display:flex;flex-direction:column;width:100%}@media (min-width: 640px){.detailsPage__content-top{flex-direction:row;grid-column:1/-1;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 640px) and (min-width: 640px){.detailsPage__content-top{--columns: 12}}@media (min-width: 640px) and (min-width: 1200px){.detailsPage__content-top{--columns: 24}}.detailsPage__container-imageSlider{order:2;display:flex;gap:8px;margin-bottom:40px}@media (min-width: 640px){.detailsPage__container-imageSlider{grid-column:1/2;flex-direction:column;justify-content:flex-start;gap:16px;margin:0}}@media (min-width: 1200px){.detailsPage__container-imageSlider{grid-column:span 2}}.detailsPage__container-photos{padding:2px;border:1px solid var(--color-gray-elements);transition:border .3s ease;display:flex;align-items:center;justify-content:center}.detailsPage__container-photos--active{border:1px solid var(--color-gray-primary)}.detailsPage__container-price{display:flex;gap:8px;margin-top:32px;align-items:center}.detailsPage__container-specifications{display:flex;flex-direction:column;padding-block:8px;gap:8px;margin-top:32px}.detailsPage__container-buttons{margin-top:16px;width:100%;display:flex;gap:8px}.detailsPage__photo{width:100%;aspect-ratio:1/1;object-fit:contain;cursor:pointer}.detailsPage__photo-mask{order:1;aspect-ratio:1/1;margin-bottom:16px;position:relative}@media (min-width: 640px){.detailsPage__photo-mask{order:2;grid-column:span 6;margin-bottom:0}}@media (min-width: 1200px){.detailsPage__photo-mask{grid-column:span 10}}.detailsPage__characteristics{order:3;width:100%;margin-right:16px;display:flex;flex-direction:column}@media (min-width: 640px){.detailsPage__characteristics{grid-column:span 5}}@media (min-width: 1200px){.detailsPage__characteristics{grid-column:14/21}}.detailsPage__colors{display:flex;flex-direction:column;gap:8px}.detailsPage__colors-list{list-style:none;display:flex;gap:5px}.detailsPage__color-item{display:flex;justify-content:center;align-items:center;cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-elements);border-radius:50%;transition:border .3s}.detailsPage__color-item--selected{border:1px solid var(--color-gray-primary)}.detailsPage__color-circle{width:30px;height:30px;box-sizing:border-box;border-radius:50%;border:2px solid var(--color-bg)}.detailsPage__line{height:1px;background-color:var(--color-gray-elements);margin-top:24px}.detailsPage__line-bottom{margin-top:16px}.detailsPage__capacity{margin-top:24px;display:flex;flex-direction:column;gap:8px}.detailsPage__capacity-list{display:flex;gap:8px;list-style:none}.detailsPage__capacity-block{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;color:var(--color-gray-primary)}.detailsPage__capacity-block--selected{color:var(--color-bg)}.detailsPage__capacity-item{padding:6px;border:1px solid var(--color-gray-icons-placeholders);cursor:pointer;transition:border-color .3s}.detailsPage__capacity-item:hover{border-color:var(--color-gray-primary)}.detailsPage__capacity-item--selected{background-color:var(--color-gray-primary)}.detailsPage__price-regular{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:22px;font-weight:500;text-decoration-line:line-through}.detailsPage__price-discount{font-family:Mont-Bold,sans-serif;color:var(--color-gray-primary);font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em}.detailsPage__block{width:100%;height:15px;display:flex;justify-content:space-between;font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.detailsPage__block-about{width:560px}.detailsPage__block-techSpecs{width:512px}.detailsPage__block-title{font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;line-height:30.8px;color:var(--color-gray-primary)}.detailsPage__button{border:none;cursor:pointer;background-color:var(--color-bg);font-family:Mont-Regular,sans-serif;color:var(--color-bg);font-size:14px;font-weight:700;line-height:21px;height:40px;display:flex;align-items:center;justify-content:center}.detailsPage__button-card{background-color:var(--color-gray-primary);width:100%;transition:box-shadow .3s}.detailsPage__button-card:hover{box-shadow:0 3px 13px #17203166}.detailsPage__button-card--active{background-color:var(--color-bg);color:var(--color-green);border:1px solid var(--color-gray-elements)}.detailsPage__button-favorites{width:40px;flex-shrink:0;border:1px solid var(--color-gray-icons-placeholders)}.detailsPage__button-favorites--active{border:1px solid var(--color-gray-elements)}.detailsPage__info{color:var(--color-gray-secondary);font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:600}.detailsPage__value{color:var(--color-gray-primary)}.detailsPage__content-buttom{display:flex;gap:64px;margin-top:80px}.detailsPage__section-title{font-family:Mont-SemiBold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}.detailsPage__section-description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs{display:flex;flex-direction:column;gap:8px}.detailsPage__techSpecs-content{display:flex;flex-direction:column;gap:24px}.detailsPage__techSpecs-title{color:var(--color-gray-primary)}.detailsPage__techSpecs-list{list-style:none;display:flex;flex-direction:column;gap:8px}.detailsPage__techSpecs-item{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-primary)}.detailsPage__techSpecs-item-description{color:var(--color-gray-secondary)}.detailsPage__container-photos:not(.detailsPage__container-photos--active):hover{border:1px solid var(--color-gray-icons-placeholders)}.detailsPage__color-item:not(.detailsPage__color-item--selected):hover{border:1px solid var(--color-gray-icons-placeholders)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.detailsPage__content-buttom{gap:32px;display:flex;flex-direction:column;margin-bottom:56px}@media (min-width: 640px){.detailsPage__content-buttom{margin-bottom:64px}}@media (min-width: 1200px){.detailsPage__content-buttom{margin-block:80px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 1200px) and (min-width: 640px){.detailsPage__content-buttom{--columns: 12}}@media (min-width: 1200px) and (min-width: 1200px){.detailsPage__content-buttom{--columns: 24}}.detailsPage__block-about{width:100%}@media (min-width: 1200px){.detailsPage__block-about{grid-column:1/13}}.detailsPage__block-techSpecs{width:100%}@media (min-width: 1200px){.detailsPage__block-techSpecs{grid-column:14/-1}}.detailsPage__block-title{font-family:Mont-Bold,sans-serif;font-size:20px;font-weight:700;line-height:25.56px;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__block-title{font-size:22px;font-weight:800;line-height:30.8px}}.detailsPage__line-bottom{width:100%;height:1px;background-color:var(--color-gray-elements);margin-top:16px}.detailsPage__description{margin-top:32px;display:flex;flex-direction:column;gap:32px}.detailsPage__section{display:flex;flex-direction:column;gap:16px}.detailsPage__section-title{font-family:Mont-SemiBold,sans-serif;font-size:16px;font-weight:700;line-height:20.45px;color:var(--color-gray-primary)}@media (min-width: 640px){.detailsPage__section-title{font-size:20px;font-weight:700;line-height:25.56px}}.detailsPage__section-title--bottom{margin-top:80px;margin-bottom:24px}.detailsPage__section-description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs-content{display:flex;flex-direction:column;gap:8px;margin-top:25px}.detailsPage__techSpecs-block{display:flex;justify-content:space-between;gap:20px}.detailsPage__techSpecs-title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.detailsPage__techSpecs-value{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-primary)} diff --git a/public/assets/index-C4ngy4_v.js b/public/assets/index-C4ngy4_v.js deleted file mode 100644 index ead57cdaee5..00000000000 --- a/public/assets/index-C4ngy4_v.js +++ /dev/null @@ -1 +0,0 @@ -import{j as o,L as e}from"./index-DZu0jUOh.js";const s=()=>o.jsxs("div",{className:"container",children:[o.jsx("p",{children:"Page not found"}),o.jsx(e,{to:"/",children:"Go to HomePage"})]});export{s as NotFoundPage}; diff --git a/public/assets/index-C5E6A8ui.js b/public/assets/index-C5E6A8ui.js deleted file mode 100644 index 87206c78b40..00000000000 --- a/public/assets/index-C5E6A8ui.js +++ /dev/null @@ -1 +0,0 @@ -import{r as a,G as n,u as c,j as e}from"./index-DZu0jUOh.js";import{P as l}from"./ProductsList-C8WnN_nq.js";import{L as m}from"./Linkline-BVE7q3mI.js";import"./ProductCard-n_G8EIMu.js";const v=()=>{const{favorites:r}=a.useContext(n),[o]=c(),s=o.get("query")||"",t=a.useMemo(()=>s.length?r.filter(({name:i})=>i.toLowerCase().includes(s.toLowerCase().trim())):r,[r,s]);return e.jsxs("div",{className:"favoritesPage",children:[e.jsx(m,{productType:"Favorites"}),e.jsx("h1",{className:"favoritesPage__title",children:"Favorites"}),e.jsx("span",{className:"favoritesPage__description",children:`${t.length} ${t.length===1?"model":"models"}`}),t.length?e.jsx("div",{className:"favoritesPage__content",children:e.jsx(l,{products:t,displayType:"with-discount"})}):e.jsx("div",{className:"favoritesPage__empty-content",children:s.length?"No favorites match your query":"Your favorites list is empty"})]})};export{v as FavoritesPage}; diff --git a/public/assets/index-C9RfMEqD.css b/public/assets/index-C9RfMEqD.css deleted file mode 100644 index 94f848242bd..00000000000 --- a/public/assets/index-C9RfMEqD.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.favoritesPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.favoritesPage{padding-inline:24px}}@media (min-width: 1200px){.favoritesPage{padding-inline:0;margin-inline:auto}}.favoritesPage__empty-content{margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);display:flex;align-items:center;justify-content:center}.favoritesPage__title{margin-top:16px;margin-bottom:40px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}.favoritesPage__description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)} diff --git a/public/assets/index-CDfWgnoX.js b/public/assets/index-CDfWgnoX.js deleted file mode 100644 index 6762d099ab9..00000000000 --- a/public/assets/index-CDfWgnoX.js +++ /dev/null @@ -1 +0,0 @@ -import{r as s,G as w,j as e,I as g,i as _,c as C,u as R,a as $}from"./index-DZu0jUOh.js";import{L as q,c as B}from"./Linkline-BVE7q3mI.js";import{P as F}from"./ProductsList-C8WnN_nq.js";import{L as G}from"./Loader-CdfK6LLs.js";import"./ProductCard-n_G8EIMu.js";const M=s.memo(({label:r,selected:u,options:t,onChange:a})=>{const{theme:n}=s.useContext(w),[o,p]=s.useState(!1),c=s.useRef(null);s.useEffect(()=>{const l=x=>{c.current&&!c.current.contains(x.target)&&p(!1)};return document.addEventListener("mousedown",l),()=>{document.removeEventListener("mousedown",l)}},[]);const i=s.useCallback(()=>p(l=>!l),[]),d=s.useCallback(l=>{a(l),p(!1)},[a]);return e.jsxs("div",{ref:c,className:"dropdown",children:[e.jsx("div",{className:"dropdown__label",children:r}),e.jsxs("button",{className:`dropdown__button ${o?"dropdown__button--open":""}`,onClick:i,children:[e.jsx("div",{className:"dropdown__title",children:u}),e.jsx("div",{className:"dropdown__icon",children:e.jsx(g,{icon:o?_.arrow_down[n]:_.arrow_right[n]})})]}),o&&e.jsx("ul",{className:"dropdown__options",children:t.map(l=>e.jsx("li",{className:"dropdown__option",onClick:()=>d(l),children:l},l))})]})});M.displayName="Dropdown";const N=4,D=({total:r,perPage:u,currentPage:t,onPageChange:a})=>{const{theme:n}=s.useContext(w),o=s.useMemo(()=>Math.ceil(r/u),[u,r]),[p,c]=s.useMemo(()=>{let i=Math.max(1,t-1),d=Math.min(o,t+2);return d-i+1a(t-1),disabled:t===1,children:t===1?e.jsx(g,{icon:_.arrow_left__disabled[n]}):e.jsx(g,{icon:_.arrow_left[n]})}),e.jsx("div",{className:"pagination__button-container",children:Array.from({length:c-p+1},(i,d)=>e.jsx("button",{className:C("pagination__button-page",{"pagination__button-page--active":t===p+d}),onClick:()=>a(p+d),children:p+d},p+d))}),e.jsx("button",{className:C("pagination__button",{"pagination__button--disabled":t===o}),onClick:()=>a(t+1),disabled:t===o,children:t===o?e.jsx(g,{icon:_.arrow_right__disabled[n]}):e.jsx(g,{icon:_.arrow_right[n]})}),e.jsxs("p",{children:["Total pages: ",o]})]})};function y(r,u){const t=new URLSearchParams(r.toString());return Object.entries(u).forEach(([a,n])=>{n===null?t.delete(a):Array.isArray(n)?(t.delete(a),n.forEach(o=>{t.append(a,o)})):t.set(a,n)}),t.toString()}const U=(r,{sortBy:u,query:t})=>{let a=[...r];switch(t&&(a=a.filter(n=>n.name.toLowerCase().includes(t.toLowerCase().trim()))),u){case"Newest":return a.sort((n,o)=>o.year-n.year);case"Alphabetically":return a.sort((n,o)=>n.name.localeCompare(o.name));case"Cheapest":return a.sort((n,o)=>n.fullPrice-o.fullPrice);default:return a}},K=({category:r})=>{const{allProducts:u}=s.useContext(w),{theme:t}=s.useContext(w),[a,n]=s.useState(!1),[o,p]=s.useState(null),[c,i]=R(),d=c.get("sort")||"Alphabetically",l=c.get("perPage")||"All",x=Number(c.get("page"))||1,j=c.get("query")||"",k=$(),A=s.useCallback(()=>{window.scrollTo({top:0,behavior:"smooth"})},[]),v=s.useMemo(()=>k.pathname.split("/")[1],[k.pathname]),L=s.useMemo(()=>u.filter(m=>m.category===r),[u,r]),h=s.useMemo(()=>U(L,{sortBy:d,query:j}),[L,j,d]),b=s.useMemo(()=>h.length,[h.length]),S=s.useCallback(m=>{i(y(c,m==="Alphabetically"?{sort:null}:{sort:m}))},[c,i]),T=s.useCallback(m=>{i(y(c,m==="All"?{perPage:null,page:null}:{perPage:m,page:"1"}))},[c,i]),E=s.useCallback(m=>{const P=m===1?{page:null}:{page:String(m)};i(y(c,P))},[c,i]),I=s.useMemo(()=>l==="All"?1:Math.ceil(b/+l),[b,l]),f=s.useMemo(()=>(x-1)*+l,[x,l]),O=s.useMemo(()=>l==="All"?h:h.slice(f,f+ +l),[l,f,h]);return s.useEffect(()=>{n(!0),p(null);const m=setTimeout(()=>{try{(!u||u.length===0)&&p("Failed to load products")}catch{p("Failed to load products")}finally{n(!1)}},1e3);return()=>clearTimeout(m)},[r,u]),e.jsxs("div",{className:"productsPage",children:[a&&e.jsx(G,{}),!a&&o&&e.jsxs("div",{className:"productsPage__error",children:[e.jsx("p",{children:"Something went wrong. Please try again."}),e.jsx("button",{onClick:()=>window.location.reload(),children:"Reload"})]}),!a&&!o&&!h.length&&!j?e.jsx("div",{className:"productsPage__no-products",children:e.jsxs("p",{children:["There are no ",r," yet."]})}):null,!a&&!o&&!h.length&&j?e.jsx("p",{className:"productsPage__no-products",children:`There are no ${v} matching the query`}):null,!a&&!o&&h.length?e.jsxs(e.Fragment,{children:[e.jsx(q,{productType:r}),e.jsx("h1",{className:"productsPage__title",children:r&&`${B(r)} page`}),e.jsx("span",{className:"productsPage__description",children:`${b} model${b!==1?"s":""}`}),e.jsxs("div",{className:"productsPage__dropdown",children:[e.jsx("div",{className:"productsPage__dropdown--sortBy",children:e.jsx(M,{label:"Sort by",selected:d,options:["Newest","Cheapest","Alphabetically"],onChange:S})}),e.jsx("div",{className:"productsPage__dropdown--itemsPerPage",children:e.jsx(M,{label:"Items on page",selected:l,options:["4","8","16","All"],onChange:T})})]}),e.jsx("button",{className:"buttonUp",onClick:A,children:e.jsx(g,{icon:_.arrow_left[t]})}),e.jsx(F,{products:O,displayType:"with-discount"}),l!=="All"&&I>1&&e.jsx(D,{total:b,perPage:+l,currentPage:x,onPageChange:E})]}):null]})};export{K as ProductPage}; diff --git a/public/assets/index-CS6BVxGO.css b/public/assets/index-CS6BVxGO.css deleted file mode 100644 index aca5be5f3da..00000000000 --- a/public/assets/index-CS6BVxGO.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}*{margin:0;padding:0}.Layout{display:flex;flex-direction:column;min-height:100vh;position:relative;min-width:320px;scroll-behavior:smooth}.Layout__content{flex-grow:1}.Layout__header{position:sticky;top:0;z-index:1}body.theme_dark{background-color:var(--color-bg)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.header__logo{width:64px;height:22px}@media (min-width: 1200px){.header__logo{width:80px;height:28px}}.header__logo-container{display:flex;height:100%;width:96px;align-items:center;justify-content:center;flex-shrink:0}@media (min-width: 1200px){.header__logo-container{width:128px}}.header__menu{display:none}@media (min-width: 640px){.header__menu{display:flex}}.header__list{list-style:none;display:flex;align-items:center;gap:24px;text-decoration:none}@media (min-width: 1200px){.header__list{gap:64px}}.header__item{position:relative;display:inline-block;text-transform:uppercase;text-decoration:none;line-height:48px;font-family:Mont-Bold,sans-serif;color:var(--color-gray-secondary);font-size:12px;font-weight:800;letter-spacing:.04em;box-sizing:border-box}@media (min-width: 1200px){.header__item{line-height:64px}}.header__item:hover{color:var(--color-gray-primary)}.header__item:after,.header__icon:after{content:"";position:absolute;display:block;height:0;width:100%;background-color:var(--color-gray-primary);transition:height .3s ease,transform .3s ease;transform-origin:left;bottom:0;box-sizing:border-box}.header__item:hover:after,.header__icon:hover:after{height:2px;transform:scale(1)}.header__item--active{color:var(--color-gray-primary)}.header__item--active:after{height:2px;transition:none}.header__switch-theme{background:none;border:none;cursor:pointer;order:1;color:var(--color-gray-secondary);font-size:12px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;text-decoration:none;line-height:48px;font-family:Mont-Bold,sans-serif;box-sizing:border-box;flex-shrink:0;position:relative;display:inline-block}@media (min-width: 640px){.header__switch-theme{order:0}}@media (min-width: 1200px){.header__switch-theme{line-height:64px}}.header__switch-theme:hover{color:var(--color-gray-primary)}.header__buttons-right{height:100%;flex-grow:1;display:flex;justify-content:flex-end;align-items:center}.header__buttons-wrapper{display:none}@media (min-width: 640px){.header__buttons-wrapper{display:flex}}.header__buttons-wrapper--bottom{display:flex;position:fixed;bottom:0;left:0;right:0;justify-content:space-between;background-color:var(--color-bg);height:64px;border-top:1px solid var(--color-gray-elements)}.header__icon{width:48px;height:48px;box-shadow:-1px 0 0 0 var(--color-gray-elements);display:flex;align-items:center;justify-content:center;position:relative}@media (min-width: 640px){.header__icon{display:flex}}@media (min-width: 1200px){.header__icon{width:64px;height:64px}}.header__buttons-wrapper--bottom .header__icon{width:100%;height:100%;align-items:center;justify-content:center}.header__icon:hover{color:var(--color-gray-primary);background:var(--color-hover)}body.theme_dark .header__icon:hover{transition:background-color .3s}body.theme_dark .header__icon:hover:hover{background-color:var(--color-gray-icons-placeholders)}.header__icon--active:after{content:"";position:absolute;width:64px;width:100%;background-color:var(--color-gray-primary)}.header__icon-wrapper{width:28px;height:28px;position:relative;display:flex;align-items:center;justify-content:center}.header__quantity{position:absolute;top:0;right:0;background-color:var(--color-red);color:#fff;border:1px solid white;border-radius:50%;width:14px;height:14px;display:flex;justify-content:center;align-items:center;font-family:Mont-Regular,sans-serif;font-size:9px;font-weight:700}.header__icon--menu{display:flex;order:2}@media (min-width: 640px){.header__icon--menu{display:none}}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.icon__picture{display:flex;width:16px;height:16px}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.header{height:48px;display:flex;align-items:center;justify-content:space-between;width:100%;gap:16px;box-shadow:0 1px 0 0 var(--color-gray-elements);background-color:var(--color-bg)}@media (min-width: 1200px){.header{height:64px}}.header__search-wrapper{position:relative;display:flex;align-items:center;margin-right:16px}.header__search-input{height:48px;box-shadow:-1px 0 0 0 var(--color-gray-elements);width:100%;padding-inline:8px;background-color:var(--color-bg);font-family:Mont-Regular,sans-serif;color:var(--color-gray-primary);font-size:14px;font-weight:400;line-height:21px;outline:none;border:none}@media (min-width: 640px){.header__search-input{flex-grow:1}}@media (min-width: 1200px){.header__search-input{height:64px}}.header__search-input .header__search-input::placeholder{font-family:Mont-Regular,sans-serif;color:var(--color-gray-secondary);font-size:12px;font-weight:400;line-height:21px;transition:opacity .3s ease}.header__search-input .header__search-input:focus::placeholder{opacity:0}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.menu{display:flex;flex-direction:column;align-items:center;justify-content:center;position:fixed;top:48px;bottom:64px;width:100%;background-color:var(--color-bg);transform:translate(-100%);transition:transform .3s ease,opacity .3s ease;opacity:0;z-index:1;pointer-events:none}.menu__list{list-style:none;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:24px}.menu__link{position:relative;font-family:Molt-Bold,sans-serif;font-weight:800;font-size:12px;letter-spacing:.04em;text-align:center;text-transform:uppercase;color:var(--color-gray-secondary);text-decoration:none;display:flex}.menu__link:hover{color:var(--color-gray-primary)}.menu__link:after{content:"";position:absolute;display:block;height:0;width:100%;background-color:var(--color-gray-primary);bottom:-8px;left:0;transition:height .3s ease;box-sizing:content-box}.menu__link:hover:after{height:1px}.menu--open{transform:translate(0);opacity:1;pointer-events:all}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.footer{box-shadow:0 -1px 0 0 var(--color-gray-elements)}.footer__container{display:flex;flex-direction:column;gap:32px;padding-block:32px;margin-top:64px;padding-inline:16px;max-width:1136px}@media (min-width: 640px){.footer__container{padding-inline:24px}}@media (min-width: 1200px){.footer__container{padding-inline:0;margin-inline:auto}}@media (min-width: 640px){.footer__container{flex-direction:row;justify-content:space-between;align-items:center}}@media (min-width: 1200px){.footer__container{margin-top:80px}}.footer__logo{width:89px;height:32px}@media (min-width: 640px){.footer__logo-container{flex-grow:1}}.footer__items{display:flex;flex-direction:column;gap:16px}@media (min-width: 640px){.footer__items{flex-direction:row;justify-content:space-between}}@media (min-width: 1200px){.footer__items{align-items:center}}.footer__link{text-transform:uppercase;text-decoration:none;font-family:Mont-Bold,sans-serif;font-size:12px;font-weight:800;line-height:11px;letter-spacing:.04em;color:var(--color-gray-secondary);transition:color .3s}.footer__link:hover{color:var(--color-gray-primary)}.footer__block{display:flex;align-items:center;justify-content:center;gap:16px;cursor:pointer}@media (min-width: 640px){.footer__block{justify-content:end;flex-grow:1}}.footer__button{cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);transform:rotate(90deg);transition:border-color .3s ease}.footer__button:hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}.footer__button-title{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:700;color:var(--color-gray-secondary)}body.theme_dark .footer__button{border:none;background-color:var(--color-surface-2);transition:background-color .3s}body.theme_dark .footer__button:hover{background-color:var(--color-gray-icons-placeholders)} diff --git a/public/assets/index-D68rl43-.js b/public/assets/index-D68rl43-.js deleted file mode 100644 index 884ed68cb3f..00000000000 --- a/public/assets/index-D68rl43-.js +++ /dev/null @@ -1 +0,0 @@ -import{r as c,G as p,j as t,L as j,c as N,I as d,i as _,a as g}from"./index-DZu0jUOh.js";import{B as C}from"./ButtonBack-DRk2FjGf.js";const x=c.memo(({cartProduct:{id:e,product:{name:n,price:r,image:i,category:m},quantity:a}})=>{const{updateQuantity:o,theme:s}=c.useContext(p),l=c.useMemo(()=>r*a,[r,a]);return t.jsxs("div",{className:"cartItem",children:[t.jsxs("div",{className:"cartItem__wrapperTop",children:[t.jsx("button",{className:"cartItem__icon-close",onClick:()=>o(e,0)}),t.jsxs(j,{to:`/${m}/${e}`,className:"cartItem__link",children:[t.jsx("img",{src:i,alt:"Image product",className:"cartItem__image"}),t.jsx("div",{className:"cartItem__title",children:n})]})]}),t.jsxs("div",{className:"cartItem__wrapperBottom",children:[t.jsxs("div",{className:"cartItem__counter-container",children:[t.jsx("button",{className:N("cartItem__button",{"cartItem__button--disabled":a===1}),onClick:()=>{a>1&&o(e,a-1)},children:a===1?t.jsx(d,{icon:_.minus__disabled[s]}):t.jsx(d,{icon:_.minus[s]})}),t.jsx("div",{className:"cartItem__counter",children:a}),t.jsx("button",{className:"cartItem__button",onClick:()=>o(e,a+1),children:t.jsx(d,{icon:_.plus[s]})})]}),t.jsx("div",{className:"cartItem__price",children:`$${l}`})]})]})});x.displayName="CartItem";const v=()=>{const{cart:e,clearShoppingCart:n}=c.useContext(p),{pathname:r}=g(),i=c.useMemo(()=>r.slice(1,2).toUpperCase()+r.slice(2),[r]),{totalCount:m,totalQuantity:a}=c.useMemo(()=>{let s=0,l=0;for(const{quantity:u,product:{price:h}}of e)s+=u,l+=u*h;return{totalQuantity:s,totalCount:l}},[e]),o=c.useCallback(()=>{confirm("Checkout is not implemented yet. Do you want to clear the Cart?")&&n()},[n]);return t.jsxs("div",{className:"cartPage",children:[t.jsx(C,{}),t.jsx("h1",{className:"cartPage__title",children:i}),e.length?null:t.jsxs("div",{className:"cartPage__empty-content",children:[t.jsx("span",{className:"cartPage__empty-content-title",children:"Your cart is empty"}),t.jsx("img",{src:"img/cart-is-empty.png",alt:"Empty shopping cart",className:"cartPage__image-empty"})]}),e.length?t.jsxs("div",{className:"cartPage__content",children:[t.jsx("div",{className:"cartPage__content-container",children:e.map(s=>t.jsx(x,{cartProduct:s},s.id))}),t.jsxs("div",{className:"cartPage__total",children:[t.jsxs("div",{className:"cartPage__total-count",children:["$",m]}),t.jsxs("div",{className:"cartPage__total-title",children:["Total for ",a," items"]}),t.jsx("div",{className:"cartPage__line"}),t.jsx("button",{className:"cartPage__button-checkout",onClick:o,children:"Checkout"})]})]}):null]})};export{v as ShoppingCartPage}; diff --git a/public/assets/index-DZGfIgcM.js b/public/assets/index-DZGfIgcM.js deleted file mode 100644 index eea0027dc26..00000000000 --- a/public/assets/index-DZGfIgcM.js +++ /dev/null @@ -1,4 +0,0 @@ -import{r as c,G as C,j as e,c as g,N as S,I as f,i as k,b as I,a as L,g as D,L as T}from"./index-DZu0jUOh.js";import{L as E}from"./Linkline-BVE7q3mI.js";import{P as M}from"./ProductsSlider-CeN1XtqL.js";import{B as R}from"./ButtonBack-DRk2FjGf.js";import{L as G}from"./Loader-CdfK6LLs.js";import"./ProductCard-n_G8EIMu.js";const w={graphite:"#383838",gold:"#FFD700",sierrablue:"#6CABDD",black:"#000000",rosegold:"#B76E79",silver:"#C0C0C0",spacegray:"#4B4F54",white:"#FFFFFF",yellow:"#FFFF00",red:"#FF0000",coral:"#FF7F50",midnight:"#2C3E50",purple:"#800080",spaceblack:"#1D1D1D",blue:"#0000FF",pink:"#FFC0CB",green:"#008000",midnightgreen:"#004953"},y=(s,l)=>s.find(t=>t.itemId===l),z=({selectedProduct:s,specificProducts:l})=>{const{allProducts:t,cart:n,favorites:r,toggleFavorites:P,addToCart:h,theme:p}=c.useContext(C),[x,o]=c.useState(0),_=c.useCallback(a=>{const i=y(t,a.id);i&&h(i)},[h,t]),N=c.useCallback(a=>{const i=y(t,a.id);i&&P(i)},[t,P]),m=c.useCallback((a,i)=>{const{color:F,namespaceId:$,capacity:A}=s,u=l.find(({color:v,namespaceId:B,capacity:b})=>B===$&&(a==="color"&&v===i&&b===A||a==="capacity"&&b===i&&v===F));return(u==null?void 0:u.id)??""},[s,l]),d=c.useMemo(()=>n.some(a=>a.id===s.id),[n,s.id]),j=c.useMemo(()=>r.some(a=>a.itemId===s.id),[r,s.id]);return e.jsxs("div",{className:"detailsPage__content-top",children:[e.jsx("div",{className:"detailsPage__container-imageSlider",children:s.images.map((a,i)=>e.jsx("div",{className:g("detailsPage__container-photos",{"detailsPage__container-photos--active":x===i}),children:e.jsx("img",{src:`./${a}`,alt:`Thumbnail ${i+1}`,className:"detailsPage__photo",onClick:()=>o(i)})},i))}),e.jsx("div",{className:"detailsPage__photo-mask",children:s.images.map((a,i)=>e.jsx("img",{src:`./${a}`,alt:`Selected Photo ${i+1}`,className:g("detailsPage__image",{"detailsPage__image--active":x===i})},i))}),e.jsxs("div",{className:"detailsPage__characteristics",children:[e.jsxs("div",{className:"detailsPage__colors",children:[e.jsx("span",{className:` - detailsPage__colors-title detailsPage__info`,children:"Available colors"}),e.jsx("ul",{className:"detailsPage__colors-list",children:s.colorsAvailable.map(a=>e.jsx(S,{to:`/${s.category}/${m("color",a)}`,children:e.jsx("li",{className:g("detailsPage__color-item",{"detailsPage__color-item--selected":s.color===a}),children:e.jsx("span",{className:"detailsPage__color-circle",style:{backgroundColor:w[a]}})},a)},a))})]}),e.jsx("div",{className:"detailsPage__line"}),e.jsxs("div",{className:"detailsPage__capacity",children:[e.jsx("span",{className:` - detailsPage__capacity-title detailsPage__info`,children:"Select capacity"}),e.jsx("ul",{className:"detailsPage__capacity-list",children:s.capacityAvailable.map(a=>e.jsx(S,{to:`/${s.category}/${m("capacity",a)}`,style:{textDecoration:"none"},children:e.jsx("li",{className:g("detailsPage__capacity-item",{"detailsPage__capacity-item--selected":s.capacity===a}),children:e.jsx("span",{className:g("detailsPage__capacity-block",{"detailsPage__capacity-block--selected":s.capacity===a}),children:a.split("GB").join(" GB")})},a)},a))})]}),e.jsx("div",{className:"detailsPage__line"}),e.jsxs("div",{className:"detailsPage__container-price",children:[e.jsx("span",{className:"detailsPage__price-discount",children:`$${s.priceDiscount}`}),e.jsx("span",{className:"detailsPage__price-regular",children:`$${s.priceRegular}`})]}),e.jsxs("div",{className:"detailsPage__container-buttons",children:[e.jsx("button",{className:g("detailsPage__button","detailsPage__button-card",{"detailsPage__button-card--active":d}),onClick:()=>_(s),children:d?"Added":"Add to cart"}),e.jsx("button",{className:g("detailsPage__button","detailsPage__button-favorites",{"detailsPage__button-favorites--active":j}),onClick:()=>N(s),children:j?e.jsx(f,{icon:k.favorites__filled[p]}):e.jsx(f,{icon:k.favorites[p]})})]}),e.jsxs("div",{className:"detailsPage__container-specifications",children:[e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Screen"}),e.jsx("span",{className:"detailsPage__value",children:s.screen})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Resolution"}),e.jsx("span",{className:"detailsPage__value",children:s.resolution})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"Processor"}),e.jsx("span",{className:"detailsPage__value",children:s.processor})]}),e.jsxs("div",{className:"detailsPage__block",children:[e.jsx("span",{className:"detailsPage__info",children:"RAM"}),e.jsx("span",{className:"detailsPage__value",children:s.ram})]})]})]})]})},H=({selectedProduct:s})=>e.jsxs("div",{className:"detailsPage__content-buttom",children:[e.jsxs("div",{className:"detailsPage__block-about",children:[e.jsx("h3",{className:"detailsPage__block-title",children:"About"}),e.jsx("div",{className:"detailsPage__line-bottom"}),e.jsx("div",{className:"detailsPage__description",children:s.description.map((l,t)=>e.jsxs("div",{className:"detailsPage__section",children:[e.jsx("span",{className:"detailsPage__section-title",children:l.title}),e.jsx("span",{className:"detailsPage__section-description",children:l.text})]},t))})]}),e.jsxs("div",{className:"detailsPage__block-techSpecs",children:[e.jsx("h3",{className:"detailsPage__block-title",children:"Tech specs"}),e.jsx("div",{className:"productDetailsPage__line-bottom"}),e.jsxs("div",{className:"detailsPage__techSpecs-content",children:[e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Screen"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.screen})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Resolution"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.resolution})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Processor"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.processor})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"RAM"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.ram})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Capacity"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.capacity})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Camera"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.camera})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Zoom"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.zoom})]}),e.jsxs("div",{className:"detailsPage__techSpecs-block",children:[e.jsx("span",{className:"detailsPage__techSpecs-title",children:"Cell"}),e.jsx("span",{className:"detailsPage__techSpecs-value",children:s.cell.join(", ")})]})]})]})]}),Y=(s,l,t)=>s.filter(n=>n.category===l&&n.itemId!==t).sort(()=>.5-Math.random()),U=()=>{const{allProducts:s}=c.useContext(C),{productId:l=""}=I(),[t,n]=c.useState(null),[r,P]=c.useState([]),[h,p]=c.useState(!0),[x,o]=c.useState(""),_=L().pathname.split("/")[1];c.useEffect(()=>{p(!0),o("");const m=setTimeout(()=>{D(_).then(d=>{P(d);const j=d.find(a=>a.id===l);j?(n(j),o("")):(n(null),o("Product not found"))}).catch(d=>{o(` - Error loading products: The product category "${_}" does not exist. ${d.name}`)}).finally(()=>{p(!1)})},500);return()=>clearTimeout(m)},[_]),c.useEffect(()=>{if(!l||!r.length)return;const m=r.find(d=>d.id===l);m?(n(m),o("")):(n(null),o("Product not found"))},[l,r]);const N=l?Y(s,_,l):[];if(h)return e.jsx("div",{className:"detailsPage",children:e.jsx(G,{})});if(x&&!h)return e.jsx("div",{className:"detailsPage",children:e.jsxs("div",{className:"detailsPage__error-message",children:[e.jsx("span",{children:x}),e.jsx(T,{to:"/",className:"detailsPage__error-link",children:"Go to HomePage"})]})});if(t)return e.jsxs("div",{className:"detailsPage",children:[e.jsx(E,{productType:_,productName:t.name}),e.jsx(R,{}),e.jsx("h2",{className:"detailsPage__title",children:t.name}),e.jsx(z,{selectedProduct:t,specificProducts:r}),e.jsx(H,{selectedProduct:t}),e.jsx("div",{className:"detailsPage__like-block",children:e.jsx(M,{title:"You may also like",products:N,displayType:"with-discount"})})]})};export{U as ProductDetailsPage}; diff --git a/public/assets/index-DZu0jUOh.js b/public/assets/index-DZu0jUOh.js deleted file mode 100644 index d4d11be7f3c..00000000000 --- a/public/assets/index-DZu0jUOh.js +++ /dev/null @@ -1,72 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index--M-vjEFs.js","assets/ProductsSlider-CeN1XtqL.js","assets/ProductCard-n_G8EIMu.js","assets/ProductCard-CtH8lf1i.css","assets/ProductsSlider-CAHW4_99.css","assets/index-80CrQ2vW.css","assets/index-CDfWgnoX.js","assets/Linkline-BVE7q3mI.js","assets/Linkline-B_ez10jd.css","assets/ProductsList-C8WnN_nq.js","assets/ProductsList-Bz-DDO8l.css","assets/Loader-CdfK6LLs.js","assets/Loader-DU6sTv_g.css","assets/index-DlB5k-ir.css","assets/index-DZGfIgcM.js","assets/ButtonBack-DRk2FjGf.js","assets/ButtonBack-w6P-UJJ0.css","assets/index-BV-oWgkF.css","assets/index-D68rl43-.js","assets/index-urnOVSjv.css","assets/index-C5E6A8ui.js","assets/index-C9RfMEqD.css","assets/index-C4ngy4_v.js","assets/index-BD-w6JY5.css"])))=>i.map(i=>d[i]); -function af(e,t){for(var n=0;nr[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();function zs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var js={exports:{}},wl={},Os={exports:{}},O={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ar=Symbol.for("react.element"),cf=Symbol.for("react.portal"),ff=Symbol.for("react.fragment"),df=Symbol.for("react.strict_mode"),pf=Symbol.for("react.profiler"),hf=Symbol.for("react.provider"),mf=Symbol.for("react.context"),vf=Symbol.for("react.forward_ref"),gf=Symbol.for("react.suspense"),yf=Symbol.for("react.memo"),wf=Symbol.for("react.lazy"),pu=Symbol.iterator;function Sf(e){return e===null||typeof e!="object"?null:(e=pu&&e[pu]||e["@@iterator"],typeof e=="function"?e:null)}var Is={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ms=Object.assign,Fs={};function gn(e,t,n){this.props=e,this.context=t,this.refs=Fs,this.updater=n||Is}gn.prototype.isReactComponent={};gn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};gn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ds(){}Ds.prototype=gn.prototype;function vi(e,t,n){this.props=e,this.context=t,this.refs=Fs,this.updater=n||Is}var gi=vi.prototype=new Ds;gi.constructor=vi;Ms(gi,gn.prototype);gi.isPureReactComponent=!0;var hu=Array.isArray,Us=Object.prototype.hasOwnProperty,yi={current:null},$s={key:!0,ref:!0,__self:!0,__source:!0};function As(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Us.call(t,r)&&!$s.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(u===1)l.children=n;else if(1>>1,Z=P[K];if(0>>1;Kl(Al,j))Ptl(gr,Al)?(P[K]=gr,P[Pt]=j,K=Pt):(P[K]=Al,P[Ct]=j,K=Ct);else if(Ptl(gr,j))P[K]=gr,P[Pt]=j,K=Pt;else break e}}return T}function l(P,T){var j=P.sortIndex-T.sortIndex;return j!==0?j:P.id-T.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();e.unstable_now=function(){return i.now()-u}}var s=[],a=[],h=1,p=null,m=3,w=!1,y=!1,S=!1,x=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(P){for(var T=n(a);T!==null;){if(T.callback===null)r(a);else if(T.startTime<=P)r(a),T.sortIndex=T.expirationTime,t(s,T);else break;T=n(a)}}function v(P){if(S=!1,d(P),!y)if(n(s)!==null)y=!0,Ul(E);else{var T=n(a);T!==null&&$l(v,T.startTime-P)}}function E(P,T){y=!1,S&&(S=!1,f(R),R=-1),w=!0;var j=m;try{for(d(T),p=n(s);p!==null&&(!(p.expirationTime>T)||P&&!ge());){var K=p.callback;if(typeof K=="function"){p.callback=null,m=p.priorityLevel;var Z=K(p.expirationTime<=T);T=e.unstable_now(),typeof Z=="function"?p.callback=Z:p===n(s)&&r(s),d(T)}else r(s);p=n(s)}if(p!==null)var vr=!0;else{var Ct=n(a);Ct!==null&&$l(v,Ct.startTime-T),vr=!1}return vr}finally{p=null,m=j,w=!1}}var N=!1,L=null,R=-1,A=5,z=-1;function ge(){return!(e.unstable_now()-zP||125K?(P.sortIndex=j,t(a,P),n(s)===null&&P===n(a)&&(S?(f(R),R=-1):S=!0,$l(v,j-K))):(P.sortIndex=Z,t(s,P),y||w||(y=!0,Ul(E))),P},e.unstable_shouldYield=ge,e.unstable_wrapCallback=function(P){var T=m;return function(){var j=m;m=T;try{return P.apply(this,arguments)}finally{m=j}}}})(Qs);Hs.exports=Qs;var Of=Hs.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var If=g,ke=Of;function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),yo=Object.prototype.hasOwnProperty,Mf=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,vu={},gu={};function Ff(e){return yo.call(gu,e)?!0:yo.call(vu,e)?!1:Mf.test(e)?gu[e]=!0:(vu[e]=!0,!1)}function Df(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Uf(e,t,n,r){if(t===null||typeof t>"u"||Df(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function fe(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var ne={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ne[e]=new fe(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ne[t]=new fe(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ne[e]=new fe(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ne[e]=new fe(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ne[e]=new fe(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ne[e]=new fe(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ne[e]=new fe(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ne[e]=new fe(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ne[e]=new fe(e,5,!1,e.toLowerCase(),null,!1,!1)});var Si=/[\-:]([a-z])/g;function ki(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Si,ki);ne[t]=new fe(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ne[e]=new fe(e,1,!1,e.toLowerCase(),null,!1,!1)});ne.xlinkHref=new fe("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ne[e]=new fe(e,1,!1,e.toLowerCase(),null,!0,!0)});function _i(e,t,n,r){var l=ne.hasOwnProperty(t)?ne[t]:null;(l!==null?l.type!==0:r||!(2u||l[i]!==o[u]){var s=` -`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=i&&0<=u);break}}}finally{Wl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?zn(e):""}function $f(e){switch(e.tag){case 5:return zn(e.type);case 16:return zn("Lazy");case 13:return zn("Suspense");case 19:return zn("SuspenseList");case 0:case 2:case 15:return e=Hl(e.type,!1),e;case 11:return e=Hl(e.type.render,!1),e;case 1:return e=Hl(e.type,!0),e;default:return""}}function _o(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ht:return"Fragment";case Wt:return"Portal";case wo:return"Profiler";case xi:return"StrictMode";case So:return"Suspense";case ko:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Xs:return(e.displayName||"Context")+".Consumer";case Ys:return(e._context.displayName||"Context")+".Provider";case Ei:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ci:return t=e.displayName||null,t!==null?t:_o(e.type)||"Memo";case nt:t=e._payload,e=e._init;try{return _o(e(t))}catch{}}return null}function Af(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return _o(t);case 8:return t===xi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function yt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Js(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Bf(e){var t=Js(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=Bf(e))}function Zs(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Js(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Yr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function xo(e,t){var n=t.checked;return W({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function wu(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=yt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function qs(e,t){t=t.checked,t!=null&&_i(e,"checked",t,!1)}function Eo(e,t){qs(e,t);var n=yt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Co(e,t.type,n):t.hasOwnProperty("defaultValue")&&Co(e,t.type,yt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Su(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Co(e,t,n){(t!=="number"||Yr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var jn=Array.isArray;function tn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=kr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Qn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Mn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Vf=["Webkit","ms","Moz","O"];Object.keys(Mn).forEach(function(e){Vf.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Mn[t]=Mn[e]})});function na(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Mn.hasOwnProperty(e)&&Mn[e]?(""+t).trim():t+"px"}function ra(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=na(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Wf=W({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Lo(e,t){if(t){if(Wf[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(k(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(k(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(k(61))}if(t.style!=null&&typeof t.style!="object")throw Error(k(62))}}function Ro(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var To=null;function Pi(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var zo=null,nn=null,rn=null;function xu(e){if(e=dr(e)){if(typeof zo!="function")throw Error(k(280));var t=e.stateNode;t&&(t=El(t),zo(e.stateNode,e.type,t))}}function la(e){nn?rn?rn.push(e):rn=[e]:nn=e}function oa(){if(nn){var e=nn,t=rn;if(rn=nn=null,xu(e),t)for(e=0;e>>=0,e===0?32:31-(ed(e)/td|0)|0}var _r=64,xr=4194304;function On(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Zr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var u=i&~l;u!==0?r=On(u):(o&=i,o!==0&&(r=On(o)))}else i=n&~l,i!==0?r=On(i):o!==0&&(r=On(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function cr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ie(t),e[t]=n}function od(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Dn),ju=" ",Ou=!1;function Ca(e,t){switch(e){case"keyup":return Od.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Qt=!1;function Md(e,t){switch(e){case"compositionend":return Pa(t);case"keypress":return t.which!==32?null:(Ou=!0,ju);case"textInput":return e=t.data,e===ju&&Ou?null:e;default:return null}}function Fd(e,t){if(Qt)return e==="compositionend"||!Ii&&Ca(e,t)?(e=xa(),Ur=zi=it=null,Qt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Du(n)}}function Ta(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ta(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function za(){for(var e=window,t=Yr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Yr(e.document)}return t}function Mi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Qd(e){var t=za(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ta(n.ownerDocument.documentElement,n)){if(r!==null&&Mi(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Uu(n,o);var i=Uu(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Kt=null,Do=null,$n=null,Uo=!1;function $u(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Uo||Kt==null||Kt!==Yr(r)||(r=Kt,"selectionStart"in r&&Mi(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),$n&&Zn($n,r)||($n=r,r=el(Do,"onSelect"),0Gt||(e.current=Ho[Gt],Ho[Gt]=null,Gt--)}function F(e,t){Gt++,Ho[Gt]=e.current,e.current=t}var wt={},ie=kt(wt),he=kt(!1),It=wt;function cn(e,t){var n=e.type.contextTypes;if(!n)return wt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function me(e){return e=e.childContextTypes,e!=null}function nl(){U(he),U(ie)}function Ku(e,t,n){if(ie.current!==wt)throw Error(k(168));F(ie,t),F(he,n)}function Aa(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(k(108,Af(e)||"Unknown",l));return W({},n,r)}function rl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||wt,It=ie.current,F(ie,e),F(he,he.current),!0}function Yu(e,t,n){var r=e.stateNode;if(!r)throw Error(k(169));n?(e=Aa(e,t,It),r.__reactInternalMemoizedMergedChildContext=e,U(he),U(ie),F(ie,e)):U(he),F(he,n)}var We=null,Cl=!1,lo=!1;function Ba(e){We===null?We=[e]:We.push(e)}function rp(e){Cl=!0,Ba(e)}function _t(){if(!lo&&We!==null){lo=!0;var e=0,t=M;try{var n=We;for(M=1;e>=i,l-=i,Qe=1<<32-Ie(t)+l|n<R?(A=L,L=null):A=L.sibling;var z=m(f,L,d[R],v);if(z===null){L===null&&(L=A);break}e&&L&&z.alternate===null&&t(f,L),c=o(z,c,R),N===null?E=z:N.sibling=z,N=z,L=A}if(R===d.length)return n(f,L),$&&Nt(f,R),E;if(L===null){for(;RR?(A=L,L=null):A=L.sibling;var ge=m(f,L,z.value,v);if(ge===null){L===null&&(L=A);break}e&&L&&ge.alternate===null&&t(f,L),c=o(ge,c,R),N===null?E=ge:N.sibling=ge,N=ge,L=A}if(z.done)return n(f,L),$&&Nt(f,R),E;if(L===null){for(;!z.done;R++,z=d.next())z=p(f,z.value,v),z!==null&&(c=o(z,c,R),N===null?E=z:N.sibling=z,N=z);return $&&Nt(f,R),E}for(L=r(f,L);!z.done;R++,z=d.next())z=w(L,f,R,z.value,v),z!==null&&(e&&z.alternate!==null&&L.delete(z.key===null?R:z.key),c=o(z,c,R),N===null?E=z:N.sibling=z,N=z);return e&&L.forEach(function(kn){return t(f,kn)}),$&&Nt(f,R),E}function x(f,c,d,v){if(typeof d=="object"&&d!==null&&d.type===Ht&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case wr:e:{for(var E=d.key,N=c;N!==null;){if(N.key===E){if(E=d.type,E===Ht){if(N.tag===7){n(f,N.sibling),c=l(N,d.props.children),c.return=f,f=c;break e}}else if(N.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===nt&&Ju(E)===N.type){n(f,N.sibling),c=l(N,d.props),c.ref=Ln(f,N,d),c.return=f,f=c;break e}n(f,N);break}else t(f,N);N=N.sibling}d.type===Ht?(c=Ot(d.props.children,f.mode,v,d.key),c.return=f,f=c):(v=Kr(d.type,d.key,d.props,null,f.mode,v),v.ref=Ln(f,c,d),v.return=f,f=v)}return i(f);case Wt:e:{for(N=d.key;c!==null;){if(c.key===N)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(f,c.sibling),c=l(c,d.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=po(d,f.mode,v),c.return=f,f=c}return i(f);case nt:return N=d._init,x(f,c,N(d._payload),v)}if(jn(d))return y(f,c,d,v);if(xn(d))return S(f,c,d,v);Tr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,d),c.return=f,f=c):(n(f,c),c=fo(d,f.mode,v),c.return=f,f=c),i(f)):n(f,c)}return x}var dn=Qa(!0),Ka=Qa(!1),il=kt(null),ul=null,qt=null,$i=null;function Ai(){$i=qt=ul=null}function Bi(e){var t=il.current;U(il),e._currentValue=t}function Yo(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function on(e,t){ul=e,$i=qt=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(pe=!0),e.firstContext=null)}function Le(e){var t=e._currentValue;if($i!==e)if(e={context:e,memoizedValue:t,next:null},qt===null){if(ul===null)throw Error(k(308));qt=e,ul.dependencies={lanes:0,firstContext:e}}else qt=qt.next=e;return t}var Tt=null;function Vi(e){Tt===null?Tt=[e]:Tt.push(e)}function Ya(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Vi(t)):(n.next=l.next,l.next=n),t.interleaved=n,Ze(e,r)}function Ze(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var rt=!1;function Wi(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Xa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Xe(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,I&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Ze(e,n)}return l=r.interleaved,l===null?(t.next=t,Vi(r)):(t.next=l.next,l.next=t),r.interleaved=t,Ze(e,n)}function Ar(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Li(e,n)}}function Zu(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=i:o=o.next=i,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function sl(e,t,n,r){var l=e.updateQueue;rt=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,u=l.shared.pending;if(u!==null){l.shared.pending=null;var s=u,a=s.next;s.next=null,i===null?o=a:i.next=a,i=s;var h=e.alternate;h!==null&&(h=h.updateQueue,u=h.lastBaseUpdate,u!==i&&(u===null?h.firstBaseUpdate=a:u.next=a,h.lastBaseUpdate=s))}if(o!==null){var p=l.baseState;i=0,h=a=s=null,u=o;do{var m=u.lane,w=u.eventTime;if((r&m)===m){h!==null&&(h=h.next={eventTime:w,lane:0,tag:u.tag,payload:u.payload,callback:u.callback,next:null});e:{var y=e,S=u;switch(m=t,w=n,S.tag){case 1:if(y=S.payload,typeof y=="function"){p=y.call(w,p,m);break e}p=y;break e;case 3:y.flags=y.flags&-65537|128;case 0:if(y=S.payload,m=typeof y=="function"?y.call(w,p,m):y,m==null)break e;p=W({},p,m);break e;case 2:rt=!0}}u.callback!==null&&u.lane!==0&&(e.flags|=64,m=l.effects,m===null?l.effects=[u]:m.push(u))}else w={eventTime:w,lane:m,tag:u.tag,payload:u.payload,callback:u.callback,next:null},h===null?(a=h=w,s=p):h=h.next=w,i|=m;if(u=u.next,u===null){if(u=l.shared.pending,u===null)break;m=u,u=m.next,m.next=null,l.lastBaseUpdate=m,l.shared.pending=null}}while(!0);if(h===null&&(s=p),l.baseState=s,l.firstBaseUpdate=a,l.lastBaseUpdate=h,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Dt|=i,e.lanes=i,e.memoizedState=p}}function qu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=io.transition;io.transition={};try{e(!1),t()}finally{M=n,io.transition=r}}function fc(){return Re().memoizedState}function up(e,t,n){var r=mt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},dc(e))pc(t,n);else if(n=Ya(e,t,n,r),n!==null){var l=ae();Me(n,e,r,l),hc(n,t,r)}}function sp(e,t,n){var r=mt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(dc(e))pc(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,u=o(i,n);if(l.hasEagerState=!0,l.eagerState=u,Fe(u,i)){var s=t.interleaved;s===null?(l.next=l,Vi(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Ya(e,t,l,r),n!==null&&(l=ae(),Me(n,e,r,l),hc(n,t,r))}}function dc(e){var t=e.alternate;return e===V||t!==null&&t===V}function pc(e,t){An=cl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Li(e,n)}}var fl={readContext:Le,useCallback:re,useContext:re,useEffect:re,useImperativeHandle:re,useInsertionEffect:re,useLayoutEffect:re,useMemo:re,useReducer:re,useRef:re,useState:re,useDebugValue:re,useDeferredValue:re,useTransition:re,useMutableSource:re,useSyncExternalStore:re,useId:re,unstable_isNewReconciler:!1},ap={readContext:Le,useCallback:function(e,t){return Ue().memoizedState=[e,t===void 0?null:t],e},useContext:Le,useEffect:es,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Vr(4194308,4,ic.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Vr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Vr(4,2,e,t)},useMemo:function(e,t){var n=Ue();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ue();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=up.bind(null,V,e),[r.memoizedState,e]},useRef:function(e){var t=Ue();return e={current:e},t.memoizedState=e},useState:bu,useDebugValue:Zi,useDeferredValue:function(e){return Ue().memoizedState=e},useTransition:function(){var e=bu(!1),t=e[0];return e=ip.bind(null,e[1]),Ue().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=V,l=Ue();if($){if(n===void 0)throw Error(k(407));n=n()}else{if(n=t(),b===null)throw Error(k(349));Ft&30||qa(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,es(ec.bind(null,r,o,e),[e]),r.flags|=2048,or(9,ba.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ue(),t=b.identifierPrefix;if($){var n=Ke,r=Qe;n=(r&~(1<<32-Ie(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=rr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[$e]=t,e[er]=r,Ec(e,t,!1,!1),t.stateNode=e;e:{switch(i=Ro(n,r),n){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lmn&&(t.flags|=128,r=!0,Rn(o,!1),t.lanes=4194304)}else{if(!r)if(e=al(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Rn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!$)return le(t),null}else 2*Y()-o.renderingStartTime>mn&&n!==1073741824&&(t.flags|=128,r=!0,Rn(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Y(),t.sibling=null,n=B.current,F(B,r?n&1|2:n&1),t):(le(t),null);case 22:case 23:return ru(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ye&1073741824&&(le(t),t.subtreeFlags&6&&(t.flags|=8192)):le(t),null;case 24:return null;case 25:return null}throw Error(k(156,t.tag))}function gp(e,t){switch(Di(t),t.tag){case 1:return me(t.type)&&nl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pn(),U(he),U(ie),Ki(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Qi(t),null;case 13:if(U(B),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(k(340));fn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return U(B),null;case 4:return pn(),null;case 10:return Bi(t.type._context),null;case 22:case 23:return ru(),null;case 24:return null;default:return null}}var jr=!1,oe=!1,yp=typeof WeakSet=="function"?WeakSet:Set,C=null;function bt(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){H(e,t,r)}else n.current=null}function ni(e,t,n){try{n()}catch(r){H(e,t,r)}}var fs=!1;function wp(e,t){if($o=qr,e=za(),Mi(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,u=-1,s=-1,a=0,h=0,p=e,m=null;t:for(;;){for(var w;p!==n||l!==0&&p.nodeType!==3||(u=i+l),p!==o||r!==0&&p.nodeType!==3||(s=i+r),p.nodeType===3&&(i+=p.nodeValue.length),(w=p.firstChild)!==null;)m=p,p=w;for(;;){if(p===e)break t;if(m===n&&++a===l&&(u=i),m===o&&++h===r&&(s=i),(w=p.nextSibling)!==null)break;p=m,m=p.parentNode}p=w}n=u===-1||s===-1?null:{start:u,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ao={focusedElem:e,selectionRange:n},qr=!1,C=t;C!==null;)if(t=C,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,C=e;else for(;C!==null;){t=C;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var S=y.memoizedProps,x=y.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?S:ze(t.type,S),x);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(k(163))}}catch(v){H(t,t.return,v)}if(e=t.sibling,e!==null){e.return=t.return,C=e;break}C=t.return}return y=fs,fs=!1,y}function Bn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&ni(t,n,o)}l=l.next}while(l!==r)}}function Ll(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ri(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Nc(e){var t=e.alternate;t!==null&&(e.alternate=null,Nc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[$e],delete t[er],delete t[Wo],delete t[tp],delete t[np])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Lc(e){return e.tag===5||e.tag===3||e.tag===4}function ds(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Lc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function li(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=tl));else if(r!==4&&(e=e.child,e!==null))for(li(e,t,n),e=e.sibling;e!==null;)li(e,t,n),e=e.sibling}function oi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(oi(e,t,n),e=e.sibling;e!==null;)oi(e,t,n),e=e.sibling}var ee=null,je=!1;function tt(e,t,n){for(n=n.child;n!==null;)Rc(e,t,n),n=n.sibling}function Rc(e,t,n){if(Ae&&typeof Ae.onCommitFiberUnmount=="function")try{Ae.onCommitFiberUnmount(Sl,n)}catch{}switch(n.tag){case 5:oe||bt(n,t);case 6:var r=ee,l=je;ee=null,tt(e,t,n),ee=r,je=l,ee!==null&&(je?(e=ee,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):ee.removeChild(n.stateNode));break;case 18:ee!==null&&(je?(e=ee,n=n.stateNode,e.nodeType===8?ro(e.parentNode,n):e.nodeType===1&&ro(e,n),Gn(e)):ro(ee,n.stateNode));break;case 4:r=ee,l=je,ee=n.stateNode.containerInfo,je=!0,tt(e,t,n),ee=r,je=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&ni(n,t,i),l=l.next}while(l!==r)}tt(e,t,n);break;case 1:if(!oe&&(bt(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){H(n,t,u)}tt(e,t,n);break;case 21:tt(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,tt(e,t,n),oe=r):tt(e,t,n);break;default:tt(e,t,n)}}function ps(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new yp),t.forEach(function(r){var l=Lp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Te(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=Y()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*kp(r/1960))-r,10e?16:e,ut===null)var r=!1;else{if(e=ut,ut=null,hl=0,I&6)throw Error(k(331));var l=I;for(I|=4,C=e.current;C!==null;){var o=C,i=o.child;if(C.flags&16){var u=o.deletions;if(u!==null){for(var s=0;sY()-tu?jt(e,0):eu|=n),ve(e,t)}function Dc(e,t){t===0&&(e.mode&1?(t=xr,xr<<=1,!(xr&130023424)&&(xr=4194304)):t=1);var n=ae();e=Ze(e,t),e!==null&&(cr(e,t,n),ve(e,n))}function Np(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Dc(e,n)}function Lp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(k(314))}r!==null&&r.delete(t),Dc(e,n)}var Uc;Uc=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||he.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,mp(e,t,n);pe=!!(e.flags&131072)}else pe=!1,$&&t.flags&1048576&&Va(t,ol,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Wr(e,t),e=t.pendingProps;var l=cn(t,ie.current);on(t,n),l=Xi(null,t,r,e,l,n);var o=Gi();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,me(r)?(o=!0,rl(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Wi(t),l.updater=Nl,t.stateNode=l,l._reactInternals=t,Go(t,r,e,n),t=qo(null,t,r,!0,o,n)):(t.tag=0,$&&o&&Fi(t),se(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Wr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Tp(r),e=ze(r,e),l){case 0:t=Zo(null,t,r,e,n);break e;case 1:t=ss(null,t,r,e,n);break e;case 11:t=is(null,t,r,e,n);break e;case 14:t=us(null,t,r,ze(r.type,e),n);break e}throw Error(k(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Zo(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),ss(e,t,r,l,n);case 3:e:{if(kc(t),e===null)throw Error(k(387));r=t.pendingProps,o=t.memoizedState,l=o.element,Xa(e,t),sl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=hn(Error(k(423)),t),t=as(e,t,r,n,l);break e}else if(r!==l){l=hn(Error(k(424)),t),t=as(e,t,r,n,l);break e}else for(we=dt(t.stateNode.containerInfo.firstChild),Se=t,$=!0,Oe=null,n=Ka(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(fn(),r===l){t=qe(e,t,n);break e}se(e,t,r,n)}t=t.child}return t;case 5:return Ga(t),e===null&&Ko(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,Bo(r,l)?i=null:o!==null&&Bo(r,o)&&(t.flags|=32),Sc(e,t),se(e,t,i,n),t.child;case 6:return e===null&&Ko(t),null;case 13:return _c(e,t,n);case 4:return Hi(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=dn(t,null,r,n):se(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),is(e,t,r,l,n);case 7:return se(e,t,t.pendingProps,n),t.child;case 8:return se(e,t,t.pendingProps.children,n),t.child;case 12:return se(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,F(il,r._currentValue),r._currentValue=i,o!==null)if(Fe(o.value,i)){if(o.children===l.children&&!he.current){t=qe(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){i=o.child;for(var s=u.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Xe(-1,n&-n),s.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var h=a.pending;h===null?s.next=s:(s.next=h.next,h.next=s),a.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),Yo(o.return,n,t),u.lanes|=n;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(k(341));i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Yo(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}se(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,on(t,n),l=Le(l),r=r(l),t.flags|=1,se(e,t,r,n),t.child;case 14:return r=t.type,l=ze(r,t.pendingProps),l=ze(r.type,l),us(e,t,r,l,n);case 15:return yc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Wr(e,t),t.tag=1,me(r)?(e=!0,rl(t)):e=!1,on(t,n),mc(t,r,l),Go(t,r,l,n),qo(null,t,r,!0,e,n);case 19:return xc(e,t,n);case 22:return wc(e,t,n)}throw Error(k(156,t.tag))};function $c(e,t){return da(e,t)}function Rp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pe(e,t,n,r){return new Rp(e,t,n,r)}function ou(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Tp(e){if(typeof e=="function")return ou(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ei)return 11;if(e===Ci)return 14}return 2}function vt(e,t){var n=e.alternate;return n===null?(n=Pe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Kr(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")ou(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Ht:return Ot(n.children,l,o,t);case xi:i=8,l|=8;break;case wo:return e=Pe(12,n,t,l|2),e.elementType=wo,e.lanes=o,e;case So:return e=Pe(13,n,t,l),e.elementType=So,e.lanes=o,e;case ko:return e=Pe(19,n,t,l),e.elementType=ko,e.lanes=o,e;case Gs:return Tl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ys:i=10;break e;case Xs:i=9;break e;case Ei:i=11;break e;case Ci:i=14;break e;case nt:i=16,r=null;break e}throw Error(k(130,e==null?e:typeof e,""))}return t=Pe(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Ot(e,t,n,r){return e=Pe(7,e,r,t),e.lanes=n,e}function Tl(e,t,n,r){return e=Pe(22,e,r,t),e.elementType=Gs,e.lanes=n,e.stateNode={isHidden:!1},e}function fo(e,t,n){return e=Pe(6,e,null,t),e.lanes=n,e}function po(e,t,n){return t=Pe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Kl(0),this.expirationTimes=Kl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Kl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function iu(e,t,n,r,l,o,i,u,s){return e=new zp(e,t,n,u,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Pe(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Wi(o),e}function jp(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Wc)}catch(e){console.error(e)}}Wc(),Ws.exports=_e;var Dp=Ws.exports,Hc,ks=Dp;Hc=ks.createRoot,ks.hydrateRoot;/** - * @remix-run/router v1.18.0 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function ur(){return ur=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function cu(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function $p(){return Math.random().toString(36).substr(2,8)}function xs(e,t){return{usr:e.state,key:e.key,idx:t}}function ci(e,t,n,r){return n===void 0&&(n=null),ur({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Bt(t):t,{state:n,key:t&&t.key||r||$p()})}function gl(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Bt(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Ap(e,t,n,r){r===void 0&&(r={});let{window:l=document.defaultView,v5Compat:o=!1}=r,i=l.history,u=st.Pop,s=null,a=h();a==null&&(a=0,i.replaceState(ur({},i.state,{idx:a}),""));function h(){return(i.state||{idx:null}).idx}function p(){u=st.Pop;let x=h(),f=x==null?null:x-a;a=x,s&&s({action:u,location:S.location,delta:f})}function m(x,f){u=st.Push;let c=ci(S.location,x,f);n&&n(c,x),a=h()+1;let d=xs(c,a),v=S.createHref(c);try{i.pushState(d,"",v)}catch(E){if(E instanceof DOMException&&E.name==="DataCloneError")throw E;l.location.assign(v)}o&&s&&s({action:u,location:S.location,delta:1})}function w(x,f){u=st.Replace;let c=ci(S.location,x,f);n&&n(c,x),a=h();let d=xs(c,a),v=S.createHref(c);i.replaceState(d,"",v),o&&s&&s({action:u,location:S.location,delta:0})}function y(x){let f=l.location.origin!=="null"?l.location.origin:l.location.href,c=typeof x=="string"?x:gl(x);return c=c.replace(/ $/,"%20"),Q(f,"No window.location.(origin|href) available to create URL for href: "+c),new URL(c,f)}let S={get action(){return u},get location(){return e(l,i)},listen(x){if(s)throw new Error("A history only accepts one active listener");return l.addEventListener(_s,p),s=x,()=>{l.removeEventListener(_s,p),s=null}},createHref(x){return t(l,x)},createURL:y,encodeLocation(x){let f=y(x);return{pathname:f.pathname,search:f.search,hash:f.hash}},push:m,replace:w,go(x){return i.go(x)}};return S}var Es;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Es||(Es={}));function Bp(e,t,n){return n===void 0&&(n="/"),Vp(e,t,n)}function Vp(e,t,n,r){let l=typeof t=="string"?Bt(t):t,o=vn(l.pathname||"/",n);if(o==null)return null;let i=Qc(e);Wp(i);let u=null;for(let s=0;u==null&&s{let s={relativePath:u===void 0?o.path||"":u,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};s.relativePath.startsWith("/")&&(Q(s.relativePath.startsWith(r),'Absolute route path "'+s.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),s.relativePath=s.relativePath.slice(r.length));let a=gt([r,s.relativePath]),h=n.concat(s);o.children&&o.children.length>0&&(Q(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+a+'".')),Qc(o.children,t,h,a)),!(o.path==null&&!o.index)&&t.push({path:a,score:Jp(a,o.index),routesMeta:h})};return e.forEach((o,i)=>{var u;if(o.path===""||!((u=o.path)!=null&&u.includes("?")))l(o,i);else for(let s of Kc(o.path))l(o,i,s)}),t}function Kc(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,l=n.endsWith("?"),o=n.replace(/\?$/,"");if(r.length===0)return l?[o,""]:[o];let i=Kc(r.join("/")),u=[];return u.push(...i.map(s=>s===""?o:[o,s].join("/"))),l&&u.push(...i),u.map(s=>e.startsWith("/")&&s===""?"/":s)}function Wp(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:Zp(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Hp=/^:[\w-]+$/,Qp=3,Kp=2,Yp=1,Xp=10,Gp=-2,Cs=e=>e==="*";function Jp(e,t){let n=e.split("/"),r=n.length;return n.some(Cs)&&(r+=Gp),t&&(r+=Kp),n.filter(l=>!Cs(l)).reduce((l,o)=>l+(Hp.test(o)?Qp:o===""?Yp:Xp),r)}function Zp(e,t){return e.length===t.length&&e.slice(0,-1).every((r,l)=>r===t[l])?e[e.length-1]-t[t.length-1]:0}function qp(e,t,n){let{routesMeta:r}=e,l={},o="/",i=[];for(let u=0;u{let{paramName:m,isOptional:w}=h;if(m==="*"){let S=u[p]||"";i=o.slice(0,o.length-S.length).replace(/(.)\/+$/,"$1")}const y=u[p];return w&&!y?a[m]=void 0:a[m]=(y||"").replace(/%2F/g,"/"),a},{}),pathname:o,pathnameBase:i,pattern:e}}function bp(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),cu(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(i,u,s)=>(r.push({paramName:u,isOptional:s!=null}),s?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),r]}function eh(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return cu(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function vn(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}function th(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:l=""}=typeof e=="string"?Bt(e):e;return{pathname:n?n.startsWith("/")?n:nh(n,t):t,search:oh(r),hash:ih(l)}}function nh(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?n.length>1&&n.pop():l!=="."&&n.push(l)}),n.length>1?n.join("/"):"/"}function ho(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function rh(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function Yc(e,t){let n=rh(e);return t?n.map((r,l)=>l===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Xc(e,t,n,r){r===void 0&&(r=!1);let l;typeof e=="string"?l=Bt(e):(l=ur({},e),Q(!l.pathname||!l.pathname.includes("?"),ho("?","pathname","search",l)),Q(!l.pathname||!l.pathname.includes("#"),ho("#","pathname","hash",l)),Q(!l.search||!l.search.includes("#"),ho("#","search","hash",l)));let o=e===""||l.pathname==="",i=o?"/":l.pathname,u;if(i==null)u=n;else{let p=t.length-1;if(!r&&i.startsWith("..")){let m=i.split("/");for(;m[0]==="..";)m.shift(),p-=1;l.pathname=m.join("/")}u=p>=0?t[p]:"/"}let s=th(l,u),a=i&&i!=="/"&&i.endsWith("/"),h=(o||i===".")&&n.endsWith("/");return!s.pathname.endsWith("/")&&(a||h)&&(s.pathname+="/"),s}const gt=e=>e.join("/").replace(/\/\/+/g,"/"),lh=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),oh=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,ih=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function uh(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Gc=["post","put","patch","delete"];new Set(Gc);const sh=["get",...Gc];new Set(sh);/** - * React Router v6.25.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function sr(){return sr=Object.assign?Object.assign.bind():function(e){for(var t=1;t{u.current=!0}),g.useCallback(function(a,h){if(h===void 0&&(h={}),!u.current)return;if(typeof a=="number"){r.go(a);return}let p=Xc(a,JSON.parse(i),o,h.relative==="path");e==null&&t!=="/"&&(p.pathname=p.pathname==="/"?t:gt([t,p.pathname])),(h.replace?r.replace:r.push)(p,h.state,h)},[t,r,i,o,e])}const fh=g.createContext(null);function dh(e){let t=g.useContext(et).outlet;return t&&g.createElement(fh.Provider,{value:e},t)}function am(){let{matches:e}=g.useContext(et),t=e[e.length-1];return t?t.params:{}}function Dl(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=g.useContext(xt),{matches:l}=g.useContext(et),{pathname:o}=Et(),i=JSON.stringify(Yc(l,r.v7_relativeSplatPath));return g.useMemo(()=>Xc(e,JSON.parse(i),o,n==="path"),[e,i,o,n])}function ph(e,t){return hh(e,t)}function hh(e,t,n,r){hr()||Q(!1);let{navigator:l}=g.useContext(xt),{matches:o}=g.useContext(et),i=o[o.length-1],u=i?i.params:{};i&&i.pathname;let s=i?i.pathnameBase:"/";i&&i.route;let a=Et(),h;if(t){var p;let x=typeof t=="string"?Bt(t):t;s==="/"||(p=x.pathname)!=null&&p.startsWith(s)||Q(!1),h=x}else h=a;let m=h.pathname||"/",w=m;if(s!=="/"){let x=s.replace(/^\//,"").split("/");w="/"+m.replace(/^\//,"").split("/").slice(x.length).join("/")}let y=Bp(e,{pathname:w}),S=wh(y&&y.map(x=>Object.assign({},x,{params:Object.assign({},u,x.params),pathname:gt([s,l.encodeLocation?l.encodeLocation(x.pathname).pathname:x.pathname]),pathnameBase:x.pathnameBase==="/"?s:gt([s,l.encodeLocation?l.encodeLocation(x.pathnameBase).pathname:x.pathnameBase])})),o,n,r);return t&&S?g.createElement(Fl.Provider,{value:{location:sr({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:st.Pop}},S):S}function mh(){let e=xh(),t=uh(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,l={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return g.createElement(g.Fragment,null,g.createElement("h2",null,"Unexpected Application Error!"),g.createElement("h3",{style:{fontStyle:"italic"}},t),n?g.createElement("pre",{style:l},n):null,null)}const vh=g.createElement(mh,null);class gh extends g.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?g.createElement(et.Provider,{value:this.props.routeContext},g.createElement(Zc.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function yh(e){let{routeContext:t,match:n,children:r}=e,l=g.useContext(Ml);return l&&l.static&&l.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=n.route.id),g.createElement(et.Provider,{value:t},r)}function wh(e,t,n,r){var l;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var o;if((o=n)!=null&&o.errors)e=n.matches;else return null}let i=e,u=(l=n)==null?void 0:l.errors;if(u!=null){let h=i.findIndex(p=>p.route.id&&(u==null?void 0:u[p.route.id])!==void 0);h>=0||Q(!1),i=i.slice(0,Math.min(i.length,h+1))}let s=!1,a=-1;if(n&&r&&r.v7_partialHydration)for(let h=0;h=0?i=i.slice(0,a+1):i=[i[0]];break}}}return i.reduceRight((h,p,m)=>{let w,y=!1,S=null,x=null;n&&(w=u&&p.route.id?u[p.route.id]:void 0,S=p.route.errorElement||vh,s&&(a<0&&m===0?(Ch("route-fallback"),y=!0,x=null):a===m&&(y=!0,x=p.route.hydrateFallbackElement||null)));let f=t.concat(i.slice(0,m+1)),c=()=>{let d;return w?d=S:y?d=x:p.route.Component?d=g.createElement(p.route.Component,null):p.route.element?d=p.route.element:d=h,g.createElement(yh,{match:p,routeContext:{outlet:h,matches:f,isDataRoute:n!=null},children:d})};return n&&(p.route.ErrorBoundary||p.route.errorElement||m===0)?g.createElement(gh,{location:n.location,revalidation:n.revalidation,component:S,error:w,children:c(),routeContext:{outlet:null,matches:f,isDataRoute:!0}}):c()},null)}var ef=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(ef||{}),tf=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(tf||{});function Sh(e){let t=g.useContext(Ml);return t||Q(!1),t}function kh(e){let t=g.useContext(Jc);return t||Q(!1),t}function _h(e){let t=g.useContext(et);return t||Q(!1),t}function nf(e){let t=_h(),n=t.matches[t.matches.length-1];return n.route.id||Q(!1),n.route.id}function xh(){var e;let t=g.useContext(Zc),n=kh(),r=nf();return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function Eh(){let{router:e}=Sh(ef.UseNavigateStable),t=nf(tf.UseNavigateStable),n=g.useRef(!1);return qc(()=>{n.current=!0}),g.useCallback(function(l,o){o===void 0&&(o={}),n.current&&(typeof l=="number"?e.navigate(l):e.navigate(l,sr({fromRouteId:t},o)))},[e,t])}const Ps={};function Ch(e,t,n){Ps[e]||(Ps[e]=!0)}function Ph(e){return dh(e.context)}function ue(e){Q(!1)}function Nh(e){let{basename:t="/",children:n=null,location:r,navigationType:l=st.Pop,navigator:o,static:i=!1,future:u}=e;hr()&&Q(!1);let s=t.replace(/^\/*/,"/"),a=g.useMemo(()=>({basename:s,navigator:o,static:i,future:sr({v7_relativeSplatPath:!1},u)}),[s,u,o,i]);typeof r=="string"&&(r=Bt(r));let{pathname:h="/",search:p="",hash:m="",state:w=null,key:y="default"}=r,S=g.useMemo(()=>{let x=vn(h,s);return x==null?null:{location:{pathname:x,search:p,hash:m,state:w,key:y},navigationType:l}},[s,h,p,m,w,y,l]);return S==null?null:g.createElement(xt.Provider,{value:a},g.createElement(Fl.Provider,{children:n,value:S}))}function Lh(e){let{children:t,location:n}=e;return ph(di(t),n)}new Promise(()=>{});function di(e,t){t===void 0&&(t=[]);let n=[];return g.Children.forEach(e,(r,l)=>{if(!g.isValidElement(r))return;let o=[...t,l];if(r.type===g.Fragment){n.push.apply(n,di(r.props.children,o));return}r.type!==ue&&Q(!1),!r.props.index||!r.props.children||Q(!1);let i={id:r.props.id||o.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(i.children=di(r.props.children,o)),n.push(i)}),n}/** - * React Router DOM v6.25.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function yl(){return yl=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[l]=e[l]);return n}function Rh(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Th(e,t){return e.button===0&&(!t||t==="_self")&&!Rh(e)}function pi(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(l=>[n,l]):[[n,r]])},[]))}function zh(e,t){let n=pi(e);return t&&t.forEach((r,l)=>{n.has(l)||t.getAll(l).forEach(o=>{n.append(l,o)})}),n}const jh=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"],Oh=["aria-current","caseSensitive","className","end","style","to","unstable_viewTransition","children"],Ih="6";try{window.__reactRouterVersion=Ih}catch{}const Mh=g.createContext({isTransitioning:!1}),Fh="startTransition",Ns=Pf[Fh];function Dh(e){let{basename:t,children:n,future:r,window:l}=e,o=g.useRef();o.current==null&&(o.current=Up({window:l,v5Compat:!0}));let i=o.current,[u,s]=g.useState({action:i.action,location:i.location}),{v7_startTransition:a}=r||{},h=g.useCallback(p=>{a&&Ns?Ns(()=>s(p)):s(p)},[s,a]);return g.useLayoutEffect(()=>i.listen(h),[i,h]),g.createElement(Nh,{basename:t,children:n,location:u.location,navigationType:u.action,navigator:i,future:r})}const Uh=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",$h=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,sn=g.forwardRef(function(t,n){let{onClick:r,relative:l,reloadDocument:o,replace:i,state:u,target:s,to:a,preventScrollReset:h,unstable_viewTransition:p}=t,m=rf(t,jh),{basename:w}=g.useContext(xt),y,S=!1;if(typeof a=="string"&&$h.test(a)&&(y=a,Uh))try{let d=new URL(window.location.href),v=a.startsWith("//")?new URL(d.protocol+a):new URL(a),E=vn(v.pathname,w);v.origin===d.origin&&E!=null?a=E+v.search+v.hash:S=!0}catch{}let x=ah(a,{relative:l}),f=Bh(a,{replace:i,state:u,target:s,preventScrollReset:h,relative:l,unstable_viewTransition:p});function c(d){r&&r(d),d.defaultPrevented||f(d)}return g.createElement("a",yl({},m,{href:y||x,onClick:S||o?r:c,ref:n,target:s}))}),mo=g.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:l=!1,className:o="",end:i=!1,style:u,to:s,unstable_viewTransition:a,children:h}=t,p=rf(t,Oh),m=Dl(s,{relative:p.relative}),w=Et(),y=g.useContext(Jc),{navigator:S,basename:x}=g.useContext(xt),f=y!=null&&Wh(m)&&a===!0,c=S.encodeLocation?S.encodeLocation(m).pathname:m.pathname,d=w.pathname,v=y&&y.navigation&&y.navigation.location?y.navigation.location.pathname:null;l||(d=d.toLowerCase(),v=v?v.toLowerCase():null,c=c.toLowerCase()),v&&x&&(v=vn(v,x)||v);const E=c!=="/"&&c.endsWith("/")?c.length-1:c.length;let N=d===c||!i&&d.startsWith(c)&&d.charAt(E)==="/",L=v!=null&&(v===c||!i&&v.startsWith(c)&&v.charAt(c.length)==="/"),R={isActive:N,isPending:L,isTransitioning:f},A=N?r:void 0,z;typeof o=="function"?z=o(R):z=[o,N?"active":null,L?"pending":null,f?"transitioning":null].filter(Boolean).join(" ");let ge=typeof u=="function"?u(R):u;return g.createElement(sn,yl({},p,{"aria-current":A,className:z,ref:n,style:ge,to:s,unstable_viewTransition:a}),typeof h=="function"?h(R):h)});var hi;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(hi||(hi={}));var Ls;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ls||(Ls={}));function Ah(e){let t=g.useContext(Ml);return t||Q(!1),t}function Bh(e,t){let{target:n,replace:r,state:l,preventScrollReset:o,relative:i,unstable_viewTransition:u}=t===void 0?{}:t,s=bc(),a=Et(),h=Dl(e,{relative:i});return g.useCallback(p=>{if(Th(p,n)){p.preventDefault();let m=r!==void 0?r:gl(a)===gl(h);s(e,{replace:m,state:l,preventScrollReset:o,relative:i,unstable_viewTransition:u})}},[a,s,h,r,l,n,e,o,i,u])}function Vh(e){let t=g.useRef(pi(e)),n=g.useRef(!1),r=Et(),l=g.useMemo(()=>zh(r.search,n.current?null:t.current),[r.search]),o=bc(),i=g.useCallback((u,s)=>{const a=pi(typeof u=="function"?u(l):u);n.current=!0,o("?"+a,s)},[o,l]);return[l,i]}function Wh(e,t){t===void 0&&(t={});let n=g.useContext(Mh);n==null&&Q(!1);let{basename:r}=Ah(hi.useViewTransitionState),l=Dl(e,{relative:t.relative});if(!n.isTransitioning)return!1;let o=vn(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=vn(n.nextLocation.pathname,r)||n.nextLocation.pathname;return fi(l.pathname,i)!=null||fi(l.pathname,o)!=null}var lf={exports:{}};/*! - Copyright (c) 2018 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/(function(e){(function(){var t={}.hasOwnProperty;function n(){for(var o="",i=0;i{try{const l=localStorage.getItem(e);return l?JSON.parse(l):t}catch(l){return localStorage.removeItem(e),alert(`Error reading localStorage key "${e}": ${l}`),t}});return g.useEffect(()=>{try{localStorage.setItem(e,JSON.stringify(n))}catch(l){throw new Error(`Error saving localStorage key "${e}": ${l}`)}},[e,n]),[n,r]}const Kh=()=>{const[e,t]=mi("theme","light");g.useEffect(()=>{document.body.classList.toggle("theme_dark",e==="dark")},[e]);const n=g.useCallback(()=>{t(e==="light"?"dark":"light")},[e,t]);return{theme:e,toggleTheme:n}},mr=g.createContext({allProducts:[],setAllProducts:()=>{},cart:[],setCart:()=>{},favorites:[],setFavorites:()=>{},updateQuantity:()=>{},clearShoppingCart:()=>{},isMenuOpen:!1,setIsMenuOpen:()=>{},toggleMenu:()=>{},toggleFavorites:()=>{},addToCart:()=>{},theme:"light",toggleTheme:()=>{}}),Yh=({children:e})=>{const{theme:t,toggleTheme:n}=Kh(),[r,l]=g.useState([]),[o,i]=mi("shoppingCart",[]),[u,s]=mi("favorites",[]),[a,h]=g.useState(!1);g.useEffect(()=>{Qh().then(f=>l(f))},[]);const p=g.useCallback((f,c)=>{i(d=>d.map(v=>v.id===f?{...v,quantity:c}:v).filter(v=>v.quantity>0))},[i]),m=g.useCallback(()=>h(f=>!f),[]);g.useEffect(()=>{const f=a?"hidden":"auto";return document.body.style.overflow=f,()=>{document.body.style.overflow="auto"}},[a]);const w=g.useCallback(f=>{if(f&&!o.some(d=>d.product.itemId===f.itemId)){const d={id:f.itemId,quantity:1,product:f};i(v=>[...v,d])}},[o,i]),y=g.useCallback(f=>{const c=u.some(d=>d.itemId===f.itemId);s(d=>c?d.filter(v=>v.itemId!==f.itemId):[...d,f])},[u,s]),S=g.useCallback(()=>{i([])},[i]),x=g.useMemo(()=>({allProducts:r,setAllProducts:l,cart:o,setCart:i,favorites:u,setFavorites:s,updateQuantity:p,clearShoppingCart:S,isMenuOpen:a,setIsMenuOpen:h,toggleMenu:m,toggleFavorites:y,addToCart:w,theme:t,toggleTheme:n}),[r,o,u,l,i,s,S,p,a,h,m,y,w,t,n]);return _.jsx(mr.Provider,{value:x,children:e})},He={logo:{light:{title:"Logo icon",path:"/icons/logo.svg"},dark:{title:"Logo dark icon",path:"/icons/logo_dark.svg"}},close:{light:{title:"Close icon",path:"../../src/icons/Close.svg"},dark:{title:"Close dark icon",path:"../../src/icons/close_dark.svg"}},menu:{light:{title:"Menu icon",path:"../../src/icons/Menu.svg"},dark:{title:"Menu dark icon",path:"../../src/icons/menu_dark.svg"}},search:{light:{title:"Search icon",path:"../../src/icons/search.svg"},dark:{title:"Search dark icon",path:"../../src/icons/search_dark.svg"}},favorites:{light:{title:"Favorites icon",path:"../../src/icons/favorites.svg"},dark:{title:"Favorites dark icon",path:"../../src/icons/favorites_dark.svg"}},favorites__filled:{light:{title:"Favorites filled icon",path:"../../src/icons/favorites__filled.svg"},dark:{title:"Favorites filled dark icon",path:"../../src/icons/favorites__filled.svg"}},shopping_cart:{light:{title:"Shopping cart icon",path:"../../src/icons/shopping_cart.svg"},dark:{title:"Shopping cart dark icon",path:"../../src/icons/shopping_cart_dark.svg"}},arrow_left:{light:{title:"Arrow left icon",path:"../../src/icons/arrow_left.svg"},dark:{title:"Arrow left dark icon",path:"../../src/icons/arrow_left_dark.svg"}},arrow_left__disabled:{light:{title:"Arrow left disabled icon",path:"../../src/icons/arrow_left__disabled.svg"},dark:{title:"Arrow left disabled dark icon",path:"../../src/icons/arrow_left_dark__disabled.svg"}},arrow_right:{light:{title:"Arrow right icon",path:"../../src/icons/arrow_right.svg"},dark:{title:"Arrow right dark icon",path:"../../src/icons/arrow_right_dark.svg"}},arrow_right__disabled:{light:{title:"Arrow right disabled icon",path:"../../src/icons/arrow_right__disabled.svg"},dark:{title:"Arrow right disabled dark icon",path:"../../src/icons/arrow_right_dark__disabled.svg"}},arrow_down:{light:{title:"Arrow down icon",path:"../../src/icons/arrow_down_dark.svg"},dark:{title:"Arrow down dark icon",path:"../../src/icons/arrow_down_dark.svg"}},home:{light:{title:"Home icon",path:"../../src/icons/Home.svg"},dark:{title:"Home dark icon",path:"../../src/icons/home_dark.svg"}},plus:{light:{title:"Plus icon",path:"../../src/icons/Plus.svg"},dark:{title:"Plus dark icon",path:"../../src/icons/Union.svg"}},minus:{light:{title:"Minus icon",path:"../../src/icons/Minus.svg"},dark:{title:"Minus dark icon",path:"../../src/icons/minus_dark.svg"}},minus__disabled:{light:{title:"Minus icon",path:"../../src/icons/minus__disabled.svg"},dark:{title:"Minus dark icon",path:"../../src/icons/MinusDarkDisabled.svg"}},ok:{light:{title:"ok",path:"../../src/icons/image 15.svg"},dark:{title:"ok",path:"../../src/icons/image 15.svg"}}},Ye=g.memo(({icon:e})=>_.jsx("img",{src:e.path,alt:e.title,className:"icon"}));Ye.displayName="icon";const uf=[{title:"Home",path:"/"},{title:"Phones",path:"/phones"},{title:"Tablets",path:"/tablets"},{title:"Accessories",path:"/accessories"}];function Xh(e,t){const n=new URLSearchParams(t);for(const[r,l]of Object.entries(e))l===null?n.delete(r):Array.isArray(l)?(n.delete(r),l.forEach(o=>n.append(r,o.toString()))):n.set(r,l.toString());return n.toString()}const Gh=()=>{const[e,t]=Vh(),n=e.get("query")||"",{theme:r}=g.useContext(mr),l=Et(),o=g.useMemo(()=>["/phones","/tablets","/accessories","/favorites"].includes(l.pathname),[l.pathname]),i=g.useCallback(()=>{t(a=>{const h=new URLSearchParams(a);return h.delete("query"),h})},[t]),u=g.useCallback(a=>{const h=Xh(a,e);t(h)},[e,t]),s=g.useCallback(a=>{u({query:a.target.value.trim()||null})},[u]);return g.useEffect(()=>{i()},[l.pathname]),o&&_.jsxs("div",{className:"header__search-wrapper",children:[_.jsx("input",{type:"text",placeholder:"Search product...",className:"header__search-input",value:n,onChange:s}),n?_.jsx("div",{className:"header__clear-button",onClick:i,children:_.jsx(Ye,{icon:He.close[r]})}):_.jsx(Ye,{icon:He.search[r]})]})},Jh=({isActive:e})=>fu("header__item",{"header__item--active":e}),Rs=({isActive:e})=>fu("header__icon",{"header__icon--active":e}),Zh=()=>{const{cart:e,favorites:t,toggleMenu:n,isMenuOpen:r,theme:l,toggleTheme:o}=g.useContext(mr),i=g.useMemo(()=>e.reduce((u,s)=>u+s.quantity,0),[e]);return _.jsxs("div",{className:"header",children:[_.jsx(sn,{to:"/",className:"header__logo-container",children:_.jsx(Ye,{icon:He.logo[l]})}),_.jsx("div",{className:"header__menu",children:_.jsx("div",{className:"header__list",children:uf.map(u=>_.jsx(mo,{to:u.path,className:Jh,children:u.title},u.title))})}),_.jsxs("div",{className:"header__buttons-right",children:[_.jsx(Gh,{}),_.jsx("div",{onClick:n,className:"header__icon header__icon--menu",children:_.jsx(Ye,{icon:r?He.close[l]:He.menu[l]})}),_.jsx("button",{className:"header__icon header__switch-theme",onClick:o,children:l==="light"?"Dark":"Light"}),_.jsxs("div",{className:fu("header__buttons-wrapper",{"header__buttons-wrapper--bottom":r}),onClick:()=>{r&&n()},children:[_.jsx(mo,{className:Rs,to:"/favorites",children:_.jsxs("div",{className:"header__icon-wrapper",children:[t.length?_.jsx("span",{className:"header__quantity",children:t.length}):null,_.jsx(Ye,{icon:He.favorites[l]})]})}),_.jsx(mo,{className:Rs,to:"/cart",children:_.jsxs("div",{className:"header__icon-wrapper",children:[_.jsx(Ye,{icon:He.shopping_cart[l]}),i>0&&_.jsx("span",{className:"header__quantity",children:i})]})})]})]})]})},qh=()=>{const{isMenuOpen:e,toggleMenu:t}=g.useContext(mr);return g.useEffect(()=>{const n=()=>{window.innerWidth>640&&e&&t()};return window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[e,t]),_.jsx("nav",{className:`menu ${e?"menu--open":""}`,children:_.jsx("div",{className:"menu__list",children:uf.map(n=>_.jsx(sn,{to:n.path,className:"menu__link",onClick:t,children:n.title},n.title))})})},bh=()=>{const{theme:e}=g.useContext(mr),t=g.useCallback(()=>{window.scrollTo({top:0,behavior:"smooth"})},[]);return _.jsx("div",{className:"footer",children:_.jsxs("div",{className:"footer__container",children:[_.jsx(Ye,{icon:He.logo[e]}),_.jsxs("div",{className:"footer__items",children:[_.jsx(sn,{to:"https://github.com/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Github"}),_.jsx(sn,{to:"/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Contacts"}),_.jsx(sn,{to:"/",className:"footer__link",target:"_blank",rel:"noopener noreferrer",children:"Rights"})]}),_.jsxs("div",{className:"footer__block",onClick:t,children:[_.jsx("span",{className:"footer__button-title",children:"Back to top"}),_.jsx("button",{className:"footer__button",children:_.jsx(Ye,{icon:He.arrow_left[e]})})]})]})})},em=()=>{const e=Et();return g.useEffect(()=>{window.scrollTo({top:0,behavior:"smooth"})},[e.pathname]),_.jsxs("div",{className:"Layout",children:[_.jsx("header",{className:"Layout__header",children:_.jsx(Zh,{})}),_.jsx("div",{className:"Layout__menu",children:_.jsx(qh,{})}),_.jsx("main",{className:"Layout__content",children:_.jsx(g.Suspense,{children:_.jsx(Ph,{})})}),_.jsx("footer",{className:"Layout__footer",children:_.jsx(bh,{})})]})},tm="modulepreload",nm=function(e){return"/react_phone-catalog/"+e},Ts={},Sn=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),u=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));l=Promise.allSettled(n.map(s=>{if(s=nm(s),s in Ts)return;Ts[s]=!0;const a=s.endsWith(".css"),h=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${h}`))return;const p=document.createElement("link");if(p.rel=a?"stylesheet":tm,a||(p.as="script"),p.crossOrigin="",p.href=s,u&&p.setAttribute("nonce",u),document.head.appendChild(p),a)return new Promise((m,w)=>{p.addEventListener("load",m),p.addEventListener("error",()=>w(new Error(`Unable to preload CSS for ${s}`)))})}))}function o(i){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=i,window.dispatchEvent(u),!u.defaultPrevented)throw i}return l.then(i=>{for(const u of i||[])u.status==="rejected"&&o(u.reason);return t().catch(o)})},rm=g.lazy(()=>Sn(async()=>{const{HomePage:e}=await import("./index--M-vjEFs.js");return{HomePage:e}},__vite__mapDeps([0,1,2,3,4,5])).then(({HomePage:e})=>({default:e}))),vo=g.lazy(()=>Sn(async()=>{const{ProductPage:e}=await import("./index-CDfWgnoX.js");return{ProductPage:e}},__vite__mapDeps([6,7,8,9,2,3,10,11,12,13])).then(({ProductPage:e})=>({default:e}))),go=g.lazy(()=>Sn(async()=>{const{ProductDetailsPage:e}=await import("./index-DZGfIgcM.js");return{ProductDetailsPage:e}},__vite__mapDeps([14,7,8,1,2,3,4,15,16,11,12,17])).then(({ProductDetailsPage:e})=>({default:e}))),lm=g.lazy(()=>Sn(async()=>{const{ShoppingCartPage:e}=await import("./index-D68rl43-.js");return{ShoppingCartPage:e}},__vite__mapDeps([18,15,16,19])).then(({ShoppingCartPage:e})=>({default:e}))),om=g.lazy(()=>Sn(async()=>{const{FavoritesPage:e}=await import("./index-C5E6A8ui.js");return{FavoritesPage:e}},__vite__mapDeps([20,9,2,3,10,7,8,21])).then(({FavoritesPage:e})=>({default:e}))),im=g.lazy(()=>Sn(async()=>{const{NotFoundPage:e}=await import("./index-C4ngy4_v.js");return{NotFoundPage:e}},__vite__mapDeps([22,23])).then(({NotFoundPage:e})=>({default:e}))),um=()=>_.jsx(Dh,{children:_.jsx(Lh,{children:_.jsxs(ue,{path:"/",element:_.jsx(em,{}),children:[_.jsx(ue,{index:!0,element:_.jsx(rm,{})}),_.jsxs(ue,{path:"phones",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"phones"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsxs(ue,{path:"tablets",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"tablets"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsxs(ue,{path:"accessories",children:[_.jsx(ue,{index:!0,element:_.jsx(vo,{category:"accessories"})}),_.jsx(ue,{path:":productId",element:_.jsx(go,{})})]}),_.jsx(ue,{path:"favorites",element:_.jsx(om,{})}),_.jsx(ue,{path:"cart",element:_.jsx(lm,{})}),_.jsx(ue,{path:"*",element:_.jsx(im,{})})]})})}),sm=()=>_.jsx(Yh,{children:_.jsx(um,{})});Hc(document.getElementById("root")).render(_.jsx(sm,{}));export{mr as G,Ye as I,sn as L,mo as N,Et as a,am as b,fu as c,bc as d,cm as g,He as i,_ as j,g as r,Vh as u}; diff --git a/public/assets/index-DlB5k-ir.css b/public/assets/index-DlB5k-ir.css deleted file mode 100644 index f1b90fea2c3..00000000000 --- a/public/assets/index-DlB5k-ir.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.buttonUp{position:sticky;top:70px;cursor:pointer;width:32px;height:32px;border:1px solid var(--color-gray-icons-placeholders);background-color:var(--color-bg);transform:rotate(90deg);transition:border-color .3s ease}.buttonUp:hover{border:1px solid var(--color-gray-primary);background-color:var(--color-hover)}body.theme_dark .buttonUp{border:1px solid var(--color-gray-icons-placeholders);background-color:none;transition:background-color .3s}body.theme_dark .buttonUp:hover{background-color:var(--color-gray-icons-placeholders)}.productsPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.productsPage{padding-inline:24px}}@media (min-width: 1200px){.productsPage{padding-inline:0;margin-inline:auto}}.productsPage__title{font-family:Mont-Bold,sans-serif;font-size:32px;font-weight:800;line-height:41px;letter-spacing:-.01em;color:var(--color-gray-primary);margin-bottom:8px}@media (min-width: 640px){.productsPage__title{font-size:48px;line-height:56px}}.productsPage__description{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-secondary)}.productsPage__dropdown{margin-top:32px;gap:16px;--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}@media (min-width: 640px){.productsPage__dropdown{--columns: 12}}@media (min-width: 1200px){.productsPage__dropdown{--columns: 24}}@media (min-width: 640px){.productsPage__dropdown{margin-top:40px}}.productsPage__dropdown--sortBy{grid-column:span 2}@media (min-width: 640px){.productsPage__dropdown--sortBy{grid-column:span 4}}.productsPage__dropdown--itemsPerPage{grid-column:span 2}@media (min-width: 640px){.productsPage__dropdown--itemsPerPage{grid-column:span 3}}.productsPage__content{display:flex;flex-wrap:wrap;gap:40px 16px;margin-top:24px}.productsPage__no-products{margin-top:40px;font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);text-align:center}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.dropdown{position:relative}.dropdown__label{font-family:Mont-SemiBold,sans-serif;font-size:12px;font-weight:700;color:var(--color-gray-secondary)}.dropdown__icon{width:16px;height:16px;transition:transform .3s ease}.dropdown__title{font-family:Mont-SemiBold,sans-serif;font-size:14px;line-height:14px;font-weight:700;color:var(--color-gray-primary)}.dropdown__options{position:absolute;width:100%;top:calc(100% + 8px);padding-block:8px;background-color:var(--color-bg);border:1px solid var(--color-gray-icons-placeholders);box-shadow:0 2px 5px #0000001a;max-height:200px;overflow-y:auto;transition:all .3s ease-in-out;z-index:1}.dropdown__option{padding:9px 12px;cursor:pointer;font-family:Mont-Regular,sans-serif;font-size:14px;line-height:14px;color:var(--color-gray-secondary)}.dropdown__option:hover{color:var(--color-gray-primary);background-color:var(--color-hover)}.dropdown__button{padding:11px 12px;background:none;border:1px solid var(--color-gray-icons-placeholders);width:100%;display:flex;justify-content:space-between;align-items:center;cursor:pointer;transition:border .3s}.dropdown__button:focus{border-color:var(--color-accent)}.dropdown__button:not(.dropdown__button--open){border-color:var(--color-gray-icons-placeholders)}.dropdown__button:hover:not(.dropdown__button--open){border-color:var(--color-gray-secondary)}.dropdown__button--open{border-color:var(--color-accent);background-color:var(--color-surface-2)}body.theme_dark .dropdown__option:hover{color:var(--color-gray-primary);background-color:var(--color-surface-2)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.pagination{height:32px;display:flex;gap:16px;justify-content:center;align-items:center;margin:40px auto 80px}.pagination__button-container{display:flex;gap:8px}.pagination__button-page,.pagination__button{padding:0;margin:0;position:relative;width:32px;height:32px;border:1px solid var(--color-gray-elements);background-color:var(--color-bg);box-sizing:border-box;cursor:pointer;color:var(--color-gray-primary);font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;display:flex;justify-content:center;align-items:center;transition:background-color .3s,border-color .3s}body.theme_dark .pagination__button-page,body.theme_dark .pagination__button{border:none;background-color:var(--color-surface-1);color:var(--color-gray-primary)}.pagination__button-page:not(.pagination__button-page--active):hover{border-color:var(--color-gray-primary)}body.theme_dark .pagination__button-page:not(.pagination__button-page--active):hover{background-color:var(--color-gray-elements)}.pagination__button:not(.pagination__button--disabled):hover{border-color:var(--color-gray-primary)}body.theme_dark .pagination__button:not(.pagination__button--disabled):hover{background-color:var(--color-gray-elements)}.pagination__button-page--active{background-color:var(--color-gray-primary);color:var(--color-bg)}body.theme_dark .pagination__button-page--active{background-color:var(--color-accent)}.pagination__button--disabled{cursor:not-allowed}body.theme_dark .pagination__button--disabled{background-color:var(--color-bg);border:1px solid var(--color-gray-elements)}body.theme_dark p{color:var(--color-gray-primary);font-family:Mont-Regular,sans-serif} diff --git a/public/assets/index-urnOVSjv.css b/public/assets/index-urnOVSjv.css deleted file mode 100644 index 349d290909e..00000000000 --- a/public/assets/index-urnOVSjv.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}.cartPage{padding-inline:16px;max-width:1136px}@media (min-width: 640px){.cartPage{padding-inline:24px}}@media (min-width: 1200px){.cartPage{padding-inline:0;margin-inline:auto}}.cartPage__title{margin-top:16px;margin-bottom:32px;font-family:Mont-Bold,sans-serif;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary);font-size:48px;line-height:56px}.cartPage__content{display:flex;flex-direction:column;gap:32px}@media (min-width: 1200px){.cartPage__content{--columns: 4;display:grid;column-gap:16px;grid-template-columns:repeat(var(--columns),1fr)}}@media (min-width: 1200px) and (min-width: 640px){.cartPage__content{--columns: 12}}@media (min-width: 1200px) and (min-width: 1200px){.cartPage__content{--columns: 24}}.cartPage__content-container{display:flex;flex-direction:column;gap:16px}@media (min-width: 1200px){.cartPage__content-container{grid-column:span 16}}.cartPage__empty-content{display:flex;width:100%;align-items:center;justify-content:center}.cartPage__empty-content-title{font-family:Mont-SemiBold,sans-serif;font-size:48px;font-weight:500;color:var(--color-gray-secondary);display:flex;justify-content:center;width:460px}.cartPage__image-empty{width:40%}.cartPage__total{height:fit-content;padding:24px;text-align:center;border:1px solid var(--color-gray-elements)}@media (min-width: 1200px){.cartPage__total{grid-column:span 8}}.cartPage__total-count{font-family:Mont-Bold,sans-serif;font-size:32px;font-weight:800;letter-spacing:-.01em;color:var(--color-gray-primary)}.cartPage__total-title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:500;line-height:21px;color:var(--color-gray-secondary)}.cartPage__line{width:100%;height:1px;background-color:var(--color-gray-elements);margin-block:24px}.cartPage__button-checkout{width:100%;padding:12px 0;background-color:var(--color-gray-primary);border:none;font-family:Mont-SemiBold,sans-serif;font-size:14px;font-weight:700;line-height:21px;text-align:center;color:var(--color-bg);cursor:pointer;transition:background-color .3s ease,box-shadow .3s ease,color .3s ease;transition:box-shadow .3s}.cartPage__button-checkout:hover{box-shadow:0 3px 13px #17203166}body.theme_dark .cartPage__button-checkout{background-color:var(--color-accent);color:var(--color-gray-primary);transition:background-color .3s ease,box-shadow .3s ease,color .3s ease}body.theme_dark .cartPage__button-checkout:hover{background-color:var(--color-accent-hover)}@font-face{font-family:Mont-Regular;src:url(/react_phone-catalog/fonts/Mont-Regular.otf);font-weight:400}@font-face{font-family:Mont-SemiBold;src:url(/react_phone-catalog/fonts/Mont-SemiBold.otf);font-weight:400}@font-face{font-family:Mont-Bold;src:url(/react_phone-catalog/fonts/Mont-Bold.otf);font-weight:400}body{--color-bg: #fff;--color-gray-primary: #313237;--color-gray-secondary: #89939a;--color-gray-icons-placeholders: #b4bdc3;--color-gray-elements: #e2e6e9;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #fafbfc}body.theme_dark{--color-gray-primary: #f1f2f9;--color-gray-secondary: #75767f;--color-bg: #0f1121;--color-gray-icons-placeholders: #4a4d58;--color-gray-elements: #3b3e4a;--color-green: #27ae60;--color-red: #eb5757;--color-hover: #1cd97a;--color-surface-1: #161827;--color-surface-2: #323542;--color-accent: #905bff;--color-accent-hover: #a378ff}*{box-sizing:border-box}.cartItem{padding:16px;display:flex;flex-direction:column;gap:16px;border:1px solid var(--color-gray-elements);transition:border-color .3s ease;justify-content:space-between}@media (min-width: 640px){.cartItem{flex-direction:row;padding:24px}}.cartItem:hover{border:1px solid var(--color-gray-primary);transition:border-color .3s ease}.cartItem__wrapperTop{display:flex;gap:16px;align-items:center}@media (min-width: 640px){.cartItem__wrapperTop{gap:24px}}.cartItem__wrapperBottom{display:flex;align-items:center;justify-content:space-between}@media (min-width: 640px){.cartItem__wrapperBottom{gap:24px}}.cartItem__icon-close{border:none;background-color:var(--color-bg);cursor:pointer;width:16px;height:16px;background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4721%204.47138C12.7324%204.21103%2012.7324%203.78892%2012.4721%203.52858C12.2117%203.26823%2011.7896%203.26823%2011.5292%203.52858L8.00065%207.05717L4.47206%203.52858C4.21171%203.26823%203.7896%203.26823%203.52925%203.52858C3.2689%203.78892%203.2689%204.21103%203.52925%204.47138L7.05784%207.99998L3.52925%2011.5286C3.2689%2011.7889%203.2689%2012.211%203.52925%2012.4714C3.7896%2012.7317%204.21171%2012.7317%204.47206%2012.4714L8.00065%208.94279L11.5292%2012.4714C11.7896%2012.7317%2012.2117%2012.7317%2012.4721%2012.4714C12.7324%2012.211%2012.7324%2011.7889%2012.4721%2011.5286L8.94346%207.99998L12.4721%204.47138Z'%20fill='%23B4BDC4'/%3e%3c/svg%3e")}.cartItem__icon-close:hover{background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4714%204.4714C12.7318%204.21105%2012.7318%203.78894%2012.4714%203.52859C12.2111%203.26824%2011.789%203.26824%2011.5286%203.52859L8.00004%207.05719L4.47145%203.52859C4.2111%203.26824%203.78899%203.26824%203.52864%203.52859C3.26829%203.78894%203.26829%204.21105%203.52864%204.4714L7.05723%207.99999L3.52864%2011.5286C3.26829%2011.7889%203.26829%2012.211%203.52864%2012.4714C3.78899%2012.7317%204.2111%2012.7317%204.47145%2012.4714L8.00004%208.9428L11.5286%2012.4714C11.789%2012.7317%2012.2111%2012.7317%2012.4714%2012.4714C12.7318%2012.211%2012.7318%2011.7889%2012.4714%2011.5286L8.94285%207.99999L12.4714%204.4714Z'%20fill='%23313237'/%3e%3c/svg%3e")}.cartItem__link{display:flex;align-items:center;text-decoration:none}.cartItem__title{font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;line-height:21px;color:var(--color-gray-primary)}.cartItem__counter-container{display:flex}.cartItem__price{width:80px;text-align:right;font-family:Mont-Bold,sans-serif;font-size:22px;font-weight:800;color:var(--color-gray-primary)}.cartItem__counter{width:32px;font-family:Mont-Regular,sans-serif;font-size:14px;font-weight:600;text-align:center;line-height:32px}.cartItem__button{border:1px solid var(--color-gray-icons-placeholders);border-radius:50%;background-color:#fff;width:32px;height:32px;cursor:pointer;transition:border .3s ease}.cartItem__button--disabled{border:1px solid var(--color-gray-elements);cursor:not-allowed}.cartItem__button:not(.cartItem__button--disabled):hover{background-color:var(--color-gray-icons-placeholders);border:none}.cartItem__image{height:80px;width:80px;object-fit:contain;transition:transform .3s ease}.cartItem__image:hover{transform:scale(1.05)}body.theme_dark .cartItem__counter{color:var(--color-gray-primary)}body.theme_dark .cartItem__button{background-color:var(--color-surface-2);border:none}body.theme_dark .cartItem__button--disabled{background-color:var(--color-bg);border:1px solid var(--color-gray-elements)}body.theme_dark .cartItem__button:not(.cartItem__button--disabled):hover{background-color:var(--color-gray-icons-placeholders);border:none}body.theme_dark .cartItem__icon-close{border:none;background-color:var(--color-bg);cursor:pointer;width:16px;height:16px;background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4714%204.4714C12.7318%204.21105%2012.7318%203.78894%2012.4714%203.52859C12.2111%203.26824%2011.789%203.26824%2011.5286%203.52859L8.00004%207.05719L4.47145%203.52859C4.2111%203.26824%203.78899%203.26824%203.52864%203.52859C3.26829%203.78894%203.26829%204.21105%203.52864%204.4714L7.05723%207.99999L3.52864%2011.5286C3.26829%2011.7889%203.26829%2012.211%203.52864%2012.4714C3.78899%2012.7317%204.2111%2012.7317%204.47145%2012.4714L8.00004%208.9428L11.5286%2012.4714C11.789%2012.7317%2012.2111%2012.7317%2012.4714%2012.4714C12.7318%2012.211%2012.7318%2011.7889%2012.4714%2011.5286L8.94285%207.99999L12.4714%204.4714Z'%20fill='%23313237'/%3e%3c/svg%3e")}body.theme_dark .cartItem__icon-close:hover{background-image:url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.4721%204.47138C12.7324%204.21103%2012.7324%203.78892%2012.4721%203.52858C12.2117%203.26823%2011.7896%203.26823%2011.5292%203.52858L8.00065%207.05717L4.47206%203.52858C4.21171%203.26823%203.7896%203.26823%203.52925%203.52858C3.2689%203.78892%203.2689%204.21103%203.52925%204.47138L7.05784%207.99998L3.52925%2011.5286C3.2689%2011.7889%203.2689%2012.211%203.52925%2012.4714C3.7896%2012.7317%204.21171%2012.7317%204.47206%2012.4714L8.00065%208.94279L11.5292%2012.4714C11.7896%2012.7317%2012.2117%2012.7317%2012.4721%2012.4714C12.7324%2012.211%2012.7324%2011.7889%2012.4721%2011.5286L8.94346%207.99998L12.4721%204.47138Z'%20fill='%23B4BDC4'/%3e%3c/svg%3e")} diff --git a/src/components/ShopByCategory/ShopByCategory.tsx b/src/components/ShopByCategory/ShopByCategory.tsx index e8640216e2c..96651d3768f 100644 --- a/src/components/ShopByCategory/ShopByCategory.tsx +++ b/src/components/ShopByCategory/ShopByCategory.tsx @@ -41,7 +41,7 @@ export const ShopByCategory: React.FC = () => {
Category Phones @@ -55,7 +55,7 @@ export const ShopByCategory: React.FC = () => {
Category Tablets @@ -69,7 +69,7 @@ export const ShopByCategory: React.FC = () => {
Category Accessories diff --git a/src/constants/icons.ts b/src/constants/icons.ts index d9103ce1380..0a5da4f6f00 100644 --- a/src/constants/icons.ts +++ b/src/constants/icons.ts @@ -4,182 +4,182 @@ export const icons: Record = { logo: { light: { title: 'Logo icon', - path: '/icons/logo.svg', + path: './icons/logo.svg', }, dark: { title: 'Logo dark icon', - path: '/icons/logo_dark.svg', + path: './icons/logo_dark.svg', }, }, close: { light: { title: 'Close icon', - path: '/icons/Close.svg', + path: './icons/Close.svg', }, dark: { title: 'Close dark icon', - path: '/icons/close_dark.svg', + path: './icons/close_dark.svg', }, }, close__disabled: { light: { title: 'Close icon', - path: '/icons/close__disabled.svg', + path: './icons/close__disabled.svg', }, dark: { title: 'Close dark icon', - path: '/icons/close__disabled.svg', + path: './icons/close__disabled.svg', }, }, menu: { light: { title: 'Menu icon', - path: '/icons/Menu.svg', + path: './icons/Menu.svg', }, dark: { title: 'Menu dark icon', - path: '/icons/menu_dark.svg', + path: './icons/menu_dark.svg', }, }, search: { light: { title: 'Search icon', - path: '/icons/search.svg', + path: './icons/search.svg', }, dark: { title: 'Search dark icon', - path: '/icons/search_dark.svg', + path: './icons/search_dark.svg', }, }, favorites: { light: { title: 'Favorites icon', - path: '/icons/favorites.svg', + path: './icons/favorites.svg', }, dark: { title: 'Favorites dark icon', - path: '/icons/favorites_dark.svg', + path: './icons/favorites_dark.svg', }, }, favorites__filled: { light: { title: 'Favorites filled icon', - path: '/icons/favorites__filled.svg', + path: './icons/favorites__filled.svg', }, dark: { title: 'Favorites filled dark icon', - path: '/icons/favorites__filled.svg', + path: './icons/favorites__filled.svg', }, }, shopping_cart: { light: { title: 'Shopping cart icon', - path: '/icons/shopping_cart.svg', + path: './icons/shopping_cart.svg', }, dark: { title: 'Shopping cart dark icon', - path: '/icons/shopping_cart_dark.svg', + path: './icons/shopping_cart_dark.svg', }, }, arrow_left: { light: { title: 'Arrow left icon', - path: '/icons/arrow_left.svg', + path: './icons/arrow_left.svg', }, dark: { title: 'Arrow left dark icon', - path: '/icons/arrow_left_dark.svg', + path: './icons/arrow_left_dark.svg', }, }, arrow_left__disabled: { light: { title: 'Arrow left disabled icon', - path: '/icons/arrow_left__disabled.svg', + path: './icons/arrow_left__disabled.svg', }, dark: { title: 'Arrow left disabled dark icon', - path: '/icons/arrow_left_dark__disabled.svg', + path: './icons/arrow_left_dark__disabled.svg', }, }, arrow_right: { light: { title: 'Arrow right icon', - path: '/icons/arrow_right.svg', + path: './icons/arrow_right.svg', }, dark: { title: 'Arrow right dark icon', - path: '/icons/arrow_right_dark.svg', + path: './icons/arrow_right_dark.svg', }, }, arrow_right__disabled: { light: { title: 'Arrow right disabled icon', - path: '/icons/arrow_right__disabled.svg', + path: './icons/arrow_right__disabled.svg', }, dark: { title: 'Arrow right disabled dark icon', - path: '/icons/arrow_right_dark__disabled.svg', + path: './icons/arrow_right_dark__disabled.svg', }, }, arrow_down: { light: { title: 'Arrow down icon', - path: '/icons/arrow_down_dark.svg', + path: './icons/arrow_down_dark.svg', }, dark: { title: 'Arrow down dark icon', - path: '/icons/arrow_down_dark.svg', + path: './icons/arrow_down_dark.svg', }, }, home: { light: { title: 'Home icon', - path: '/icons/Home.svg', + path: './icons/Home.svg', }, dark: { title: 'Home dark icon', - path: '/icons/home_dark.svg', + path: './icons/home_dark.svg', }, }, plus: { light: { title: 'Plus icon', - path: '/icons/Plus.svg', + path: './icons/Plus.svg', }, dark: { title: 'Plus dark icon', - path: '/icons/Union.svg', + path: './icons/Union.svg', }, }, minus: { light: { title: 'Minus icon', - path: '/icons/Minus.svg', + path: './icons/Minus.svg', }, dark: { title: 'Minus dark icon', - path: '/icons/minus_dark.svg', + path: './icons/minus_dark.svg', }, }, minus__disabled: { light: { title: 'Minus icon', - path: '/icons/minus__disabled.svg', + path: './icons/minus__disabled.svg', }, dark: { title: 'Minus dark icon', - path: '/icons/MinusDarkDisabled.svg', + path: './icons/MinusDarkDisabled.svg', }, }, ok: { light: { title: 'ok', - path: '/icons/image 15.svg', + path: './icons/image 15.svg', }, dark: { title: 'ok', - path: '/icons/image 15.svg', + path: './icons/image 15.svg', }, }, }; From d262f3670a19000895d20fbc57e6d3d0561b0be1 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Sun, 29 Jun 2025 21:55:31 +0200 Subject: [PATCH 08/11] copy9 --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index cfb168bb26c..c93972998cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ ], "compilerOptions": { "sourceMap": false, - "types": ["node", "cypress"] + "types": ["node", "cypress"], + "baseUrl": "./src" } } From 03a4894169069a77ed241c542b3640b78ec2ef63 Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Mon, 30 Jun 2025 10:34:47 +0200 Subject: [PATCH 09/11] copy10 --- index.html | 6 +++--- ndex.html | 22 ++++++++++++++++++++++ src/shared/Linkline/Linkline.tsx | 6 +++--- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 ndex.html diff --git a/index.html b/index.html index 1775fea4e1c..53442d88991 100644 --- a/index.html +++ b/index.html @@ -3,11 +3,11 @@ - + Nice Gadgets - +
- + diff --git a/ndex.html b/ndex.html new file mode 100644 index 00000000000..45ef845222f --- /dev/null +++ b/ndex.html @@ -0,0 +1,22 @@ + + + + + + + BlogHost + + + + + +
+ + + diff --git a/src/shared/Linkline/Linkline.tsx b/src/shared/Linkline/Linkline.tsx index 73734b12e65..17d202a00ef 100644 --- a/src/shared/Linkline/Linkline.tsx +++ b/src/shared/Linkline/Linkline.tsx @@ -22,13 +22,13 @@ export const Linkline: FC = ({ productType, productName }) => { return (
- - + From 1ca145fe7bc60d0441a2f0f4709e294349fb56bd Mon Sep 17 00:00:00 2001 From: SerhiiSemennikov Date: Fri, 4 Jul 2025 11:34:24 +0200 Subject: [PATCH 10/11] copy11 --- src/App.tsx | 6 ++++++ .../ProductDetailsPage/ProductDetailsPage.tsx | 10 ++++------ src/shared/Footer/Footer.scss | 9 ++++++++- src/shared/Footer/Footer.tsx | 4 +++- src/shared/Header/Header.scss | 14 +++++++------- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 3694b3bf8b0..7f46a89f546 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,3 +8,9 @@ export const App = () => { ); }; + +/* app.get('/script.js', (req, res) => { + res.setHeader('Content-Type', 'application/javascript'); + res.sendFile(__dirname + '/script.js'); +}); +*/ diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx index 1e4da0d005a..68b5302e84b 100644 --- a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -17,12 +17,10 @@ const getSuggestedProducts = ( currentCategory: string, productItemId: string, ) => { - return allProducts - .filter( - prod => - prod.category === currentCategory && prod.itemId !== productItemId, - ) - .sort(() => 0.5 - Math.random()); + return allProducts.filter( + prod => prod.category === currentCategory && prod.itemId !== productItemId, + ); + //.sort(() => 0.5 - Math.random()); }; export const ProductDetailsPage: FC = () => { diff --git a/src/shared/Footer/Footer.scss b/src/shared/Footer/Footer.scss index 362c5f7e772..c02347e982d 100644 --- a/src/shared/Footer/Footer.scss +++ b/src/shared/Footer/Footer.scss @@ -19,7 +19,11 @@ } @include on-desktop { + display: flex; + justify-content: center; + margin-top: 80px; + } } @@ -45,7 +49,10 @@ } @include on-desktop { - align-items: center; + + + gap: 107px; + } } diff --git a/src/shared/Footer/Footer.tsx b/src/shared/Footer/Footer.tsx index e217c3eeb6b..ab6a31f75f3 100644 --- a/src/shared/Footer/Footer.tsx +++ b/src/shared/Footer/Footer.tsx @@ -18,7 +18,9 @@ export const Footer: FC = () => { return (
- +
+ +
{/* Date: Sat, 13 Jun 2026 15:46:01 +0200 Subject: [PATCH 11/11] new2 --- .../accessories/apple-watch-se/gold/00.webp | Bin .../accessories/apple-watch-se/gold/01.webp | Bin .../accessories/apple-watch-se/gold/02.webp | Bin .../accessories/apple-watch-se/silver/00.webp | Bin .../accessories/apple-watch-se/silver/01.webp | Bin .../accessories/apple-watch-se/silver/02.webp | Bin .../apple-watch-se/space-gray/00.webp | Bin .../apple-watch-se/space-gray/01.webp | Bin .../apple-watch-se/space-gray/02.webp | Bin .../apple-watch-series-3/gold/00.webp | Bin .../apple-watch-series-3/gold/01.webp | Bin .../apple-watch-series-3/gold/02.webp | Bin .../apple-watch-series-3/silver/00.webp | Bin .../apple-watch-series-3/silver/01.webp | Bin .../apple-watch-series-3/silver/02.webp | Bin .../apple-watch-series-3/space-gray/00.webp | Bin .../apple-watch-series-3/space-gray/01.webp | Bin .../apple-watch-series-3/space-gray/02.webp | Bin .../apple-watch-series-4/gold/00.webp | Bin .../apple-watch-series-4/gold/01.webp | Bin .../apple-watch-series-4/gold/02.webp | Bin .../apple-watch-series-4/silver/00.webp | Bin .../apple-watch-series-4/silver/01.webp | Bin .../apple-watch-series-4/silver/02.webp | Bin .../apple-watch-series-4/space-gray/00.webp | Bin .../apple-watch-series-4/space-gray/01.webp | Bin .../apple-watch-series-4/space-gray/02.webp | Bin .../apple-watch-series-5/gold/00.webp | Bin .../apple-watch-series-5/gold/01.webp | Bin .../apple-watch-series-5/gold/02.webp | Bin .../apple-watch-series-5/silver/00.webp | Bin .../apple-watch-series-5/silver/01.webp | Bin .../apple-watch-series-5/silver/02.webp | Bin .../apple-watch-series-5/space-gray/00.webp | Bin .../apple-watch-series-5/space-gray/01.webp | Bin .../apple-watch-series-5/space-gray/02.webp | Bin .../apple-watch-series-6/blue/00.webp | Bin .../apple-watch-series-6/blue/01.webp | Bin .../apple-watch-series-6/blue/02.webp | Bin .../apple-watch-series-6/gold/00.webp | Bin .../apple-watch-series-6/gold/01.webp | Bin .../apple-watch-series-6/gold/02.webp | Bin .../apple-watch-series-6/red/00.webp | Bin .../apple-watch-series-6/red/01.webp | Bin .../apple-watch-series-6/red/02.webp | Bin .../apple-watch-series-6/silver/00.webp | Bin .../apple-watch-series-6/silver/01.webp | Bin .../apple-watch-series-6/silver/02.webp | Bin .../apple-watch-series-6/space-gray/00.webp | Bin .../apple-watch-series-6/space-gray/01.webp | Bin .../apple-watch-series-6/space-gray/02.webp | Bin .../{img => imgClosed}/banner-accessories.png | Bin public/{img => imgClosed}/banner-phones.png | Bin public/{img => imgClosed}/banner-tablets.png | Bin public/{img => imgClosed}/cart-is-empty.png | Bin .../category-accessories.png | Bin .../category-accessories.webp | Bin public/{img => imgClosed}/category-phones.png | Bin .../{img => imgClosed}/category-phones.webp | Bin .../{img => imgClosed}/category-tablets.png | Bin .../{img => imgClosed}/category-tablets.webp | Bin public/{img => imgClosed}/page-not-found.png | Bin .../apple-iphone-11-pro-max/gold/00.webp | Bin .../apple-iphone-11-pro-max/gold/01.webp | Bin .../apple-iphone-11-pro-max/gold/02.webp | Bin .../midnightgreen/00.webp | Bin .../midnightgreen/01.webp | Bin .../midnightgreen/02.webp | Bin .../midnightgreen/03.webp | Bin .../apple-iphone-11-pro-max/silver/00.webp | Bin .../apple-iphone-11-pro-max/silver/01.webp | Bin .../apple-iphone-11-pro-max/silver/02.webp | Bin .../apple-iphone-11-pro-max/spacegray/00.webp | Bin .../apple-iphone-11-pro-max/spacegray/01.webp | Bin .../apple-iphone-11-pro-max/spacegray/02.webp | Bin .../phones/apple-iphone-11-pro/gold/00.webp | Bin .../phones/apple-iphone-11-pro/gold/01.webp | Bin .../phones/apple-iphone-11-pro/gold/02.webp | Bin .../apple-iphone-11-pro/midnightgreen/00.webp | Bin .../apple-iphone-11-pro/midnightgreen/01.webp | Bin .../apple-iphone-11-pro/midnightgreen/02.webp | Bin .../apple-iphone-11-pro/midnightgreen/03.webp | Bin .../phones/apple-iphone-11-pro/silver/00.webp | Bin .../phones/apple-iphone-11-pro/silver/01.webp | Bin .../phones/apple-iphone-11-pro/silver/02.webp | Bin .../apple-iphone-11-pro/spacegray/00.webp | Bin .../apple-iphone-11-pro/spacegray/01.webp | Bin .../apple-iphone-11-pro/spacegray/02.webp | Bin .../phones/apple-iphone-11/black/00.webp | Bin .../phones/apple-iphone-11/black/01.webp | Bin .../phones/apple-iphone-11/black/02.webp | Bin .../phones/apple-iphone-11/black/03.webp | Bin .../phones/apple-iphone-11/black/04.webp | Bin .../phones/apple-iphone-11/green/00.webp | Bin .../phones/apple-iphone-11/green/01.webp | Bin .../phones/apple-iphone-11/green/02.webp | Bin .../phones/apple-iphone-11/green/03.webp | Bin .../phones/apple-iphone-11/green/04.webp | Bin .../phones/apple-iphone-11/purple/00.webp | Bin .../phones/apple-iphone-11/purple/01.webp | Bin .../phones/apple-iphone-11/purple/02.webp | Bin .../phones/apple-iphone-11/purple/03.webp | Bin .../phones/apple-iphone-11/purple/04.webp | Bin .../phones/apple-iphone-11/red/00.webp | Bin .../phones/apple-iphone-11/red/01.webp | Bin .../phones/apple-iphone-11/red/02.webp | Bin .../phones/apple-iphone-11/red/03.webp | Bin .../phones/apple-iphone-11/red/04.webp | Bin .../phones/apple-iphone-11/white/00.webp | Bin .../phones/apple-iphone-11/white/01.webp | Bin .../phones/apple-iphone-11/white/02.webp | Bin .../phones/apple-iphone-11/white/03.webp | Bin .../phones/apple-iphone-11/white/04.webp | Bin .../phones/apple-iphone-11/yellow/00.webp | Bin .../phones/apple-iphone-11/yellow/01.webp | Bin .../phones/apple-iphone-11/yellow/02.webp | Bin .../phones/apple-iphone-11/yellow/03.webp | Bin .../phones/apple-iphone-11/yellow/04.webp | Bin .../phones/apple-iphone-12/black/00.webp | Bin .../phones/apple-iphone-12/black/01.webp | Bin .../phones/apple-iphone-12/black/02.webp | Bin .../phones/apple-iphone-12/black/03.webp | Bin .../phones/apple-iphone-12/purple/00.webp | Bin .../phones/apple-iphone-12/purple/01.webp | Bin .../phones/apple-iphone-12/purple/02.webp | Bin .../phones/apple-iphone-12/purple/03.webp | Bin .../phones/apple-iphone-12/red/00.webp | Bin .../phones/apple-iphone-12/red/01.webp | Bin .../phones/apple-iphone-12/red/02.webp | Bin .../phones/apple-iphone-12/red/03.webp | Bin .../phones/apple-iphone-12/white/00.webp | Bin .../phones/apple-iphone-12/white/01.webp | Bin .../phones/apple-iphone-12/white/03.webp | Bin .../phones/apple-iphone-12/white/04.webp | Bin .../phones/apple-iphone-13-mini/blue/00.webp | Bin .../phones/apple-iphone-13-mini/blue/01.webp | Bin .../phones/apple-iphone-13-mini/blue/02.webp | Bin .../phones/apple-iphone-13-mini/blue/03.webp | Bin .../apple-iphone-13-mini/midnight/00.webp | Bin .../apple-iphone-13-mini/midnight/01.webp | Bin .../apple-iphone-13-mini/midnight/02.webp | Bin .../apple-iphone-13-mini/midnight/03.webp | Bin .../phones/apple-iphone-13-mini/pink/00.webp | Bin .../phones/apple-iphone-13-mini/pink/01.webp | Bin .../phones/apple-iphone-13-mini/pink/02.webp | Bin .../phones/apple-iphone-13-mini/pink/03.webp | Bin .../phones/apple-iphone-13-mini/white/00.webp | Bin .../phones/apple-iphone-13-mini/white/01.webp | Bin .../phones/apple-iphone-13-mini/white/02.webp | Bin .../phones/apple-iphone-13-mini/white/03.webp | Bin .../apple-iphone-13-pro-max/gold/00.webp | Bin .../apple-iphone-13-pro-max/gold/01.webp | Bin .../apple-iphone-13-pro-max/gold/02.webp | Bin .../apple-iphone-13-pro-max/gold/03.webp | Bin .../apple-iphone-13-pro-max/graphite/00.webp | Bin .../apple-iphone-13-pro-max/graphite/01.webp | Bin .../apple-iphone-13-pro-max/graphite/02.webp | Bin .../apple-iphone-13-pro-max/graphite/03.webp | Bin .../sierrablue/00.webp | Bin .../sierrablue/01.webp | Bin .../sierrablue/02.webp | Bin .../sierrablue/03.webp | Bin .../phones/apple-iphone-14-pro/gold/00.webp | Bin .../phones/apple-iphone-14-pro/gold/01.webp | Bin .../phones/apple-iphone-14-pro/gold/02.webp | Bin .../phones/apple-iphone-14-pro/gold/03.webp | Bin .../phones/apple-iphone-14-pro/gold/04.webp | Bin .../apple-iphone-14-pro/spaceblack/00.webp | Bin .../apple-iphone-14-pro/spaceblack/01.webp | Bin .../apple-iphone-14-pro/spaceblack/02.webp | Bin .../apple-iphone-14-pro/spaceblack/03.webp | Bin .../apple-iphone-14-pro/spaceblack/04.webp | Bin .../phones/apple-iphone-14/midnight/00.webp | Bin .../phones/apple-iphone-14/midnight/01.webp | Bin .../phones/apple-iphone-14/midnight/02.webp | Bin .../phones/apple-iphone-14/midnight/03.webp | Bin .../phones/apple-iphone-14/midnight/04.webp | Bin .../phones/apple-iphone-14/purple/00.webp | Bin .../phones/apple-iphone-14/purple/01.webp | Bin .../phones/apple-iphone-14/purple/02.webp | Bin .../phones/apple-iphone-14/purple/03.webp | Bin .../phones/apple-iphone-14/purple/04.webp | Bin .../phones/apple-iphone-14/yellow/00.webp | Bin .../phones/apple-iphone-14/yellow/01.webp | Bin .../phones/apple-iphone-14/yellow/02.webp | Bin .../phones/apple-iphone-14/yellow/03.webp | Bin .../phones/apple-iphone-14/yellow/04.webp | Bin .../phones/apple-iphone-7-plus/black/00.webp | Bin .../phones/apple-iphone-7-plus/black/01.webp | Bin .../phones/apple-iphone-7-plus/black/02.webp | Bin .../phones/apple-iphone-7-plus/black/03.webp | Bin .../phones/apple-iphone-7-plus/black/04.webp | Bin .../phones/apple-iphone-7-plus/gold/00.webp | Bin .../phones/apple-iphone-7-plus/gold/01.webp | Bin .../phones/apple-iphone-7-plus/gold/02.webp | Bin .../phones/apple-iphone-7-plus/gold/03.webp | Bin .../phones/apple-iphone-7-plus/gold/04.webp | Bin .../apple-iphone-7-plus/rosegold/00.webp | Bin .../apple-iphone-7-plus/rosegold/01.webp | Bin .../apple-iphone-7-plus/rosegold/02.webp | Bin .../apple-iphone-7-plus/rosegold/03.webp | Bin .../apple-iphone-7-plus/rosegold/04.webp | Bin .../phones/apple-iphone-7-plus/silver/00.webp | Bin .../phones/apple-iphone-7-plus/silver/01.webp | Bin .../phones/apple-iphone-7-plus/silver/02.webp | Bin .../phones/apple-iphone-7-plus/silver/03.webp | Bin .../phones/apple-iphone-7-plus/silver/04.webp | Bin .../phones/apple-iphone-7/black/00.webp | Bin .../phones/apple-iphone-7/black/01.webp | Bin .../phones/apple-iphone-7/black/02.webp | Bin .../phones/apple-iphone-7/black/03.webp | Bin .../phones/apple-iphone-7/black/04.webp | Bin .../phones/apple-iphone-7/gold/00.webp | Bin .../phones/apple-iphone-7/gold/01.webp | Bin .../phones/apple-iphone-7/gold/02.webp | Bin .../phones/apple-iphone-7/gold/03.webp | Bin .../phones/apple-iphone-7/gold/04.webp | Bin .../phones/apple-iphone-7/rosegold/00.webp | Bin .../phones/apple-iphone-7/rosegold/01.webp | Bin .../phones/apple-iphone-7/rosegold/02.webp | Bin .../phones/apple-iphone-7/rosegold/03.webp | Bin .../phones/apple-iphone-7/rosegold/04.webp | Bin .../phones/apple-iphone-7/silver/00.webp | Bin .../phones/apple-iphone-7/silver/01.webp | Bin .../phones/apple-iphone-7/silver/02.webp | Bin .../phones/apple-iphone-7/silver/03.webp | Bin .../phones/apple-iphone-7/silver/04.webp | Bin .../phones/apple-iphone-8/gold/00.webp | Bin .../phones/apple-iphone-8/gold/01.webp | Bin .../phones/apple-iphone-8/gold/02.webp | Bin .../phones/apple-iphone-8/gold/03.webp | Bin .../phones/apple-iphone-8/silver/00.webp | Bin .../phones/apple-iphone-8/silver/01.webp | Bin .../phones/apple-iphone-8/silver/02.webp | Bin .../phones/apple-iphone-8/silver/03.webp | Bin .../phones/apple-iphone-8/spacegray/00.webp | Bin .../phones/apple-iphone-8/spacegray/01.webp | Bin .../phones/apple-iphone-8/spacegray/02.webp | Bin .../phones/apple-iphone-8/spacegray/03.webp | Bin .../phones/apple-iphone-xr/coral/00.webp | Bin .../phones/apple-iphone-xr/coral/01.webp | Bin .../phones/apple-iphone-xr/coral/02.webp | Bin .../phones/apple-iphone-xr/red/00.webp | Bin .../phones/apple-iphone-xr/red/01.webp | Bin .../phones/apple-iphone-xr/red/02.webp | Bin .../phones/apple-iphone-xr/red/03.webp | Bin .../phones/apple-iphone-xr/red/04.webp | Bin .../phones/apple-iphone-xr/white/00.webp | Bin .../phones/apple-iphone-xr/white/01.webp | Bin .../phones/apple-iphone-xr/white/02.webp | Bin .../phones/apple-iphone-xr/white/03.webp | Bin .../phones/apple-iphone-xr/yellow/00.webp | Bin .../phones/apple-iphone-xr/yellow/01.webp | Bin .../phones/apple-iphone-xr/yellow/02.webp | Bin .../phones/apple-iphone-xr/yellow/03.webp | Bin .../phones/apple-iphone-xr/yellow/04.webp | Bin .../phones/apple-iphone-xs-max/gold/00.webp | Bin .../phones/apple-iphone-xs-max/gold/01.webp | Bin .../phones/apple-iphone-xs-max/gold/02.webp | Bin .../phones/apple-iphone-xs-max/gold/03.webp | Bin .../phones/apple-iphone-xs-max/gold/04.webp | Bin .../phones/apple-iphone-xs-max/silver/00.webp | Bin .../phones/apple-iphone-xs-max/silver/01.webp | Bin .../phones/apple-iphone-xs-max/silver/02.webp | Bin .../phones/apple-iphone-xs-max/silver/03.webp | Bin .../phones/apple-iphone-xs-max/silver/04.webp | Bin .../apple-iphone-xs-max/spacegray/00.webp | Bin .../apple-iphone-xs-max/spacegray/01.webp | Bin .../apple-iphone-xs-max/spacegray/02.webp | Bin .../apple-iphone-xs-max/spacegray/03.webp | Bin .../apple-iphone-xs-max/spacegray/04.webp | Bin .../phones/apple-iphone-xs/gold/00.webp | Bin .../phones/apple-iphone-xs/gold/01.webp | Bin .../phones/apple-iphone-xs/gold/02.webp | Bin .../phones/apple-iphone-xs/gold/03.webp | Bin .../phones/apple-iphone-xs/gold/04.webp | Bin .../phones/apple-iphone-xs/spacegray/00.webp | Bin .../phones/apple-iphone-xs/spacegray/01.webp | Bin .../phones/apple-iphone-xs/spacegray/02.webp | Bin .../phones/apple-iphone-xs/spacegray/03.webp | Bin .../phones/apple-iphone-xs/spacegray/04.webp | Bin .../{img => imgClosed}/picthree.bdd2e0fc.png | Bin .../{img => imgClosed}/product-not-found.png | Bin .../tablets/apple-ipad-10-2-2020/gold/00.webp | Bin .../tablets/apple-ipad-10-2-2020/gold/01.webp | Bin .../tablets/apple-ipad-10-2-2020/gold/02.webp | Bin .../tablets/apple-ipad-10-2-2020/gold/03.webp | Bin .../apple-ipad-10-2-2020/silver/00.webp | Bin .../apple-ipad-10-2-2020/silver/01.webp | Bin .../apple-ipad-10-2-2020/silver/02.webp | Bin .../apple-ipad-10-2-2020/silver/03.webp | Bin .../apple-ipad-10-2-2020/spacegray/00.webp | Bin .../apple-ipad-10-2-2020/spacegray/01.webp | Bin .../apple-ipad-10-2-2020/spacegray/02.webp | Bin .../apple-ipad-10-2-2020/spacegray/03.webp | Bin .../apple-ipad-air-4th-gen/green/00.webp | Bin .../apple-ipad-air-4th-gen/green/02.webp | Bin .../apple-ipad-air-4th-gen/green/03.webp | Bin .../apple-ipad-air-4th-gen/green/04.webp | Bin .../apple-ipad-air-4th-gen/rose-gold/00.webp | Bin .../apple-ipad-air-4th-gen/rose-gold/01.webp | Bin .../apple-ipad-air-4th-gen/rose-gold/02.webp | Bin .../apple-ipad-air-4th-gen/rose-gold/03.webp | Bin .../apple-ipad-air-4th-gen/silver/00.webp | Bin .../apple-ipad-air-4th-gen/silver/01.webp | Bin .../apple-ipad-air-4th-gen/silver/02.webp | Bin .../apple-ipad-air-4th-gen/silver/03.webp | Bin .../apple-ipad-air-4th-gen/sky-blue/00.webp | Bin .../apple-ipad-air-4th-gen/sky-blue/01.webp | Bin .../apple-ipad-air-4th-gen/sky-blue/02.webp | Bin .../apple-ipad-air-4th-gen/sky-blue/03.webp | Bin .../apple-ipad-mini-5th-gen/gold/00.webp | Bin .../apple-ipad-mini-5th-gen/gold/01.webp | Bin .../apple-ipad-mini-5th-gen/silver/00.webp | Bin .../apple-ipad-mini-5th-gen/silver/01.webp | Bin .../apple-ipad-mini-5th-gen/spacegray/00.webp | Bin .../apple-ipad-mini-5th-gen/spacegray/01.webp | Bin .../apple-ipad-mini-6th-gen/pink/00.webp | Bin .../apple-ipad-mini-6th-gen/pink/01.webp | Bin .../apple-ipad-mini-6th-gen/pink/02.webp | Bin .../apple-ipad-mini-6th-gen/spacegray/00.webp | Bin .../apple-ipad-mini-6th-gen/spacegray/01.webp | Bin .../apple-ipad-mini-6th-gen/spacegray/02.webp | Bin .../apple-ipad-mini-6th-gen/starlight/00.webp | Bin .../apple-ipad-mini-6th-gen/starlight/01.webp | Bin .../apple-ipad-mini-6th-gen/starlight/02.webp | Bin .../apple-ipad-pro-11-2021/silver/00.webp | Bin .../apple-ipad-pro-11-2021/silver/01.webp | Bin .../apple-ipad-pro-11-2021/silver/02.webp | Bin .../apple-ipad-pro-11-2021/spacegray/00.webp | Bin .../apple-ipad-pro-11-2021/spacegray/01.webp | Bin .../apple-ipad-pro-11-2021/spacegray/02.webp | Bin src/Layout/Layout.scss | 17 +- src/Layout/Layout.tsx | 2 +- src/components/CartItem/CartItem.scss | 57 ++++--- src/components/CartItem/CartItem.tsx | 20 ++- .../PicturesSlider/PicturesSlider.tsx | 11 +- .../ProductContentTop/ProductContentTop.tsx | 14 +- .../ShopByCategory/ShopByCategory.tsx | 12 +- src/context/GlobalContext.tsx | 31 ++++ .../ShoppingCartPage/ShoppingCartPage.tsx | 2 +- src/routes/{Routes.tsx => AppRoutes.tsx} | 0 src/routes/index.ts | 2 +- src/shared/Footer/Footer.scss | 3 - src/shared/Header/Header.scss | 4 +- src/shared/Header/Header.tsx | 6 +- src/shared/ProductCard/ProductCard.scss | 35 +++- src/shared/ProductCard/ProductCard.tsx | 151 +++++++++++++++++- src/utils/api.ts | 64 +++++++- tsconfig.json | 3 +- 350 files changed, 377 insertions(+), 57 deletions(-) rename public/{img => imgClosed}/accessories/apple-watch-se/gold/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/gold/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/gold/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/silver/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/silver/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/silver/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/space-gray/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/space-gray/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-se/space-gray/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/gold/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/gold/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/gold/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/silver/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/silver/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/silver/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/space-gray/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/space-gray/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-3/space-gray/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/gold/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/gold/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/gold/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/silver/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/silver/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/silver/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/space-gray/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/space-gray/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-4/space-gray/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/gold/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/gold/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/gold/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/silver/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/silver/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/silver/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/space-gray/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/space-gray/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-5/space-gray/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/blue/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/blue/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/blue/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/gold/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/gold/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/gold/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/red/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/red/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/red/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/silver/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/silver/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/silver/02.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/space-gray/00.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/space-gray/01.webp (100%) rename public/{img => imgClosed}/accessories/apple-watch-series-6/space-gray/02.webp (100%) rename public/{img => imgClosed}/banner-accessories.png (100%) rename public/{img => imgClosed}/banner-phones.png (100%) rename public/{img => imgClosed}/banner-tablets.png (100%) rename public/{img => imgClosed}/cart-is-empty.png (100%) rename public/{img => imgClosed}/category-accessories.png (100%) rename public/{img => imgClosed}/category-accessories.webp (100%) rename public/{img => imgClosed}/category-phones.png (100%) rename public/{img => imgClosed}/category-phones.webp (100%) rename public/{img => imgClosed}/category-tablets.png (100%) rename public/{img => imgClosed}/category-tablets.webp (100%) rename public/{img => imgClosed}/page-not-found.png (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/midnightgreen/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/midnightgreen/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/midnightgreen/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/midnightgreen/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/spacegray/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/spacegray/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro-max/spacegray/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/midnightgreen/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/midnightgreen/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/midnightgreen/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/midnightgreen/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/spacegray/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/spacegray/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11-pro/spacegray/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/black/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/black/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/black/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/black/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/black/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/green/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/green/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/green/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/green/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/green/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/purple/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/purple/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/purple/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/purple/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/purple/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/red/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/red/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/red/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/red/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/red/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/white/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/white/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/white/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/white/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/white/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/yellow/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/yellow/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/yellow/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/yellow/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-11/yellow/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/black/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/black/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/black/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/black/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/purple/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/purple/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/purple/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/purple/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/red/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/red/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/red/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/red/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/white/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/white/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/white/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-12/white/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/blue/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/blue/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/blue/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/blue/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/midnight/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/midnight/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/midnight/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/midnight/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/pink/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/pink/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/pink/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/pink/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/white/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/white/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/white/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-mini/white/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/graphite/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/graphite/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/graphite/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/graphite/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/sierrablue/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/sierrablue/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/sierrablue/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-13-pro-max/sierrablue/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/gold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/spaceblack/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/spaceblack/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/spaceblack/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/spaceblack/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14-pro/spaceblack/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/midnight/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/midnight/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/midnight/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/midnight/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/midnight/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/purple/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/purple/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/purple/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/purple/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/purple/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/yellow/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/yellow/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/yellow/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/yellow/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-14/yellow/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/black/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/black/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/black/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/black/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/black/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/gold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/rosegold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/rosegold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/rosegold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/rosegold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/rosegold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/silver/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7-plus/silver/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/black/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/black/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/black/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/black/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/black/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/gold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/rosegold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/rosegold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/rosegold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/rosegold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/rosegold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/silver/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-7/silver/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/silver/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/spacegray/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/spacegray/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/spacegray/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-8/spacegray/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/coral/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/coral/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/coral/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/red/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/red/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/red/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/red/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/red/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/white/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/white/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/white/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/white/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/yellow/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/yellow/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/yellow/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/yellow/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xr/yellow/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/gold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/silver/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/silver/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/silver/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/silver/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/silver/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/spacegray/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/spacegray/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/spacegray/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/spacegray/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs-max/spacegray/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/gold/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/gold/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/gold/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/gold/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/gold/04.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/spacegray/00.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/spacegray/01.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/spacegray/02.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/spacegray/03.webp (100%) rename public/{img => imgClosed}/phones/apple-iphone-xs/spacegray/04.webp (100%) rename public/{img => imgClosed}/picthree.bdd2e0fc.png (100%) rename public/{img => imgClosed}/product-not-found.png (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/gold/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/gold/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/gold/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/gold/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/silver/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/silver/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/silver/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/silver/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/spacegray/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/spacegray/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/spacegray/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-10-2-2020/spacegray/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/green/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/green/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/green/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/green/04.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/silver/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/silver/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/silver/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/silver/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/gold/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/gold/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/silver/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/silver/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/pink/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/pink/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/pink/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/starlight/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/starlight/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-mini-6th-gen/starlight/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/silver/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/silver/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/silver/02.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/spacegray/00.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/spacegray/01.webp (100%) rename public/{img => imgClosed}/tablets/apple-ipad-pro-11-2021/spacegray/02.webp (100%) rename src/routes/{Routes.tsx => AppRoutes.tsx} (100%) diff --git a/public/img/accessories/apple-watch-se/gold/00.webp b/public/imgClosed/accessories/apple-watch-se/gold/00.webp similarity index 100% rename from public/img/accessories/apple-watch-se/gold/00.webp rename to public/imgClosed/accessories/apple-watch-se/gold/00.webp diff --git a/public/img/accessories/apple-watch-se/gold/01.webp b/public/imgClosed/accessories/apple-watch-se/gold/01.webp similarity index 100% rename from public/img/accessories/apple-watch-se/gold/01.webp rename to public/imgClosed/accessories/apple-watch-se/gold/01.webp diff --git a/public/img/accessories/apple-watch-se/gold/02.webp b/public/imgClosed/accessories/apple-watch-se/gold/02.webp similarity index 100% rename from public/img/accessories/apple-watch-se/gold/02.webp rename to public/imgClosed/accessories/apple-watch-se/gold/02.webp diff --git a/public/img/accessories/apple-watch-se/silver/00.webp b/public/imgClosed/accessories/apple-watch-se/silver/00.webp similarity index 100% rename from public/img/accessories/apple-watch-se/silver/00.webp rename to public/imgClosed/accessories/apple-watch-se/silver/00.webp diff --git a/public/img/accessories/apple-watch-se/silver/01.webp b/public/imgClosed/accessories/apple-watch-se/silver/01.webp similarity index 100% rename from public/img/accessories/apple-watch-se/silver/01.webp rename to public/imgClosed/accessories/apple-watch-se/silver/01.webp diff --git a/public/img/accessories/apple-watch-se/silver/02.webp b/public/imgClosed/accessories/apple-watch-se/silver/02.webp similarity index 100% rename from public/img/accessories/apple-watch-se/silver/02.webp rename to public/imgClosed/accessories/apple-watch-se/silver/02.webp diff --git a/public/img/accessories/apple-watch-se/space-gray/00.webp b/public/imgClosed/accessories/apple-watch-se/space-gray/00.webp similarity index 100% rename from public/img/accessories/apple-watch-se/space-gray/00.webp rename to public/imgClosed/accessories/apple-watch-se/space-gray/00.webp diff --git a/public/img/accessories/apple-watch-se/space-gray/01.webp b/public/imgClosed/accessories/apple-watch-se/space-gray/01.webp similarity index 100% rename from public/img/accessories/apple-watch-se/space-gray/01.webp rename to public/imgClosed/accessories/apple-watch-se/space-gray/01.webp diff --git a/public/img/accessories/apple-watch-se/space-gray/02.webp b/public/imgClosed/accessories/apple-watch-se/space-gray/02.webp similarity index 100% rename from public/img/accessories/apple-watch-se/space-gray/02.webp rename to public/imgClosed/accessories/apple-watch-se/space-gray/02.webp diff --git a/public/img/accessories/apple-watch-series-3/gold/00.webp b/public/imgClosed/accessories/apple-watch-series-3/gold/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/gold/00.webp rename to public/imgClosed/accessories/apple-watch-series-3/gold/00.webp diff --git a/public/img/accessories/apple-watch-series-3/gold/01.webp b/public/imgClosed/accessories/apple-watch-series-3/gold/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/gold/01.webp rename to public/imgClosed/accessories/apple-watch-series-3/gold/01.webp diff --git a/public/img/accessories/apple-watch-series-3/gold/02.webp b/public/imgClosed/accessories/apple-watch-series-3/gold/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/gold/02.webp rename to public/imgClosed/accessories/apple-watch-series-3/gold/02.webp diff --git a/public/img/accessories/apple-watch-series-3/silver/00.webp b/public/imgClosed/accessories/apple-watch-series-3/silver/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/silver/00.webp rename to public/imgClosed/accessories/apple-watch-series-3/silver/00.webp diff --git a/public/img/accessories/apple-watch-series-3/silver/01.webp b/public/imgClosed/accessories/apple-watch-series-3/silver/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/silver/01.webp rename to public/imgClosed/accessories/apple-watch-series-3/silver/01.webp diff --git a/public/img/accessories/apple-watch-series-3/silver/02.webp b/public/imgClosed/accessories/apple-watch-series-3/silver/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/silver/02.webp rename to public/imgClosed/accessories/apple-watch-series-3/silver/02.webp diff --git a/public/img/accessories/apple-watch-series-3/space-gray/00.webp b/public/imgClosed/accessories/apple-watch-series-3/space-gray/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/space-gray/00.webp rename to public/imgClosed/accessories/apple-watch-series-3/space-gray/00.webp diff --git a/public/img/accessories/apple-watch-series-3/space-gray/01.webp b/public/imgClosed/accessories/apple-watch-series-3/space-gray/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/space-gray/01.webp rename to public/imgClosed/accessories/apple-watch-series-3/space-gray/01.webp diff --git a/public/img/accessories/apple-watch-series-3/space-gray/02.webp b/public/imgClosed/accessories/apple-watch-series-3/space-gray/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-3/space-gray/02.webp rename to public/imgClosed/accessories/apple-watch-series-3/space-gray/02.webp diff --git a/public/img/accessories/apple-watch-series-4/gold/00.webp b/public/imgClosed/accessories/apple-watch-series-4/gold/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/gold/00.webp rename to public/imgClosed/accessories/apple-watch-series-4/gold/00.webp diff --git a/public/img/accessories/apple-watch-series-4/gold/01.webp b/public/imgClosed/accessories/apple-watch-series-4/gold/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/gold/01.webp rename to public/imgClosed/accessories/apple-watch-series-4/gold/01.webp diff --git a/public/img/accessories/apple-watch-series-4/gold/02.webp b/public/imgClosed/accessories/apple-watch-series-4/gold/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/gold/02.webp rename to public/imgClosed/accessories/apple-watch-series-4/gold/02.webp diff --git a/public/img/accessories/apple-watch-series-4/silver/00.webp b/public/imgClosed/accessories/apple-watch-series-4/silver/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/silver/00.webp rename to public/imgClosed/accessories/apple-watch-series-4/silver/00.webp diff --git a/public/img/accessories/apple-watch-series-4/silver/01.webp b/public/imgClosed/accessories/apple-watch-series-4/silver/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/silver/01.webp rename to public/imgClosed/accessories/apple-watch-series-4/silver/01.webp diff --git a/public/img/accessories/apple-watch-series-4/silver/02.webp b/public/imgClosed/accessories/apple-watch-series-4/silver/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/silver/02.webp rename to public/imgClosed/accessories/apple-watch-series-4/silver/02.webp diff --git a/public/img/accessories/apple-watch-series-4/space-gray/00.webp b/public/imgClosed/accessories/apple-watch-series-4/space-gray/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/space-gray/00.webp rename to public/imgClosed/accessories/apple-watch-series-4/space-gray/00.webp diff --git a/public/img/accessories/apple-watch-series-4/space-gray/01.webp b/public/imgClosed/accessories/apple-watch-series-4/space-gray/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/space-gray/01.webp rename to public/imgClosed/accessories/apple-watch-series-4/space-gray/01.webp diff --git a/public/img/accessories/apple-watch-series-4/space-gray/02.webp b/public/imgClosed/accessories/apple-watch-series-4/space-gray/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-4/space-gray/02.webp rename to public/imgClosed/accessories/apple-watch-series-4/space-gray/02.webp diff --git a/public/img/accessories/apple-watch-series-5/gold/00.webp b/public/imgClosed/accessories/apple-watch-series-5/gold/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/gold/00.webp rename to public/imgClosed/accessories/apple-watch-series-5/gold/00.webp diff --git a/public/img/accessories/apple-watch-series-5/gold/01.webp b/public/imgClosed/accessories/apple-watch-series-5/gold/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/gold/01.webp rename to public/imgClosed/accessories/apple-watch-series-5/gold/01.webp diff --git a/public/img/accessories/apple-watch-series-5/gold/02.webp b/public/imgClosed/accessories/apple-watch-series-5/gold/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/gold/02.webp rename to public/imgClosed/accessories/apple-watch-series-5/gold/02.webp diff --git a/public/img/accessories/apple-watch-series-5/silver/00.webp b/public/imgClosed/accessories/apple-watch-series-5/silver/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/silver/00.webp rename to public/imgClosed/accessories/apple-watch-series-5/silver/00.webp diff --git a/public/img/accessories/apple-watch-series-5/silver/01.webp b/public/imgClosed/accessories/apple-watch-series-5/silver/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/silver/01.webp rename to public/imgClosed/accessories/apple-watch-series-5/silver/01.webp diff --git a/public/img/accessories/apple-watch-series-5/silver/02.webp b/public/imgClosed/accessories/apple-watch-series-5/silver/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/silver/02.webp rename to public/imgClosed/accessories/apple-watch-series-5/silver/02.webp diff --git a/public/img/accessories/apple-watch-series-5/space-gray/00.webp b/public/imgClosed/accessories/apple-watch-series-5/space-gray/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/space-gray/00.webp rename to public/imgClosed/accessories/apple-watch-series-5/space-gray/00.webp diff --git a/public/img/accessories/apple-watch-series-5/space-gray/01.webp b/public/imgClosed/accessories/apple-watch-series-5/space-gray/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/space-gray/01.webp rename to public/imgClosed/accessories/apple-watch-series-5/space-gray/01.webp diff --git a/public/img/accessories/apple-watch-series-5/space-gray/02.webp b/public/imgClosed/accessories/apple-watch-series-5/space-gray/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-5/space-gray/02.webp rename to public/imgClosed/accessories/apple-watch-series-5/space-gray/02.webp diff --git a/public/img/accessories/apple-watch-series-6/blue/00.webp b/public/imgClosed/accessories/apple-watch-series-6/blue/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/blue/00.webp rename to public/imgClosed/accessories/apple-watch-series-6/blue/00.webp diff --git a/public/img/accessories/apple-watch-series-6/blue/01.webp b/public/imgClosed/accessories/apple-watch-series-6/blue/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/blue/01.webp rename to public/imgClosed/accessories/apple-watch-series-6/blue/01.webp diff --git a/public/img/accessories/apple-watch-series-6/blue/02.webp b/public/imgClosed/accessories/apple-watch-series-6/blue/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/blue/02.webp rename to public/imgClosed/accessories/apple-watch-series-6/blue/02.webp diff --git a/public/img/accessories/apple-watch-series-6/gold/00.webp b/public/imgClosed/accessories/apple-watch-series-6/gold/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/gold/00.webp rename to public/imgClosed/accessories/apple-watch-series-6/gold/00.webp diff --git a/public/img/accessories/apple-watch-series-6/gold/01.webp b/public/imgClosed/accessories/apple-watch-series-6/gold/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/gold/01.webp rename to public/imgClosed/accessories/apple-watch-series-6/gold/01.webp diff --git a/public/img/accessories/apple-watch-series-6/gold/02.webp b/public/imgClosed/accessories/apple-watch-series-6/gold/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/gold/02.webp rename to public/imgClosed/accessories/apple-watch-series-6/gold/02.webp diff --git a/public/img/accessories/apple-watch-series-6/red/00.webp b/public/imgClosed/accessories/apple-watch-series-6/red/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/red/00.webp rename to public/imgClosed/accessories/apple-watch-series-6/red/00.webp diff --git a/public/img/accessories/apple-watch-series-6/red/01.webp b/public/imgClosed/accessories/apple-watch-series-6/red/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/red/01.webp rename to public/imgClosed/accessories/apple-watch-series-6/red/01.webp diff --git a/public/img/accessories/apple-watch-series-6/red/02.webp b/public/imgClosed/accessories/apple-watch-series-6/red/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/red/02.webp rename to public/imgClosed/accessories/apple-watch-series-6/red/02.webp diff --git a/public/img/accessories/apple-watch-series-6/silver/00.webp b/public/imgClosed/accessories/apple-watch-series-6/silver/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/silver/00.webp rename to public/imgClosed/accessories/apple-watch-series-6/silver/00.webp diff --git a/public/img/accessories/apple-watch-series-6/silver/01.webp b/public/imgClosed/accessories/apple-watch-series-6/silver/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/silver/01.webp rename to public/imgClosed/accessories/apple-watch-series-6/silver/01.webp diff --git a/public/img/accessories/apple-watch-series-6/silver/02.webp b/public/imgClosed/accessories/apple-watch-series-6/silver/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/silver/02.webp rename to public/imgClosed/accessories/apple-watch-series-6/silver/02.webp diff --git a/public/img/accessories/apple-watch-series-6/space-gray/00.webp b/public/imgClosed/accessories/apple-watch-series-6/space-gray/00.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/space-gray/00.webp rename to public/imgClosed/accessories/apple-watch-series-6/space-gray/00.webp diff --git a/public/img/accessories/apple-watch-series-6/space-gray/01.webp b/public/imgClosed/accessories/apple-watch-series-6/space-gray/01.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/space-gray/01.webp rename to public/imgClosed/accessories/apple-watch-series-6/space-gray/01.webp diff --git a/public/img/accessories/apple-watch-series-6/space-gray/02.webp b/public/imgClosed/accessories/apple-watch-series-6/space-gray/02.webp similarity index 100% rename from public/img/accessories/apple-watch-series-6/space-gray/02.webp rename to public/imgClosed/accessories/apple-watch-series-6/space-gray/02.webp diff --git a/public/img/banner-accessories.png b/public/imgClosed/banner-accessories.png similarity index 100% rename from public/img/banner-accessories.png rename to public/imgClosed/banner-accessories.png diff --git a/public/img/banner-phones.png b/public/imgClosed/banner-phones.png similarity index 100% rename from public/img/banner-phones.png rename to public/imgClosed/banner-phones.png diff --git a/public/img/banner-tablets.png b/public/imgClosed/banner-tablets.png similarity index 100% rename from public/img/banner-tablets.png rename to public/imgClosed/banner-tablets.png diff --git a/public/img/cart-is-empty.png b/public/imgClosed/cart-is-empty.png similarity index 100% rename from public/img/cart-is-empty.png rename to public/imgClosed/cart-is-empty.png diff --git a/public/img/category-accessories.png b/public/imgClosed/category-accessories.png similarity index 100% rename from public/img/category-accessories.png rename to public/imgClosed/category-accessories.png diff --git a/public/img/category-accessories.webp b/public/imgClosed/category-accessories.webp similarity index 100% rename from public/img/category-accessories.webp rename to public/imgClosed/category-accessories.webp diff --git a/public/img/category-phones.png b/public/imgClosed/category-phones.png similarity index 100% rename from public/img/category-phones.png rename to public/imgClosed/category-phones.png diff --git a/public/img/category-phones.webp b/public/imgClosed/category-phones.webp similarity index 100% rename from public/img/category-phones.webp rename to public/imgClosed/category-phones.webp diff --git a/public/img/category-tablets.png b/public/imgClosed/category-tablets.png similarity index 100% rename from public/img/category-tablets.png rename to public/imgClosed/category-tablets.png diff --git a/public/img/category-tablets.webp b/public/imgClosed/category-tablets.webp similarity index 100% rename from public/img/category-tablets.webp rename to public/imgClosed/category-tablets.webp diff --git a/public/img/page-not-found.png b/public/imgClosed/page-not-found.png similarity index 100% rename from public/img/page-not-found.png rename to public/imgClosed/page-not-found.png diff --git a/public/img/phones/apple-iphone-11-pro-max/gold/00.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/gold/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/gold/00.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/gold/01.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/gold/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/gold/01.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/gold/02.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/gold/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/gold/02.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/00.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/01.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/02.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/midnightgreen/03.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/midnightgreen/03.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/midnightgreen/03.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/silver/00.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/silver/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/silver/00.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/silver/01.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/silver/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/silver/01.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/silver/02.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/silver/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/silver/02.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/spacegray/00.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/spacegray/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/00.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/spacegray/01.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/spacegray/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/01.webp diff --git a/public/img/phones/apple-iphone-11-pro-max/spacegray/02.webp b/public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro-max/spacegray/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro-max/spacegray/02.webp diff --git a/public/img/phones/apple-iphone-11-pro/gold/00.webp b/public/imgClosed/phones/apple-iphone-11-pro/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/gold/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro/gold/00.webp diff --git a/public/img/phones/apple-iphone-11-pro/gold/01.webp b/public/imgClosed/phones/apple-iphone-11-pro/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/gold/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro/gold/01.webp diff --git a/public/img/phones/apple-iphone-11-pro/gold/02.webp b/public/imgClosed/phones/apple-iphone-11-pro/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/gold/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro/gold/02.webp diff --git a/public/img/phones/apple-iphone-11-pro/midnightgreen/00.webp b/public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/midnightgreen/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/00.webp diff --git a/public/img/phones/apple-iphone-11-pro/midnightgreen/01.webp b/public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/midnightgreen/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/01.webp diff --git a/public/img/phones/apple-iphone-11-pro/midnightgreen/02.webp b/public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/midnightgreen/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/02.webp diff --git a/public/img/phones/apple-iphone-11-pro/midnightgreen/03.webp b/public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/midnightgreen/03.webp rename to public/imgClosed/phones/apple-iphone-11-pro/midnightgreen/03.webp diff --git a/public/img/phones/apple-iphone-11-pro/silver/00.webp b/public/imgClosed/phones/apple-iphone-11-pro/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/silver/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro/silver/00.webp diff --git a/public/img/phones/apple-iphone-11-pro/silver/01.webp b/public/imgClosed/phones/apple-iphone-11-pro/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/silver/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro/silver/01.webp diff --git a/public/img/phones/apple-iphone-11-pro/silver/02.webp b/public/imgClosed/phones/apple-iphone-11-pro/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/silver/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro/silver/02.webp diff --git a/public/img/phones/apple-iphone-11-pro/spacegray/00.webp b/public/imgClosed/phones/apple-iphone-11-pro/spacegray/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/spacegray/00.webp rename to public/imgClosed/phones/apple-iphone-11-pro/spacegray/00.webp diff --git a/public/img/phones/apple-iphone-11-pro/spacegray/01.webp b/public/imgClosed/phones/apple-iphone-11-pro/spacegray/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/spacegray/01.webp rename to public/imgClosed/phones/apple-iphone-11-pro/spacegray/01.webp diff --git a/public/img/phones/apple-iphone-11-pro/spacegray/02.webp b/public/imgClosed/phones/apple-iphone-11-pro/spacegray/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11-pro/spacegray/02.webp rename to public/imgClosed/phones/apple-iphone-11-pro/spacegray/02.webp diff --git a/public/img/phones/apple-iphone-11/black/00.webp b/public/imgClosed/phones/apple-iphone-11/black/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/black/00.webp rename to public/imgClosed/phones/apple-iphone-11/black/00.webp diff --git a/public/img/phones/apple-iphone-11/black/01.webp b/public/imgClosed/phones/apple-iphone-11/black/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/black/01.webp rename to public/imgClosed/phones/apple-iphone-11/black/01.webp diff --git a/public/img/phones/apple-iphone-11/black/02.webp b/public/imgClosed/phones/apple-iphone-11/black/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/black/02.webp rename to public/imgClosed/phones/apple-iphone-11/black/02.webp diff --git a/public/img/phones/apple-iphone-11/black/03.webp b/public/imgClosed/phones/apple-iphone-11/black/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/black/03.webp rename to public/imgClosed/phones/apple-iphone-11/black/03.webp diff --git a/public/img/phones/apple-iphone-11/black/04.webp b/public/imgClosed/phones/apple-iphone-11/black/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/black/04.webp rename to public/imgClosed/phones/apple-iphone-11/black/04.webp diff --git a/public/img/phones/apple-iphone-11/green/00.webp b/public/imgClosed/phones/apple-iphone-11/green/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/green/00.webp rename to public/imgClosed/phones/apple-iphone-11/green/00.webp diff --git a/public/img/phones/apple-iphone-11/green/01.webp b/public/imgClosed/phones/apple-iphone-11/green/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/green/01.webp rename to public/imgClosed/phones/apple-iphone-11/green/01.webp diff --git a/public/img/phones/apple-iphone-11/green/02.webp b/public/imgClosed/phones/apple-iphone-11/green/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/green/02.webp rename to public/imgClosed/phones/apple-iphone-11/green/02.webp diff --git a/public/img/phones/apple-iphone-11/green/03.webp b/public/imgClosed/phones/apple-iphone-11/green/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/green/03.webp rename to public/imgClosed/phones/apple-iphone-11/green/03.webp diff --git a/public/img/phones/apple-iphone-11/green/04.webp b/public/imgClosed/phones/apple-iphone-11/green/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/green/04.webp rename to public/imgClosed/phones/apple-iphone-11/green/04.webp diff --git a/public/img/phones/apple-iphone-11/purple/00.webp b/public/imgClosed/phones/apple-iphone-11/purple/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/purple/00.webp rename to public/imgClosed/phones/apple-iphone-11/purple/00.webp diff --git a/public/img/phones/apple-iphone-11/purple/01.webp b/public/imgClosed/phones/apple-iphone-11/purple/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/purple/01.webp rename to public/imgClosed/phones/apple-iphone-11/purple/01.webp diff --git a/public/img/phones/apple-iphone-11/purple/02.webp b/public/imgClosed/phones/apple-iphone-11/purple/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/purple/02.webp rename to public/imgClosed/phones/apple-iphone-11/purple/02.webp diff --git a/public/img/phones/apple-iphone-11/purple/03.webp b/public/imgClosed/phones/apple-iphone-11/purple/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/purple/03.webp rename to public/imgClosed/phones/apple-iphone-11/purple/03.webp diff --git a/public/img/phones/apple-iphone-11/purple/04.webp b/public/imgClosed/phones/apple-iphone-11/purple/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/purple/04.webp rename to public/imgClosed/phones/apple-iphone-11/purple/04.webp diff --git a/public/img/phones/apple-iphone-11/red/00.webp b/public/imgClosed/phones/apple-iphone-11/red/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/red/00.webp rename to public/imgClosed/phones/apple-iphone-11/red/00.webp diff --git a/public/img/phones/apple-iphone-11/red/01.webp b/public/imgClosed/phones/apple-iphone-11/red/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/red/01.webp rename to public/imgClosed/phones/apple-iphone-11/red/01.webp diff --git a/public/img/phones/apple-iphone-11/red/02.webp b/public/imgClosed/phones/apple-iphone-11/red/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/red/02.webp rename to public/imgClosed/phones/apple-iphone-11/red/02.webp diff --git a/public/img/phones/apple-iphone-11/red/03.webp b/public/imgClosed/phones/apple-iphone-11/red/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/red/03.webp rename to public/imgClosed/phones/apple-iphone-11/red/03.webp diff --git a/public/img/phones/apple-iphone-11/red/04.webp b/public/imgClosed/phones/apple-iphone-11/red/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/red/04.webp rename to public/imgClosed/phones/apple-iphone-11/red/04.webp diff --git a/public/img/phones/apple-iphone-11/white/00.webp b/public/imgClosed/phones/apple-iphone-11/white/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/white/00.webp rename to public/imgClosed/phones/apple-iphone-11/white/00.webp diff --git a/public/img/phones/apple-iphone-11/white/01.webp b/public/imgClosed/phones/apple-iphone-11/white/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/white/01.webp rename to public/imgClosed/phones/apple-iphone-11/white/01.webp diff --git a/public/img/phones/apple-iphone-11/white/02.webp b/public/imgClosed/phones/apple-iphone-11/white/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/white/02.webp rename to public/imgClosed/phones/apple-iphone-11/white/02.webp diff --git a/public/img/phones/apple-iphone-11/white/03.webp b/public/imgClosed/phones/apple-iphone-11/white/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/white/03.webp rename to public/imgClosed/phones/apple-iphone-11/white/03.webp diff --git a/public/img/phones/apple-iphone-11/white/04.webp b/public/imgClosed/phones/apple-iphone-11/white/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/white/04.webp rename to public/imgClosed/phones/apple-iphone-11/white/04.webp diff --git a/public/img/phones/apple-iphone-11/yellow/00.webp b/public/imgClosed/phones/apple-iphone-11/yellow/00.webp similarity index 100% rename from public/img/phones/apple-iphone-11/yellow/00.webp rename to public/imgClosed/phones/apple-iphone-11/yellow/00.webp diff --git a/public/img/phones/apple-iphone-11/yellow/01.webp b/public/imgClosed/phones/apple-iphone-11/yellow/01.webp similarity index 100% rename from public/img/phones/apple-iphone-11/yellow/01.webp rename to public/imgClosed/phones/apple-iphone-11/yellow/01.webp diff --git a/public/img/phones/apple-iphone-11/yellow/02.webp b/public/imgClosed/phones/apple-iphone-11/yellow/02.webp similarity index 100% rename from public/img/phones/apple-iphone-11/yellow/02.webp rename to public/imgClosed/phones/apple-iphone-11/yellow/02.webp diff --git a/public/img/phones/apple-iphone-11/yellow/03.webp b/public/imgClosed/phones/apple-iphone-11/yellow/03.webp similarity index 100% rename from public/img/phones/apple-iphone-11/yellow/03.webp rename to public/imgClosed/phones/apple-iphone-11/yellow/03.webp diff --git a/public/img/phones/apple-iphone-11/yellow/04.webp b/public/imgClosed/phones/apple-iphone-11/yellow/04.webp similarity index 100% rename from public/img/phones/apple-iphone-11/yellow/04.webp rename to public/imgClosed/phones/apple-iphone-11/yellow/04.webp diff --git a/public/img/phones/apple-iphone-12/black/00.webp b/public/imgClosed/phones/apple-iphone-12/black/00.webp similarity index 100% rename from public/img/phones/apple-iphone-12/black/00.webp rename to public/imgClosed/phones/apple-iphone-12/black/00.webp diff --git a/public/img/phones/apple-iphone-12/black/01.webp b/public/imgClosed/phones/apple-iphone-12/black/01.webp similarity index 100% rename from public/img/phones/apple-iphone-12/black/01.webp rename to public/imgClosed/phones/apple-iphone-12/black/01.webp diff --git a/public/img/phones/apple-iphone-12/black/02.webp b/public/imgClosed/phones/apple-iphone-12/black/02.webp similarity index 100% rename from public/img/phones/apple-iphone-12/black/02.webp rename to public/imgClosed/phones/apple-iphone-12/black/02.webp diff --git a/public/img/phones/apple-iphone-12/black/03.webp b/public/imgClosed/phones/apple-iphone-12/black/03.webp similarity index 100% rename from public/img/phones/apple-iphone-12/black/03.webp rename to public/imgClosed/phones/apple-iphone-12/black/03.webp diff --git a/public/img/phones/apple-iphone-12/purple/00.webp b/public/imgClosed/phones/apple-iphone-12/purple/00.webp similarity index 100% rename from public/img/phones/apple-iphone-12/purple/00.webp rename to public/imgClosed/phones/apple-iphone-12/purple/00.webp diff --git a/public/img/phones/apple-iphone-12/purple/01.webp b/public/imgClosed/phones/apple-iphone-12/purple/01.webp similarity index 100% rename from public/img/phones/apple-iphone-12/purple/01.webp rename to public/imgClosed/phones/apple-iphone-12/purple/01.webp diff --git a/public/img/phones/apple-iphone-12/purple/02.webp b/public/imgClosed/phones/apple-iphone-12/purple/02.webp similarity index 100% rename from public/img/phones/apple-iphone-12/purple/02.webp rename to public/imgClosed/phones/apple-iphone-12/purple/02.webp diff --git a/public/img/phones/apple-iphone-12/purple/03.webp b/public/imgClosed/phones/apple-iphone-12/purple/03.webp similarity index 100% rename from public/img/phones/apple-iphone-12/purple/03.webp rename to public/imgClosed/phones/apple-iphone-12/purple/03.webp diff --git a/public/img/phones/apple-iphone-12/red/00.webp b/public/imgClosed/phones/apple-iphone-12/red/00.webp similarity index 100% rename from public/img/phones/apple-iphone-12/red/00.webp rename to public/imgClosed/phones/apple-iphone-12/red/00.webp diff --git a/public/img/phones/apple-iphone-12/red/01.webp b/public/imgClosed/phones/apple-iphone-12/red/01.webp similarity index 100% rename from public/img/phones/apple-iphone-12/red/01.webp rename to public/imgClosed/phones/apple-iphone-12/red/01.webp diff --git a/public/img/phones/apple-iphone-12/red/02.webp b/public/imgClosed/phones/apple-iphone-12/red/02.webp similarity index 100% rename from public/img/phones/apple-iphone-12/red/02.webp rename to public/imgClosed/phones/apple-iphone-12/red/02.webp diff --git a/public/img/phones/apple-iphone-12/red/03.webp b/public/imgClosed/phones/apple-iphone-12/red/03.webp similarity index 100% rename from public/img/phones/apple-iphone-12/red/03.webp rename to public/imgClosed/phones/apple-iphone-12/red/03.webp diff --git a/public/img/phones/apple-iphone-12/white/00.webp b/public/imgClosed/phones/apple-iphone-12/white/00.webp similarity index 100% rename from public/img/phones/apple-iphone-12/white/00.webp rename to public/imgClosed/phones/apple-iphone-12/white/00.webp diff --git a/public/img/phones/apple-iphone-12/white/01.webp b/public/imgClosed/phones/apple-iphone-12/white/01.webp similarity index 100% rename from public/img/phones/apple-iphone-12/white/01.webp rename to public/imgClosed/phones/apple-iphone-12/white/01.webp diff --git a/public/img/phones/apple-iphone-12/white/03.webp b/public/imgClosed/phones/apple-iphone-12/white/03.webp similarity index 100% rename from public/img/phones/apple-iphone-12/white/03.webp rename to public/imgClosed/phones/apple-iphone-12/white/03.webp diff --git a/public/img/phones/apple-iphone-12/white/04.webp b/public/imgClosed/phones/apple-iphone-12/white/04.webp similarity index 100% rename from public/img/phones/apple-iphone-12/white/04.webp rename to public/imgClosed/phones/apple-iphone-12/white/04.webp diff --git a/public/img/phones/apple-iphone-13-mini/blue/00.webp b/public/imgClosed/phones/apple-iphone-13-mini/blue/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/blue/00.webp rename to public/imgClosed/phones/apple-iphone-13-mini/blue/00.webp diff --git a/public/img/phones/apple-iphone-13-mini/blue/01.webp b/public/imgClosed/phones/apple-iphone-13-mini/blue/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/blue/01.webp rename to public/imgClosed/phones/apple-iphone-13-mini/blue/01.webp diff --git a/public/img/phones/apple-iphone-13-mini/blue/02.webp b/public/imgClosed/phones/apple-iphone-13-mini/blue/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/blue/02.webp rename to public/imgClosed/phones/apple-iphone-13-mini/blue/02.webp diff --git a/public/img/phones/apple-iphone-13-mini/blue/03.webp b/public/imgClosed/phones/apple-iphone-13-mini/blue/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/blue/03.webp rename to public/imgClosed/phones/apple-iphone-13-mini/blue/03.webp diff --git a/public/img/phones/apple-iphone-13-mini/midnight/00.webp b/public/imgClosed/phones/apple-iphone-13-mini/midnight/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/midnight/00.webp rename to public/imgClosed/phones/apple-iphone-13-mini/midnight/00.webp diff --git a/public/img/phones/apple-iphone-13-mini/midnight/01.webp b/public/imgClosed/phones/apple-iphone-13-mini/midnight/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/midnight/01.webp rename to public/imgClosed/phones/apple-iphone-13-mini/midnight/01.webp diff --git a/public/img/phones/apple-iphone-13-mini/midnight/02.webp b/public/imgClosed/phones/apple-iphone-13-mini/midnight/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/midnight/02.webp rename to public/imgClosed/phones/apple-iphone-13-mini/midnight/02.webp diff --git a/public/img/phones/apple-iphone-13-mini/midnight/03.webp b/public/imgClosed/phones/apple-iphone-13-mini/midnight/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/midnight/03.webp rename to public/imgClosed/phones/apple-iphone-13-mini/midnight/03.webp diff --git a/public/img/phones/apple-iphone-13-mini/pink/00.webp b/public/imgClosed/phones/apple-iphone-13-mini/pink/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/pink/00.webp rename to public/imgClosed/phones/apple-iphone-13-mini/pink/00.webp diff --git a/public/img/phones/apple-iphone-13-mini/pink/01.webp b/public/imgClosed/phones/apple-iphone-13-mini/pink/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/pink/01.webp rename to public/imgClosed/phones/apple-iphone-13-mini/pink/01.webp diff --git a/public/img/phones/apple-iphone-13-mini/pink/02.webp b/public/imgClosed/phones/apple-iphone-13-mini/pink/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/pink/02.webp rename to public/imgClosed/phones/apple-iphone-13-mini/pink/02.webp diff --git a/public/img/phones/apple-iphone-13-mini/pink/03.webp b/public/imgClosed/phones/apple-iphone-13-mini/pink/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/pink/03.webp rename to public/imgClosed/phones/apple-iphone-13-mini/pink/03.webp diff --git a/public/img/phones/apple-iphone-13-mini/white/00.webp b/public/imgClosed/phones/apple-iphone-13-mini/white/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/white/00.webp rename to public/imgClosed/phones/apple-iphone-13-mini/white/00.webp diff --git a/public/img/phones/apple-iphone-13-mini/white/01.webp b/public/imgClosed/phones/apple-iphone-13-mini/white/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/white/01.webp rename to public/imgClosed/phones/apple-iphone-13-mini/white/01.webp diff --git a/public/img/phones/apple-iphone-13-mini/white/02.webp b/public/imgClosed/phones/apple-iphone-13-mini/white/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/white/02.webp rename to public/imgClosed/phones/apple-iphone-13-mini/white/02.webp diff --git a/public/img/phones/apple-iphone-13-mini/white/03.webp b/public/imgClosed/phones/apple-iphone-13-mini/white/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-mini/white/03.webp rename to public/imgClosed/phones/apple-iphone-13-mini/white/03.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/gold/00.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/gold/00.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/gold/00.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/gold/01.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/gold/01.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/gold/01.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/gold/02.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/gold/02.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/gold/02.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/gold/03.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/gold/03.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/gold/03.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/graphite/00.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/graphite/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/graphite/00.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/graphite/00.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/graphite/01.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/graphite/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/graphite/01.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/graphite/01.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/graphite/02.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/graphite/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/graphite/02.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/graphite/02.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/graphite/03.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/graphite/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/graphite/03.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/graphite/03.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/00.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/00.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/01.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/01.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/02.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/02.webp diff --git a/public/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp b/public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/03.webp similarity index 100% rename from public/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp rename to public/imgClosed/phones/apple-iphone-13-pro-max/sierrablue/03.webp diff --git a/public/img/phones/apple-iphone-14-pro/gold/00.webp b/public/imgClosed/phones/apple-iphone-14-pro/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/gold/00.webp rename to public/imgClosed/phones/apple-iphone-14-pro/gold/00.webp diff --git a/public/img/phones/apple-iphone-14-pro/gold/01.webp b/public/imgClosed/phones/apple-iphone-14-pro/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/gold/01.webp rename to public/imgClosed/phones/apple-iphone-14-pro/gold/01.webp diff --git a/public/img/phones/apple-iphone-14-pro/gold/02.webp b/public/imgClosed/phones/apple-iphone-14-pro/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/gold/02.webp rename to public/imgClosed/phones/apple-iphone-14-pro/gold/02.webp diff --git a/public/img/phones/apple-iphone-14-pro/gold/03.webp b/public/imgClosed/phones/apple-iphone-14-pro/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/gold/03.webp rename to public/imgClosed/phones/apple-iphone-14-pro/gold/03.webp diff --git a/public/img/phones/apple-iphone-14-pro/gold/04.webp b/public/imgClosed/phones/apple-iphone-14-pro/gold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/gold/04.webp rename to public/imgClosed/phones/apple-iphone-14-pro/gold/04.webp diff --git a/public/img/phones/apple-iphone-14-pro/spaceblack/00.webp b/public/imgClosed/phones/apple-iphone-14-pro/spaceblack/00.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/spaceblack/00.webp rename to public/imgClosed/phones/apple-iphone-14-pro/spaceblack/00.webp diff --git a/public/img/phones/apple-iphone-14-pro/spaceblack/01.webp b/public/imgClosed/phones/apple-iphone-14-pro/spaceblack/01.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/spaceblack/01.webp rename to public/imgClosed/phones/apple-iphone-14-pro/spaceblack/01.webp diff --git a/public/img/phones/apple-iphone-14-pro/spaceblack/02.webp b/public/imgClosed/phones/apple-iphone-14-pro/spaceblack/02.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/spaceblack/02.webp rename to public/imgClosed/phones/apple-iphone-14-pro/spaceblack/02.webp diff --git a/public/img/phones/apple-iphone-14-pro/spaceblack/03.webp b/public/imgClosed/phones/apple-iphone-14-pro/spaceblack/03.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/spaceblack/03.webp rename to public/imgClosed/phones/apple-iphone-14-pro/spaceblack/03.webp diff --git a/public/img/phones/apple-iphone-14-pro/spaceblack/04.webp b/public/imgClosed/phones/apple-iphone-14-pro/spaceblack/04.webp similarity index 100% rename from public/img/phones/apple-iphone-14-pro/spaceblack/04.webp rename to public/imgClosed/phones/apple-iphone-14-pro/spaceblack/04.webp diff --git a/public/img/phones/apple-iphone-14/midnight/00.webp b/public/imgClosed/phones/apple-iphone-14/midnight/00.webp similarity index 100% rename from public/img/phones/apple-iphone-14/midnight/00.webp rename to public/imgClosed/phones/apple-iphone-14/midnight/00.webp diff --git a/public/img/phones/apple-iphone-14/midnight/01.webp b/public/imgClosed/phones/apple-iphone-14/midnight/01.webp similarity index 100% rename from public/img/phones/apple-iphone-14/midnight/01.webp rename to public/imgClosed/phones/apple-iphone-14/midnight/01.webp diff --git a/public/img/phones/apple-iphone-14/midnight/02.webp b/public/imgClosed/phones/apple-iphone-14/midnight/02.webp similarity index 100% rename from public/img/phones/apple-iphone-14/midnight/02.webp rename to public/imgClosed/phones/apple-iphone-14/midnight/02.webp diff --git a/public/img/phones/apple-iphone-14/midnight/03.webp b/public/imgClosed/phones/apple-iphone-14/midnight/03.webp similarity index 100% rename from public/img/phones/apple-iphone-14/midnight/03.webp rename to public/imgClosed/phones/apple-iphone-14/midnight/03.webp diff --git a/public/img/phones/apple-iphone-14/midnight/04.webp b/public/imgClosed/phones/apple-iphone-14/midnight/04.webp similarity index 100% rename from public/img/phones/apple-iphone-14/midnight/04.webp rename to public/imgClosed/phones/apple-iphone-14/midnight/04.webp diff --git a/public/img/phones/apple-iphone-14/purple/00.webp b/public/imgClosed/phones/apple-iphone-14/purple/00.webp similarity index 100% rename from public/img/phones/apple-iphone-14/purple/00.webp rename to public/imgClosed/phones/apple-iphone-14/purple/00.webp diff --git a/public/img/phones/apple-iphone-14/purple/01.webp b/public/imgClosed/phones/apple-iphone-14/purple/01.webp similarity index 100% rename from public/img/phones/apple-iphone-14/purple/01.webp rename to public/imgClosed/phones/apple-iphone-14/purple/01.webp diff --git a/public/img/phones/apple-iphone-14/purple/02.webp b/public/imgClosed/phones/apple-iphone-14/purple/02.webp similarity index 100% rename from public/img/phones/apple-iphone-14/purple/02.webp rename to public/imgClosed/phones/apple-iphone-14/purple/02.webp diff --git a/public/img/phones/apple-iphone-14/purple/03.webp b/public/imgClosed/phones/apple-iphone-14/purple/03.webp similarity index 100% rename from public/img/phones/apple-iphone-14/purple/03.webp rename to public/imgClosed/phones/apple-iphone-14/purple/03.webp diff --git a/public/img/phones/apple-iphone-14/purple/04.webp b/public/imgClosed/phones/apple-iphone-14/purple/04.webp similarity index 100% rename from public/img/phones/apple-iphone-14/purple/04.webp rename to public/imgClosed/phones/apple-iphone-14/purple/04.webp diff --git a/public/img/phones/apple-iphone-14/yellow/00.webp b/public/imgClosed/phones/apple-iphone-14/yellow/00.webp similarity index 100% rename from public/img/phones/apple-iphone-14/yellow/00.webp rename to public/imgClosed/phones/apple-iphone-14/yellow/00.webp diff --git a/public/img/phones/apple-iphone-14/yellow/01.webp b/public/imgClosed/phones/apple-iphone-14/yellow/01.webp similarity index 100% rename from public/img/phones/apple-iphone-14/yellow/01.webp rename to public/imgClosed/phones/apple-iphone-14/yellow/01.webp diff --git a/public/img/phones/apple-iphone-14/yellow/02.webp b/public/imgClosed/phones/apple-iphone-14/yellow/02.webp similarity index 100% rename from public/img/phones/apple-iphone-14/yellow/02.webp rename to public/imgClosed/phones/apple-iphone-14/yellow/02.webp diff --git a/public/img/phones/apple-iphone-14/yellow/03.webp b/public/imgClosed/phones/apple-iphone-14/yellow/03.webp similarity index 100% rename from public/img/phones/apple-iphone-14/yellow/03.webp rename to public/imgClosed/phones/apple-iphone-14/yellow/03.webp diff --git a/public/img/phones/apple-iphone-14/yellow/04.webp b/public/imgClosed/phones/apple-iphone-14/yellow/04.webp similarity index 100% rename from public/img/phones/apple-iphone-14/yellow/04.webp rename to public/imgClosed/phones/apple-iphone-14/yellow/04.webp diff --git a/public/img/phones/apple-iphone-7-plus/black/00.webp b/public/imgClosed/phones/apple-iphone-7-plus/black/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/black/00.webp rename to public/imgClosed/phones/apple-iphone-7-plus/black/00.webp diff --git a/public/img/phones/apple-iphone-7-plus/black/01.webp b/public/imgClosed/phones/apple-iphone-7-plus/black/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/black/01.webp rename to public/imgClosed/phones/apple-iphone-7-plus/black/01.webp diff --git a/public/img/phones/apple-iphone-7-plus/black/02.webp b/public/imgClosed/phones/apple-iphone-7-plus/black/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/black/02.webp rename to public/imgClosed/phones/apple-iphone-7-plus/black/02.webp diff --git a/public/img/phones/apple-iphone-7-plus/black/03.webp b/public/imgClosed/phones/apple-iphone-7-plus/black/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/black/03.webp rename to public/imgClosed/phones/apple-iphone-7-plus/black/03.webp diff --git a/public/img/phones/apple-iphone-7-plus/black/04.webp b/public/imgClosed/phones/apple-iphone-7-plus/black/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/black/04.webp rename to public/imgClosed/phones/apple-iphone-7-plus/black/04.webp diff --git a/public/img/phones/apple-iphone-7-plus/gold/00.webp b/public/imgClosed/phones/apple-iphone-7-plus/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/gold/00.webp rename to public/imgClosed/phones/apple-iphone-7-plus/gold/00.webp diff --git a/public/img/phones/apple-iphone-7-plus/gold/01.webp b/public/imgClosed/phones/apple-iphone-7-plus/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/gold/01.webp rename to public/imgClosed/phones/apple-iphone-7-plus/gold/01.webp diff --git a/public/img/phones/apple-iphone-7-plus/gold/02.webp b/public/imgClosed/phones/apple-iphone-7-plus/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/gold/02.webp rename to public/imgClosed/phones/apple-iphone-7-plus/gold/02.webp diff --git a/public/img/phones/apple-iphone-7-plus/gold/03.webp b/public/imgClosed/phones/apple-iphone-7-plus/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/gold/03.webp rename to public/imgClosed/phones/apple-iphone-7-plus/gold/03.webp diff --git a/public/img/phones/apple-iphone-7-plus/gold/04.webp b/public/imgClosed/phones/apple-iphone-7-plus/gold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/gold/04.webp rename to public/imgClosed/phones/apple-iphone-7-plus/gold/04.webp diff --git a/public/img/phones/apple-iphone-7-plus/rosegold/00.webp b/public/imgClosed/phones/apple-iphone-7-plus/rosegold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/rosegold/00.webp rename to public/imgClosed/phones/apple-iphone-7-plus/rosegold/00.webp diff --git a/public/img/phones/apple-iphone-7-plus/rosegold/01.webp b/public/imgClosed/phones/apple-iphone-7-plus/rosegold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/rosegold/01.webp rename to public/imgClosed/phones/apple-iphone-7-plus/rosegold/01.webp diff --git a/public/img/phones/apple-iphone-7-plus/rosegold/02.webp b/public/imgClosed/phones/apple-iphone-7-plus/rosegold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/rosegold/02.webp rename to public/imgClosed/phones/apple-iphone-7-plus/rosegold/02.webp diff --git a/public/img/phones/apple-iphone-7-plus/rosegold/03.webp b/public/imgClosed/phones/apple-iphone-7-plus/rosegold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/rosegold/03.webp rename to public/imgClosed/phones/apple-iphone-7-plus/rosegold/03.webp diff --git a/public/img/phones/apple-iphone-7-plus/rosegold/04.webp b/public/imgClosed/phones/apple-iphone-7-plus/rosegold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/rosegold/04.webp rename to public/imgClosed/phones/apple-iphone-7-plus/rosegold/04.webp diff --git a/public/img/phones/apple-iphone-7-plus/silver/00.webp b/public/imgClosed/phones/apple-iphone-7-plus/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/silver/00.webp rename to public/imgClosed/phones/apple-iphone-7-plus/silver/00.webp diff --git a/public/img/phones/apple-iphone-7-plus/silver/01.webp b/public/imgClosed/phones/apple-iphone-7-plus/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/silver/01.webp rename to public/imgClosed/phones/apple-iphone-7-plus/silver/01.webp diff --git a/public/img/phones/apple-iphone-7-plus/silver/02.webp b/public/imgClosed/phones/apple-iphone-7-plus/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/silver/02.webp rename to public/imgClosed/phones/apple-iphone-7-plus/silver/02.webp diff --git a/public/img/phones/apple-iphone-7-plus/silver/03.webp b/public/imgClosed/phones/apple-iphone-7-plus/silver/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/silver/03.webp rename to public/imgClosed/phones/apple-iphone-7-plus/silver/03.webp diff --git a/public/img/phones/apple-iphone-7-plus/silver/04.webp b/public/imgClosed/phones/apple-iphone-7-plus/silver/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7-plus/silver/04.webp rename to public/imgClosed/phones/apple-iphone-7-plus/silver/04.webp diff --git a/public/img/phones/apple-iphone-7/black/00.webp b/public/imgClosed/phones/apple-iphone-7/black/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7/black/00.webp rename to public/imgClosed/phones/apple-iphone-7/black/00.webp diff --git a/public/img/phones/apple-iphone-7/black/01.webp b/public/imgClosed/phones/apple-iphone-7/black/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7/black/01.webp rename to public/imgClosed/phones/apple-iphone-7/black/01.webp diff --git a/public/img/phones/apple-iphone-7/black/02.webp b/public/imgClosed/phones/apple-iphone-7/black/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7/black/02.webp rename to public/imgClosed/phones/apple-iphone-7/black/02.webp diff --git a/public/img/phones/apple-iphone-7/black/03.webp b/public/imgClosed/phones/apple-iphone-7/black/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7/black/03.webp rename to public/imgClosed/phones/apple-iphone-7/black/03.webp diff --git a/public/img/phones/apple-iphone-7/black/04.webp b/public/imgClosed/phones/apple-iphone-7/black/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7/black/04.webp rename to public/imgClosed/phones/apple-iphone-7/black/04.webp diff --git a/public/img/phones/apple-iphone-7/gold/00.webp b/public/imgClosed/phones/apple-iphone-7/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7/gold/00.webp rename to public/imgClosed/phones/apple-iphone-7/gold/00.webp diff --git a/public/img/phones/apple-iphone-7/gold/01.webp b/public/imgClosed/phones/apple-iphone-7/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7/gold/01.webp rename to public/imgClosed/phones/apple-iphone-7/gold/01.webp diff --git a/public/img/phones/apple-iphone-7/gold/02.webp b/public/imgClosed/phones/apple-iphone-7/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7/gold/02.webp rename to public/imgClosed/phones/apple-iphone-7/gold/02.webp diff --git a/public/img/phones/apple-iphone-7/gold/03.webp b/public/imgClosed/phones/apple-iphone-7/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7/gold/03.webp rename to public/imgClosed/phones/apple-iphone-7/gold/03.webp diff --git a/public/img/phones/apple-iphone-7/gold/04.webp b/public/imgClosed/phones/apple-iphone-7/gold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7/gold/04.webp rename to public/imgClosed/phones/apple-iphone-7/gold/04.webp diff --git a/public/img/phones/apple-iphone-7/rosegold/00.webp b/public/imgClosed/phones/apple-iphone-7/rosegold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7/rosegold/00.webp rename to public/imgClosed/phones/apple-iphone-7/rosegold/00.webp diff --git a/public/img/phones/apple-iphone-7/rosegold/01.webp b/public/imgClosed/phones/apple-iphone-7/rosegold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7/rosegold/01.webp rename to public/imgClosed/phones/apple-iphone-7/rosegold/01.webp diff --git a/public/img/phones/apple-iphone-7/rosegold/02.webp b/public/imgClosed/phones/apple-iphone-7/rosegold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7/rosegold/02.webp rename to public/imgClosed/phones/apple-iphone-7/rosegold/02.webp diff --git a/public/img/phones/apple-iphone-7/rosegold/03.webp b/public/imgClosed/phones/apple-iphone-7/rosegold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7/rosegold/03.webp rename to public/imgClosed/phones/apple-iphone-7/rosegold/03.webp diff --git a/public/img/phones/apple-iphone-7/rosegold/04.webp b/public/imgClosed/phones/apple-iphone-7/rosegold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7/rosegold/04.webp rename to public/imgClosed/phones/apple-iphone-7/rosegold/04.webp diff --git a/public/img/phones/apple-iphone-7/silver/00.webp b/public/imgClosed/phones/apple-iphone-7/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-7/silver/00.webp rename to public/imgClosed/phones/apple-iphone-7/silver/00.webp diff --git a/public/img/phones/apple-iphone-7/silver/01.webp b/public/imgClosed/phones/apple-iphone-7/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-7/silver/01.webp rename to public/imgClosed/phones/apple-iphone-7/silver/01.webp diff --git a/public/img/phones/apple-iphone-7/silver/02.webp b/public/imgClosed/phones/apple-iphone-7/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-7/silver/02.webp rename to public/imgClosed/phones/apple-iphone-7/silver/02.webp diff --git a/public/img/phones/apple-iphone-7/silver/03.webp b/public/imgClosed/phones/apple-iphone-7/silver/03.webp similarity index 100% rename from public/img/phones/apple-iphone-7/silver/03.webp rename to public/imgClosed/phones/apple-iphone-7/silver/03.webp diff --git a/public/img/phones/apple-iphone-7/silver/04.webp b/public/imgClosed/phones/apple-iphone-7/silver/04.webp similarity index 100% rename from public/img/phones/apple-iphone-7/silver/04.webp rename to public/imgClosed/phones/apple-iphone-7/silver/04.webp diff --git a/public/img/phones/apple-iphone-8/gold/00.webp b/public/imgClosed/phones/apple-iphone-8/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-8/gold/00.webp rename to public/imgClosed/phones/apple-iphone-8/gold/00.webp diff --git a/public/img/phones/apple-iphone-8/gold/01.webp b/public/imgClosed/phones/apple-iphone-8/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-8/gold/01.webp rename to public/imgClosed/phones/apple-iphone-8/gold/01.webp diff --git a/public/img/phones/apple-iphone-8/gold/02.webp b/public/imgClosed/phones/apple-iphone-8/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-8/gold/02.webp rename to public/imgClosed/phones/apple-iphone-8/gold/02.webp diff --git a/public/img/phones/apple-iphone-8/gold/03.webp b/public/imgClosed/phones/apple-iphone-8/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-8/gold/03.webp rename to public/imgClosed/phones/apple-iphone-8/gold/03.webp diff --git a/public/img/phones/apple-iphone-8/silver/00.webp b/public/imgClosed/phones/apple-iphone-8/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-8/silver/00.webp rename to public/imgClosed/phones/apple-iphone-8/silver/00.webp diff --git a/public/img/phones/apple-iphone-8/silver/01.webp b/public/imgClosed/phones/apple-iphone-8/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-8/silver/01.webp rename to public/imgClosed/phones/apple-iphone-8/silver/01.webp diff --git a/public/img/phones/apple-iphone-8/silver/02.webp b/public/imgClosed/phones/apple-iphone-8/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-8/silver/02.webp rename to public/imgClosed/phones/apple-iphone-8/silver/02.webp diff --git a/public/img/phones/apple-iphone-8/silver/03.webp b/public/imgClosed/phones/apple-iphone-8/silver/03.webp similarity index 100% rename from public/img/phones/apple-iphone-8/silver/03.webp rename to public/imgClosed/phones/apple-iphone-8/silver/03.webp diff --git a/public/img/phones/apple-iphone-8/spacegray/00.webp b/public/imgClosed/phones/apple-iphone-8/spacegray/00.webp similarity index 100% rename from public/img/phones/apple-iphone-8/spacegray/00.webp rename to public/imgClosed/phones/apple-iphone-8/spacegray/00.webp diff --git a/public/img/phones/apple-iphone-8/spacegray/01.webp b/public/imgClosed/phones/apple-iphone-8/spacegray/01.webp similarity index 100% rename from public/img/phones/apple-iphone-8/spacegray/01.webp rename to public/imgClosed/phones/apple-iphone-8/spacegray/01.webp diff --git a/public/img/phones/apple-iphone-8/spacegray/02.webp b/public/imgClosed/phones/apple-iphone-8/spacegray/02.webp similarity index 100% rename from public/img/phones/apple-iphone-8/spacegray/02.webp rename to public/imgClosed/phones/apple-iphone-8/spacegray/02.webp diff --git a/public/img/phones/apple-iphone-8/spacegray/03.webp b/public/imgClosed/phones/apple-iphone-8/spacegray/03.webp similarity index 100% rename from public/img/phones/apple-iphone-8/spacegray/03.webp rename to public/imgClosed/phones/apple-iphone-8/spacegray/03.webp diff --git a/public/img/phones/apple-iphone-xr/coral/00.webp b/public/imgClosed/phones/apple-iphone-xr/coral/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/coral/00.webp rename to public/imgClosed/phones/apple-iphone-xr/coral/00.webp diff --git a/public/img/phones/apple-iphone-xr/coral/01.webp b/public/imgClosed/phones/apple-iphone-xr/coral/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/coral/01.webp rename to public/imgClosed/phones/apple-iphone-xr/coral/01.webp diff --git a/public/img/phones/apple-iphone-xr/coral/02.webp b/public/imgClosed/phones/apple-iphone-xr/coral/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/coral/02.webp rename to public/imgClosed/phones/apple-iphone-xr/coral/02.webp diff --git a/public/img/phones/apple-iphone-xr/red/00.webp b/public/imgClosed/phones/apple-iphone-xr/red/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/red/00.webp rename to public/imgClosed/phones/apple-iphone-xr/red/00.webp diff --git a/public/img/phones/apple-iphone-xr/red/01.webp b/public/imgClosed/phones/apple-iphone-xr/red/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/red/01.webp rename to public/imgClosed/phones/apple-iphone-xr/red/01.webp diff --git a/public/img/phones/apple-iphone-xr/red/02.webp b/public/imgClosed/phones/apple-iphone-xr/red/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/red/02.webp rename to public/imgClosed/phones/apple-iphone-xr/red/02.webp diff --git a/public/img/phones/apple-iphone-xr/red/03.webp b/public/imgClosed/phones/apple-iphone-xr/red/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/red/03.webp rename to public/imgClosed/phones/apple-iphone-xr/red/03.webp diff --git a/public/img/phones/apple-iphone-xr/red/04.webp b/public/imgClosed/phones/apple-iphone-xr/red/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/red/04.webp rename to public/imgClosed/phones/apple-iphone-xr/red/04.webp diff --git a/public/img/phones/apple-iphone-xr/white/00.webp b/public/imgClosed/phones/apple-iphone-xr/white/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/white/00.webp rename to public/imgClosed/phones/apple-iphone-xr/white/00.webp diff --git a/public/img/phones/apple-iphone-xr/white/01.webp b/public/imgClosed/phones/apple-iphone-xr/white/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/white/01.webp rename to public/imgClosed/phones/apple-iphone-xr/white/01.webp diff --git a/public/img/phones/apple-iphone-xr/white/02.webp b/public/imgClosed/phones/apple-iphone-xr/white/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/white/02.webp rename to public/imgClosed/phones/apple-iphone-xr/white/02.webp diff --git a/public/img/phones/apple-iphone-xr/white/03.webp b/public/imgClosed/phones/apple-iphone-xr/white/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/white/03.webp rename to public/imgClosed/phones/apple-iphone-xr/white/03.webp diff --git a/public/img/phones/apple-iphone-xr/yellow/00.webp b/public/imgClosed/phones/apple-iphone-xr/yellow/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/yellow/00.webp rename to public/imgClosed/phones/apple-iphone-xr/yellow/00.webp diff --git a/public/img/phones/apple-iphone-xr/yellow/01.webp b/public/imgClosed/phones/apple-iphone-xr/yellow/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/yellow/01.webp rename to public/imgClosed/phones/apple-iphone-xr/yellow/01.webp diff --git a/public/img/phones/apple-iphone-xr/yellow/02.webp b/public/imgClosed/phones/apple-iphone-xr/yellow/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/yellow/02.webp rename to public/imgClosed/phones/apple-iphone-xr/yellow/02.webp diff --git a/public/img/phones/apple-iphone-xr/yellow/03.webp b/public/imgClosed/phones/apple-iphone-xr/yellow/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/yellow/03.webp rename to public/imgClosed/phones/apple-iphone-xr/yellow/03.webp diff --git a/public/img/phones/apple-iphone-xr/yellow/04.webp b/public/imgClosed/phones/apple-iphone-xr/yellow/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xr/yellow/04.webp rename to public/imgClosed/phones/apple-iphone-xr/yellow/04.webp diff --git a/public/img/phones/apple-iphone-xs-max/gold/00.webp b/public/imgClosed/phones/apple-iphone-xs-max/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/gold/00.webp rename to public/imgClosed/phones/apple-iphone-xs-max/gold/00.webp diff --git a/public/img/phones/apple-iphone-xs-max/gold/01.webp b/public/imgClosed/phones/apple-iphone-xs-max/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/gold/01.webp rename to public/imgClosed/phones/apple-iphone-xs-max/gold/01.webp diff --git a/public/img/phones/apple-iphone-xs-max/gold/02.webp b/public/imgClosed/phones/apple-iphone-xs-max/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/gold/02.webp rename to public/imgClosed/phones/apple-iphone-xs-max/gold/02.webp diff --git a/public/img/phones/apple-iphone-xs-max/gold/03.webp b/public/imgClosed/phones/apple-iphone-xs-max/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/gold/03.webp rename to public/imgClosed/phones/apple-iphone-xs-max/gold/03.webp diff --git a/public/img/phones/apple-iphone-xs-max/gold/04.webp b/public/imgClosed/phones/apple-iphone-xs-max/gold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/gold/04.webp rename to public/imgClosed/phones/apple-iphone-xs-max/gold/04.webp diff --git a/public/img/phones/apple-iphone-xs-max/silver/00.webp b/public/imgClosed/phones/apple-iphone-xs-max/silver/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/silver/00.webp rename to public/imgClosed/phones/apple-iphone-xs-max/silver/00.webp diff --git a/public/img/phones/apple-iphone-xs-max/silver/01.webp b/public/imgClosed/phones/apple-iphone-xs-max/silver/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/silver/01.webp rename to public/imgClosed/phones/apple-iphone-xs-max/silver/01.webp diff --git a/public/img/phones/apple-iphone-xs-max/silver/02.webp b/public/imgClosed/phones/apple-iphone-xs-max/silver/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/silver/02.webp rename to public/imgClosed/phones/apple-iphone-xs-max/silver/02.webp diff --git a/public/img/phones/apple-iphone-xs-max/silver/03.webp b/public/imgClosed/phones/apple-iphone-xs-max/silver/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/silver/03.webp rename to public/imgClosed/phones/apple-iphone-xs-max/silver/03.webp diff --git a/public/img/phones/apple-iphone-xs-max/silver/04.webp b/public/imgClosed/phones/apple-iphone-xs-max/silver/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/silver/04.webp rename to public/imgClosed/phones/apple-iphone-xs-max/silver/04.webp diff --git a/public/img/phones/apple-iphone-xs-max/spacegray/00.webp b/public/imgClosed/phones/apple-iphone-xs-max/spacegray/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/spacegray/00.webp rename to public/imgClosed/phones/apple-iphone-xs-max/spacegray/00.webp diff --git a/public/img/phones/apple-iphone-xs-max/spacegray/01.webp b/public/imgClosed/phones/apple-iphone-xs-max/spacegray/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/spacegray/01.webp rename to public/imgClosed/phones/apple-iphone-xs-max/spacegray/01.webp diff --git a/public/img/phones/apple-iphone-xs-max/spacegray/02.webp b/public/imgClosed/phones/apple-iphone-xs-max/spacegray/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/spacegray/02.webp rename to public/imgClosed/phones/apple-iphone-xs-max/spacegray/02.webp diff --git a/public/img/phones/apple-iphone-xs-max/spacegray/03.webp b/public/imgClosed/phones/apple-iphone-xs-max/spacegray/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/spacegray/03.webp rename to public/imgClosed/phones/apple-iphone-xs-max/spacegray/03.webp diff --git a/public/img/phones/apple-iphone-xs-max/spacegray/04.webp b/public/imgClosed/phones/apple-iphone-xs-max/spacegray/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xs-max/spacegray/04.webp rename to public/imgClosed/phones/apple-iphone-xs-max/spacegray/04.webp diff --git a/public/img/phones/apple-iphone-xs/gold/00.webp b/public/imgClosed/phones/apple-iphone-xs/gold/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/gold/00.webp rename to public/imgClosed/phones/apple-iphone-xs/gold/00.webp diff --git a/public/img/phones/apple-iphone-xs/gold/01.webp b/public/imgClosed/phones/apple-iphone-xs/gold/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/gold/01.webp rename to public/imgClosed/phones/apple-iphone-xs/gold/01.webp diff --git a/public/img/phones/apple-iphone-xs/gold/02.webp b/public/imgClosed/phones/apple-iphone-xs/gold/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/gold/02.webp rename to public/imgClosed/phones/apple-iphone-xs/gold/02.webp diff --git a/public/img/phones/apple-iphone-xs/gold/03.webp b/public/imgClosed/phones/apple-iphone-xs/gold/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/gold/03.webp rename to public/imgClosed/phones/apple-iphone-xs/gold/03.webp diff --git a/public/img/phones/apple-iphone-xs/gold/04.webp b/public/imgClosed/phones/apple-iphone-xs/gold/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/gold/04.webp rename to public/imgClosed/phones/apple-iphone-xs/gold/04.webp diff --git a/public/img/phones/apple-iphone-xs/spacegray/00.webp b/public/imgClosed/phones/apple-iphone-xs/spacegray/00.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/spacegray/00.webp rename to public/imgClosed/phones/apple-iphone-xs/spacegray/00.webp diff --git a/public/img/phones/apple-iphone-xs/spacegray/01.webp b/public/imgClosed/phones/apple-iphone-xs/spacegray/01.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/spacegray/01.webp rename to public/imgClosed/phones/apple-iphone-xs/spacegray/01.webp diff --git a/public/img/phones/apple-iphone-xs/spacegray/02.webp b/public/imgClosed/phones/apple-iphone-xs/spacegray/02.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/spacegray/02.webp rename to public/imgClosed/phones/apple-iphone-xs/spacegray/02.webp diff --git a/public/img/phones/apple-iphone-xs/spacegray/03.webp b/public/imgClosed/phones/apple-iphone-xs/spacegray/03.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/spacegray/03.webp rename to public/imgClosed/phones/apple-iphone-xs/spacegray/03.webp diff --git a/public/img/phones/apple-iphone-xs/spacegray/04.webp b/public/imgClosed/phones/apple-iphone-xs/spacegray/04.webp similarity index 100% rename from public/img/phones/apple-iphone-xs/spacegray/04.webp rename to public/imgClosed/phones/apple-iphone-xs/spacegray/04.webp diff --git a/public/img/picthree.bdd2e0fc.png b/public/imgClosed/picthree.bdd2e0fc.png similarity index 100% rename from public/img/picthree.bdd2e0fc.png rename to public/imgClosed/picthree.bdd2e0fc.png diff --git a/public/img/product-not-found.png b/public/imgClosed/product-not-found.png similarity index 100% rename from public/img/product-not-found.png rename to public/imgClosed/product-not-found.png diff --git a/public/img/tablets/apple-ipad-10-2-2020/gold/00.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/gold/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/gold/00.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/gold/00.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/gold/01.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/gold/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/gold/01.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/gold/01.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/gold/02.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/gold/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/gold/02.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/gold/02.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/gold/03.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/gold/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/gold/03.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/gold/03.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/silver/00.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/silver/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/silver/00.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/silver/00.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/silver/01.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/silver/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/silver/01.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/silver/01.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/silver/02.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/silver/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/silver/02.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/silver/02.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/silver/03.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/silver/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/silver/03.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/silver/03.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/00.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/spacegray/01.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/spacegray/01.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/01.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/spacegray/02.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/spacegray/02.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/02.webp diff --git a/public/img/tablets/apple-ipad-10-2-2020/spacegray/03.webp b/public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-10-2-2020/spacegray/03.webp rename to public/imgClosed/tablets/apple-ipad-10-2-2020/spacegray/03.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/green/00.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/green/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/green/00.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/green/00.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/green/02.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/green/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/green/02.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/green/02.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/green/03.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/green/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/green/03.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/green/03.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/green/04.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/green/04.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/green/04.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/green/04.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/silver/00.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/silver/00.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/00.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/silver/01.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/silver/01.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/01.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/silver/02.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/silver/02.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/02.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/silver/03.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/silver/03.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/silver/03.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp diff --git a/public/img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp b/public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp similarity index 100% rename from public/img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp rename to public/imgClosed/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/gold/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/gold/00.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/gold/01.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/gold/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/gold/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/gold/01.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/silver/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/silver/00.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/silver/01.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/silver/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/silver/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/silver/01.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp diff --git a/public/img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp b/public/imgClosed/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/00.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/pink/01.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/pink/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/01.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/pink/02.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/pink/02.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/pink/02.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/00.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/01.webp diff --git a/public/img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp b/public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp rename to public/imgClosed/tablets/apple-ipad-mini-6th-gen/starlight/02.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/silver/00.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/silver/00.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/00.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/silver/01.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/silver/01.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/01.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/silver/02.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/silver/02.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/silver/02.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/00.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/00.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/01.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/01.webp diff --git a/public/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp b/public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/02.webp similarity index 100% rename from public/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp rename to public/imgClosed/tablets/apple-ipad-pro-11-2021/spacegray/02.webp diff --git a/src/Layout/Layout.scss b/src/Layout/Layout.scss index fa6c5b292b8..750bee57453 100644 --- a/src/Layout/Layout.scss +++ b/src/Layout/Layout.scss @@ -24,7 +24,22 @@ top: 0; z-index: 1; } - +.Layout__menu { + position: sticky; + top: 0; + z-index: 1; +} +.Layout__footer { + background-color: var(--color-bg); + padding: 1rem; + text-align: center; +} +.Layout__loading { + display: flex; + justify-content: center; + align-items: center; + height: 100%; +} body.theme_dark { background-color: var(--color-bg); } diff --git a/src/Layout/Layout.tsx b/src/Layout/Layout.tsx index 1de55a7681b..736cae99bdf 100644 --- a/src/Layout/Layout.tsx +++ b/src/Layout/Layout.tsx @@ -27,7 +27,7 @@ export const Layout = () => {
- + Loading...
}> diff --git a/src/components/CartItem/CartItem.scss b/src/components/CartItem/CartItem.scss index aef82d91a62..5902cd6d276 100644 --- a/src/components/CartItem/CartItem.scss +++ b/src/components/CartItem/CartItem.scss @@ -1,4 +1,3 @@ - /* stylelint-disable */ @import '../../styles/main'; @@ -41,15 +40,16 @@ } } &__icon-close { + border: none; background-color: var(--color-bg); cursor: pointer; width: 16px; height: 16px; background-image: url(../../icons/close__disabled.svg); - &:hover { - background-image: url(../../icons/Close.svg); - } + // &:hover { + // background-image: url(../../icons/Close.svg); + //} } &__link { @@ -108,17 +108,39 @@ transition: transform 0.3s ease; &:hover { transform: scale(1.05); - } } + &__delete { + display: flex; + flex-direction: column; + align-items: center; + // gap: 8px; + cursor: pointer; + font-family: Mont-Regular, sans-serif; + font-size: 14px; + font-weight: 600; + color: var(--color-gray-secondary); + &:hover { + .cartItem__icon-close { + background-image: url(../../icons/Close.svg); + } + color: var(--color-gray-primary); + } + } } - body.theme_dark .cartItem__counter { color: var(--color-gray-primary); } - - +body.theme_dark .cartItem__delete { + color: var(--color-gray-primary); + &:hover { + body.theme_dark .cartItem__icon-close { + background-image: url(../../icons/close__disabled.svg); + } + color: var(--color-gray-secondary); + } +} body.theme_dark .cartItem__button { background-color: var(--color-surface-2); border: none; @@ -126,24 +148,23 @@ body.theme_dark .cartItem__button { background-color: var(--color-bg); border: 1px solid var(--color-gray-elements); } - &:not(.cartItem__button--disabled):hover { - background-color: var(--color-gray-icons-placeholders); - border: none; - } + &:not(.cartItem__button--disabled):hover { + background-color: var(--color-gray-icons-placeholders); + border: none; + } } - body.theme_dark .cartItem__icon-close { + // border: 1px solid var(--color-gray-elements); border: none; background-color: var(--color-bg); cursor: pointer; width: 16px; height: 16px; - background-image: url(../../icons/Close.svg); + // background-image: url(../../icons/Close.svg); - &:hover { - background-image: url(../../icons/close__disabled.svg); - } + /* &:hover { + background-image: url(../../icons/close__disabled.svg); + }*/ } - diff --git a/src/components/CartItem/CartItem.tsx b/src/components/CartItem/CartItem.tsx index 20acabfc69f..2e97f128a28 100644 --- a/src/components/CartItem/CartItem.tsx +++ b/src/components/CartItem/CartItem.tsx @@ -29,15 +29,23 @@ export const CartItem: FC = memo( return (
- - + Delete + +
- Image product + {/*src = { image }*/} + Image product
{name}
diff --git a/src/components/PicturesSlider/PicturesSlider.tsx b/src/components/PicturesSlider/PicturesSlider.tsx index ceace78fd6a..023ba9ed638 100644 --- a/src/components/PicturesSlider/PicturesSlider.tsx +++ b/src/components/PicturesSlider/PicturesSlider.tsx @@ -5,6 +5,7 @@ import { useContext, FC, useCallback, + useMemo, } from 'react'; import './PicturesSlider.scss'; import '../../../src/shared/Icon/Icon.scss'; @@ -19,7 +20,9 @@ type Props = { }; export const PicturesSlider: FC = ({ allNewestProducts }) => { const images = allNewestProducts.map(el => el.image); - + const memorizedImages = useMemo(() => { + return allNewestProducts.map(el => `https://localhost:4000/${el.image}`); + }, [allNewestProducts]); const names = allNewestProducts.map(el => el.name); const imagesUrl: Record = allNewestProducts.map( el => el.category + '/' + el.itemId, @@ -120,10 +123,14 @@ export const PicturesSlider: FC = ({ allNewestProducts }) => {
- {images.map((src, index) => ( + {/*images.map((src, index) => (--- IGNORE-- --*/} + {memorizedImages.map((src, index) => ( Slide = ({ () => favorites.some(item => item.itemId === selectedProduct.id), [favorites, selectedProduct.id], ); + const images = useMemo(() => { + return selectedProduct.images.map(image => `${image}`); + }, [selectedProduct.images]); return (
- {selectedProduct.images.map((image, index) => ( + {/* selectedProduct.images */} + {images.map((image, index) => (
= ({ })} > {`Thumbnail setSelectedPhoto(index)} @@ -117,7 +123,9 @@ export const ProductContentTop: FC = ({ {selectedProduct.images.map((image, index) => ( {`Selected {
Category Phones @@ -55,7 +57,9 @@ export const ShopByCategory: React.FC = () => {
Category Tablets @@ -69,7 +73,9 @@ export const ShopByCategory: React.FC = () => {
Category Accessories diff --git a/src/context/GlobalContext.tsx b/src/context/GlobalContext.tsx index fca155e41fe..9811fee4eca 100644 --- a/src/context/GlobalContext.tsx +++ b/src/context/GlobalContext.tsx @@ -15,6 +15,7 @@ import { getAllProducts } from '../utils/api'; import { useLocalStorage } from '../hooks/useLocaleStorage'; import { useTheme } from '../hooks/useTheme'; import { Theme } from '../types'; +import { getAvailableProductsByCategory } from '../utils/api'; type GlobalContextType = { allProducts: Product[]; @@ -32,6 +33,9 @@ type GlobalContextType = { addToCart: (currentProduct: Product) => void; theme: Theme; toggleTheme: () => void; + allPhones: Product[]; + allTablets: Product[]; + allAccessories: Product[]; }; export const GlobalContext = createContext({ @@ -50,6 +54,9 @@ export const GlobalContext = createContext({ addToCart: () => {}, theme: 'light', toggleTheme: () => {}, + allPhones: [] as Product[], + allTablets: [] as Product[], + allAccessories: [] as Product[], }); type Props = { @@ -63,9 +70,27 @@ export const GlobalProvider: FC = ({ children }) => { const [cart, setCart] = useLocalStorage('shoppingCart', []); const [favorites, setFavorites] = useLocalStorage('favorites', []); const [isMenuOpen, setIsMenuOpen] = useState(false); + const [allPhones, setAllPhones] = useState([]); + const [allTablets, setAllTablets] = useState([]); + const [allAccessories, setAllAccessories] = useState([]); + + function productsByCategory(category: string) { + return getAvailableProductsByCategory(category); + } useEffect(() => { getAllProducts().then(fetchedProducts => setAllProducts(fetchedProducts)); + productsByCategory('phones').then(phones => { + setAllPhones(phones); + }); + + productsByCategory('tablets').then(tablets => { + setAllTablets(tablets); + }); + + productsByCategory('accessories').then(accessories => { + setAllAccessories(accessories); + }); }, []); const updateQuantity = useCallback( @@ -144,6 +169,9 @@ export const GlobalProvider: FC = ({ children }) => { () => ({ allProducts, setAllProducts, + allPhones, + allTablets, + allAccessories, cart, setCart, favorites, @@ -160,6 +188,9 @@ export const GlobalProvider: FC = ({ children }) => { }), [ allProducts, + allPhones, + allTablets, + allAccessories, cart, favorites, setAllProducts, diff --git a/src/pages/ShoppingCartPage/ShoppingCartPage.tsx b/src/pages/ShoppingCartPage/ShoppingCartPage.tsx index 36a426a71d5..0fc70d69211 100644 --- a/src/pages/ShoppingCartPage/ShoppingCartPage.tsx +++ b/src/pages/ShoppingCartPage/ShoppingCartPage.tsx @@ -52,7 +52,7 @@ export const ShoppingCartPage: FC = () => { Your cart is empty Empty shopping cart diff --git a/src/routes/Routes.tsx b/src/routes/AppRoutes.tsx similarity index 100% rename from src/routes/Routes.tsx rename to src/routes/AppRoutes.tsx diff --git a/src/routes/index.ts b/src/routes/index.ts index 2f80a5cca0e..ca752f59ced 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1 +1 @@ -export * from './Routes'; +export * from './AppRoutes'; diff --git a/src/shared/Footer/Footer.scss b/src/shared/Footer/Footer.scss index c02347e982d..465e483a414 100644 --- a/src/shared/Footer/Footer.scss +++ b/src/shared/Footer/Footer.scss @@ -49,10 +49,7 @@ } @include on-desktop { - - gap: 107px; - } } diff --git a/src/shared/Header/Header.scss b/src/shared/Header/Header.scss index 7f7e0c463ad..6bc7739f59c 100644 --- a/src/shared/Header/Header.scss +++ b/src/shared/Header/Header.scss @@ -1,5 +1,5 @@ -@import '../../styles/main.scss'; -@import '../../utils/variables.scss'; +@import '../../styles/main'; +@import '../../utils/variables'; .header { height: 48px; diff --git a/src/shared/Header/Header.tsx b/src/shared/Header/Header.tsx index 1f78a3340fa..d24c481ebd0 100644 --- a/src/shared/Header/Header.tsx +++ b/src/shared/Header/Header.tsx @@ -28,10 +28,10 @@ export const Header: FC = () => { useContext(GlobalContext); // const location = useLocation(); - //const [query, setQuery] = useState(''); - //const [appliedQuery, setAppliedQuery] = useState(''); + // const [query, setQuery] = useState(''); + // const [appliedQuery, setAppliedQuery] = useState(''); // const [searchParams, setSearchParams] = useSearchParams(); - //const [query, setQuery] = useState(''); + // const [query, setQuery] = useState(''); // const query = searchParams.get('query') || ''; const totalQuantity = useMemo( () => cart.reduce((sum, item) => sum + item.quantity, 0), diff --git a/src/shared/ProductCard/ProductCard.scss b/src/shared/ProductCard/ProductCard.scss index 2bf6f56eb35..e22ef354756 100644 --- a/src/shared/ProductCard/ProductCard.scss +++ b/src/shared/ProductCard/ProductCard.scss @@ -17,7 +17,14 @@ &-photo { width: 148px; height: 129px; - + &-show { + @include hover(transform, scale(1.05)); + @include hover(box-shadow, 0 3px 13px 0 #17203166); + transition: + transform 0.3s ease, + box-shadow 0.3s ease; + opacity: 0; + } @include on-tablet { width: 173px; height: 202px; @@ -33,7 +40,6 @@ text-align: center; height: 58px; padding-top: 16px; - } &-price { @@ -55,7 +61,6 @@ &-buttons { display: flex; gap: 8px; - } } @@ -162,3 +167,27 @@ .productCard:hover .productCard__container-photo { transform: scale(1.05); } + +@keyframes moveShake { + 0% { +rotate: 0deg; + } + 50% { +rotate: -5deg; + } + 100% { +rotate: 5deg; + } +} + +@keyframes moveRight { + 0% { + transform: translateX(0); + } + 50% { + transform: translateX(0px); + } + 100% { + transform: translateX(500px); + } +} diff --git a/src/shared/ProductCard/ProductCard.tsx b/src/shared/ProductCard/ProductCard.tsx index 8db2050b8da..e3ed57cc7c3 100644 --- a/src/shared/ProductCard/ProductCard.tsx +++ b/src/shared/ProductCard/ProductCard.tsx @@ -1,6 +1,6 @@ import './ProductCard.scss'; import React, { FC, memo, useContext, useMemo } from 'react'; -import { Link } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; import classNames from 'classnames'; import { Product } from '../../types/Product'; import { GlobalContext } from '../../context/GlobalContext'; @@ -13,8 +13,16 @@ type Props = { }; export const ProductCard: FC = memo(({ product, displayType }) => { - const { cart, favorites, toggleFavorites, addToCart, theme } = - useContext(GlobalContext); + const { + cart, + favorites, + toggleFavorites, + addToCart, + theme, + allPhones, + allTablets, + allAccessories, + } = useContext(GlobalContext); const isInCart = useMemo( () => cart.some(({ id }) => id === product.itemId), @@ -25,17 +33,146 @@ export const ProductCard: FC = memo(({ product, displayType }) => { [favorites, product.itemId], ); + function findByKey(array: Product[], key: string, value: string) { + // Validate inputs + if (!Array.isArray(array)) { + throw new TypeError('First argument must be an array.'); + } + + if (typeof key !== 'string' || key.trim() === '') { + throw new TypeError('Key must be a non-empty string.'); + } + + // const matches = array.filter(obj => obj && obj[key] === value); + + // console.log('Matching objects:', matches); + /* console.log( + 'Found item:', + matches.find(item => item && item[key] === value), + ); */ + + return array.find(item => { + if (item.hasOwnProperty('id')) { + // console.log('Checking id property:', item.id); + // return true; + return item.id === value; + } else { + throw new Error( + `Object does not have id property: ${JSON.stringify(item)}`, + ); + + // console.log('Object does not have id property:', item); + } + + /* if (item[key as keyof Product] === value) { + return item; + } */ + + // console.log(`Key "${key}" not found in item:`, item); + + return false; + }); + } + + const images = useMemo(() => { + if (product.category === 'phones') { + return findByKey(allPhones, 'id', product.itemId)?.images; + } + + if (product.category === 'tablets') { + return findByKey(allTablets, 'id', product.itemId)?.images; + } + + if (product.category === 'accessories') { + return findByKey(allAccessories, 'id', product.itemId)?.images; + } + }, [allPhones, allTablets, allAccessories, product.category, product.itemId]); + + // console.log('ProductCard render:', { product, images }); + function handleMouseEnter() { + const currentImage = document.getElementById( + `product-image${product.itemId}`, + ) as HTMLImageElement; + + currentImage.style.opacity = '0.3'; + currentImage.style.animation = 'moveRight 0.3s'; + currentImage.style.animationPlayState = 'running'; + + setTimeout(() => { + currentImage.style.animation = ''; + currentImage.style.animationPlayState = 'paused'; + currentImage.style.opacity = '1'; + }, 300); + } + return (
-
Product's photo { + /* const box = document.querySelector( + '.productCard__container-photo', + ) as HTMLElement; */ + const img = e.currentTarget as HTMLImageElement; + + img.style.opacity = '0.3'; + img.style.animationDuration = '0.25s'; + img.style.transition = 'opacity 0.3s ease-in-out'; + img.style.animationPlayState = 'running'; + img.style.animation = 'moveShake 0.25s alternate'; + setTimeout(() => { + img.style.opacity = '1'; + img.style.transition = 'opacity 1s ease-in-out'; + + // box.classList.add('-show'); + // box.style.opacity = '1'; + // box.style.transition = 'box-shadow 0.3s ease-in-out'; + // box.style.boxShadow = '0 3px 13px 0 #17203166'; + img.style.animationPlayState = 'paused'; + img.style.animation = ''; + }, 300); + img.style.transform = 'scale(1.05)'; + + if ( + product.category === 'phones' || + product.category === 'tablets' + ) { + img.src = `https://localhost:4000/${images && images[2] ? images[2] : images && images[1] ? images[1] : product.image}`; + } else { + img.src = `https://localhost:4000/${images && images[1] ? images[1] : images && images[2] ? images[2] : product.image}`; + } + }} + onMouseLeave={e => { + const img = e.currentTarget as HTMLImageElement; + + img.style.animationPlayState = 'paused'; + img.style.animationPlayState = 'running'; + img.style.opacity = '0.3'; + img.style.transition = 'opacity 0.3s ease-in-out'; + + // img.style.transition = 'scale 0.3s ease-in-out'; + + setTimeout(() => { + img.style.opacity = '1'; + img.style.transition = 'opacity 1s ease-in-out'; + img.style.transition = 'scale 0.3s ease-in-out'; + img.style.transform = 'scale(1)'; + + img.style.transition = 'transform 0.5s ease-in-out'; // Smoothly transition back to original size + }, 300); + + img.src = `https://localhost:4000/${product.image}`; + }} />
@@ -90,6 +227,8 @@ export const ProductCard: FC = memo(({ product, displayType }) => { event: React.MouseEvent, ) => { event.preventDefault(); + + handleMouseEnter(); addToCart(product); }} > @@ -115,7 +254,7 @@ export const ProductCard: FC = memo(({ product, displayType }) => { )}
- +
); }); diff --git a/src/utils/api.ts b/src/utils/api.ts index 7dd7d019dc0..e12c1ce5278 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -12,15 +12,73 @@ async function fetchProducts(url: string): Promise { ); } - return response.json(); + return response.json().then(obj => { + if (!obj || typeof obj !== 'object') { + throw new Error('Invalid response format: Expected an object'); + } + + return obj.data as T; + }); +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +async function fetchSpecificProducts(url: string): Promise { + const response = await fetch(url); + + if (!response.ok) { + const errorData = await response.json(); + + throw new Error( + `Error: ${response.statusText} - ${errorData.message || 'Unknown error'}`, + ); + } + + return response.json().then(obj => { + if (!obj || typeof obj !== 'object') { + throw new Error('Invalid response format: Expected an object'); + } + + return obj as T; + }); +} + +export function fetchProductsWithDelay( + url: string, + delay: number, +): Promise { + return new Promise((resolve, reject) => { + setTimeout(() => { + fetchProducts(url).then(resolve).catch(reject); + }, delay); + }); +} + +export function getAvailableProductsByCategory( + category: string, +): Promise { + return fetchProducts( + `https://localhost:4000/${category}`, + // `./api/${category}.json`, + ); } export function getAllProducts(): Promise { - return fetchProducts('./api/products.json'); + return fetchProducts('https://localhost:4000/products'); } +// fetchProducts +// 'https://localhost:4000/products' +// './api/products.json' export function getSpecificProducts( productsType: string, ): Promise { - return fetchProducts(`./api/${productsType}.json`); + const specificProducts = fetchProducts( + `https://localhost:4000/${productsType}`, + // `./api/${productsType}.json`, + ); + + return specificProducts; + // return fetchProducts( + // `https://localhost:4000/${productsType}`, + // ); } diff --git a/tsconfig.json b/tsconfig.json index c93972998cf..49501cd983f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "compilerOptions": { "sourceMap": false, "types": ["node", "cypress"], - "baseUrl": "./src" + "baseUrl": "./src", + "ignoreDeprecations": "6.0" } }