From e174e271aafec3dcbfd2d7869e85c54198f01c69 Mon Sep 17 00:00:00 2001 From: ioay Date: Sun, 3 Mar 2024 18:33:12 +0100 Subject: [PATCH] Activities bar - added carousel --- dapp/package.json | 3 +- dapp/src/components/GlobalStyles/carousel.tsx | 0 dapp/src/components/GlobalStyles/index.tsx | 5 + .../shared/Activities/ActivityBar.tsx | 27 +++++ .../Activities/ActivityCard/ActivityCard.tsx | 92 ++++++++++++++++ .../ActivityCard}/ActivityCardContainer.tsx | 4 +- .../ActivityCard/ActivityCardLink.tsx | 28 +++++ .../shared/Activities/ActivityCard/index.tsx | 1 + .../ActivityCarousel/ActivityCarousel.tsx | 58 ++++++++++ .../Activities/ActivityCarousel/index.tsx | 1 + .../ActivityCarousel/utils/carouselArrows.tsx | 43 ++++++++ .../utils/carouselSettings.tsx | 81 ++++++++++++++ .../ActivityCarousel/utils/index.ts | 2 + .../components/shared/Activities/index.tsx | 2 + .../shared/Activities/mock-activities.ts | 67 ++++++++++++ .../shared/ActivityBar/ActivityCard.tsx | 87 --------------- .../components/shared/ActivityBar/index.tsx | 35 ------ .../shared/ActivityBar/mock-activities.ts | 25 ----- dapp/src/pages/ActivityPage/index.tsx | 4 +- dapp/src/pages/OverviewPage/DocsCard.tsx | 33 ++++++ dapp/src/pages/OverviewPage/index.tsx | 29 +++-- pnpm-lock.yaml | 102 ++++++++++++++++-- 22 files changed, 551 insertions(+), 178 deletions(-) create mode 100644 dapp/src/components/GlobalStyles/carousel.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityBar.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCard/ActivityCard.tsx rename dapp/src/components/shared/{ActivityBar => Activities/ActivityCard}/ActivityCardContainer.tsx (93%) create mode 100644 dapp/src/components/shared/Activities/ActivityCard/ActivityCardLink.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCard/index.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCarousel/ActivityCarousel.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCarousel/index.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselArrows.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselSettings.tsx create mode 100644 dapp/src/components/shared/Activities/ActivityCarousel/utils/index.ts create mode 100644 dapp/src/components/shared/Activities/index.tsx create mode 100644 dapp/src/components/shared/Activities/mock-activities.ts delete mode 100644 dapp/src/components/shared/ActivityBar/ActivityCard.tsx delete mode 100644 dapp/src/components/shared/ActivityBar/index.tsx delete mode 100644 dapp/src/components/shared/ActivityBar/mock-activities.ts create mode 100644 dapp/src/pages/OverviewPage/DocsCard.tsx diff --git a/dapp/package.json b/dapp/package.json index e23e66b5f..429603c06 100644 --- a/dapp/package.json +++ b/dapp/package.json @@ -24,15 +24,16 @@ "@sentry/react": "^7.98.0", "@sentry/types": "^7.102.0", "@tanstack/react-table": "^8.11.3", + "@types/react-slick": "^0.23.13", "axios": "^1.6.7", "ethers": "^6.10.0", - "axios": "^1.6.7", "formik": "^2.4.5", "framer-motion": "^10.16.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-number-format": "^5.3.1", "react-router-dom": "^6.22.0", + "react-slick": "^0.30.2", "recharts": "^2.12.0" }, "devDependencies": { diff --git a/dapp/src/components/GlobalStyles/carousel.tsx b/dapp/src/components/GlobalStyles/carousel.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/dapp/src/components/GlobalStyles/index.tsx b/dapp/src/components/GlobalStyles/index.tsx index e8b11945a..a07e07242 100644 --- a/dapp/src/components/GlobalStyles/index.tsx +++ b/dapp/src/components/GlobalStyles/index.tsx @@ -41,6 +41,11 @@ export default function GlobalStyles() { font-weight: 900; font-style: normal; } + // We need to add this style, because of using chakra-ui & react-slick package. + // react-slick doesn't generate flex display style for auto-generated slick-track wrapper. + .slick-track { + display: flex; + } `} /> ) diff --git a/dapp/src/components/shared/Activities/ActivityBar.tsx b/dapp/src/components/shared/Activities/ActivityBar.tsx new file mode 100644 index 000000000..c9236e91f --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityBar.tsx @@ -0,0 +1,27 @@ +import React, { useCallback, useState } from "react" +import { Flex } from "@chakra-ui/react" +import { ActivityCard } from "./ActivityCard" +import { mockedActivities } from "./mock-activities" + +export function ActivityBar() { + // TODO: Lines 8-18 should be replaced by redux store when subgraphs are implemented + const [activities, setActivities] = useState(mockedActivities) + + const onRemove = useCallback( + (activityHash: string) => { + const filteredActivities = activities.filter( + (activity) => activity.txHash !== activityHash, + ) + setActivities(filteredActivities) + }, + [activities], + ) + + return ( + + {activities.map((activity) => ( + + ))} + + ) +} diff --git a/dapp/src/components/shared/Activities/ActivityCard/ActivityCard.tsx b/dapp/src/components/shared/Activities/ActivityCard/ActivityCard.tsx new file mode 100644 index 000000000..471490e45 --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCard/ActivityCard.tsx @@ -0,0 +1,92 @@ +import React, { useCallback } from "react" +import { + CardBody, + CardFooter, + CardHeader, + CardProps, + HStack, + Icon, + Tooltip, + CloseButton, +} from "@chakra-ui/react" +import { useLocation } from "react-router-dom" +import { ActivityInfo, LocationState } from "#/types" +import { capitalize } from "#/utils" +import { ChevronRightIcon } from "#/assets/icons" +import { CurrencyBalance } from "#/components/shared/CurrencyBalance" +import StatusInfo from "#/components/shared/StatusInfo" +import { TextSm } from "#/components/shared/Typography" +import { ActivityCardContainer } from "./ActivityCardContainer" +import { ActivityCardLink } from "./ActivityCardLink" + +type ActivityCardType = CardProps & { + activity: ActivityInfo + onRemove: (txHash: string) => void +} + +export function ActivityCard({ + activity, + onRemove, + ...props +}: ActivityCardType) { + const state = useLocation().state as LocationState | null + const isActive = state ? activity.txHash === state.activity.txHash : false + const isCompleted = activity.status === "completed" + + const onClose = useCallback( + (event: React.MouseEvent) => { + event.preventDefault() + if (activity.txHash) { + onRemove(activity.txHash) + } + }, + [onRemove, activity.txHash], + ) + + return ( + + + + + + {isCompleted ? ( + + + + ) : ( + + )} + + + + + {capitalize(activity.action)} + + + + + + + + ) +} diff --git a/dapp/src/components/shared/ActivityBar/ActivityCardContainer.tsx b/dapp/src/components/shared/Activities/ActivityCard/ActivityCardContainer.tsx similarity index 93% rename from dapp/src/components/shared/ActivityBar/ActivityCardContainer.tsx rename to dapp/src/components/shared/Activities/ActivityCard/ActivityCardContainer.tsx index 2c6256e38..7ef9931c4 100644 --- a/dapp/src/components/shared/ActivityBar/ActivityCardContainer.tsx +++ b/dapp/src/components/shared/Activities/ActivityCard/ActivityCardContainer.tsx @@ -34,7 +34,7 @@ const activeStyles = { }, } -function ActivityCardContainer({ +export function ActivityCardContainer({ isActive, isCompleted, children, @@ -60,5 +60,3 @@ function ActivityCardContainer({ ) } - -export default ActivityCardContainer diff --git a/dapp/src/components/shared/Activities/ActivityCard/ActivityCardLink.tsx b/dapp/src/components/shared/Activities/ActivityCard/ActivityCardLink.tsx new file mode 100644 index 000000000..f03f0a050 --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCard/ActivityCardLink.tsx @@ -0,0 +1,28 @@ +import React from "react" + +import { Link as ReactRouterLink } from "react-router-dom" +import { Link as ChakraLink } from "@chakra-ui/react" +import { ActivityInfo } from "#/types" + +type ActivityCardLinkProps = { + activity: ActivityInfo + children: React.ReactNode +} + +export function ActivityCardLink({ + activity, + children, + ...props +}: ActivityCardLinkProps) { + return ( + + {children} + + ) +} diff --git a/dapp/src/components/shared/Activities/ActivityCard/index.tsx b/dapp/src/components/shared/Activities/ActivityCard/index.tsx new file mode 100644 index 000000000..30379b1d9 --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCard/index.tsx @@ -0,0 +1 @@ +export * from "./ActivityCard" diff --git a/dapp/src/components/shared/Activities/ActivityCarousel/ActivityCarousel.tsx b/dapp/src/components/shared/Activities/ActivityCarousel/ActivityCarousel.tsx new file mode 100644 index 000000000..34fc4a4ad --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCarousel/ActivityCarousel.tsx @@ -0,0 +1,58 @@ +import React, { useCallback, useRef, useState } from "react" +import Slider from "react-slick" +import { Box, HStack, BoxProps } from "@chakra-ui/react" +import { ActivityCard } from "../ActivityCard" +import { activityCarouselSettings } from "./utils" +import { mockedActivities } from "../mock-activities" + +export function ActivityCarousel({ ...props }: BoxProps) { + const sliderRef = useRef(null) + + // TODO: Lines 12-30 should be replaced by redux store when subgraphs are implemented + const [activities, setActivities] = useState(mockedActivities) + + const onRemove = useCallback( + (activityHash: string) => { + const removedIndex = activities.findIndex( + (activity) => activity.txHash === activityHash, + ) + const filteredActivities = activities.filter( + (activity) => activity.txHash !== activityHash, + ) + const isLastCard = removedIndex === activities.length - 1 + if (isLastCard) { + sliderRef.current?.slickPrev() + } + sliderRef.current?.forceUpdate() + setActivities(filteredActivities) + }, + [activities], + ) + + return ( + + + {activities.map((activity) => ( + + ))} + + + ) +} diff --git a/dapp/src/components/shared/Activities/ActivityCarousel/index.tsx b/dapp/src/components/shared/Activities/ActivityCarousel/index.tsx new file mode 100644 index 000000000..47ef26c1e --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCarousel/index.tsx @@ -0,0 +1 @@ +export * from "./ActivityCarousel" diff --git a/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselArrows.tsx b/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselArrows.tsx new file mode 100644 index 000000000..efc454833 --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselArrows.tsx @@ -0,0 +1,43 @@ +import React from "react" +import { CustomArrowProps } from "react-slick" +import { Box, IconButton, IconButtonProps } from "@chakra-ui/react" +import { ArrowLeft, ArrowRight } from "#/assets/icons" + +type PaginationArrowType = CustomArrowProps & IconButtonProps + +function PaginationArrow({ icon, onClick, ...props }: PaginationArrowType) { + return ( + + ) +} + +export function PrevArrowCarousel({ onClick }: CustomArrowProps) { + return ( + + } + aria-label="prev" + /> + + ) +} +export function NextArrowCarousel({ onClick }: CustomArrowProps) { + return ( + + } + aria-label="next" + /> + + ) +} diff --git a/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselSettings.tsx b/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselSettings.tsx new file mode 100644 index 000000000..bcaa1ec3b --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCarousel/utils/carouselSettings.tsx @@ -0,0 +1,81 @@ +import React from "react" +import { NextArrowCarousel, PrevArrowCarousel } from "./carouselArrows" + +/* * + * Settings for react-slick carousel. + * Breakpoints are calculated based on with & visibility of activity card. + * slidesToShow attr is needed to correctly display the number of cards in the carousel + * and it depends on the width of the viewport. + * */ +export const activityCarouselSettings = { + dots: false, + infinite: false, + speed: 500, + slidesToShow: 4, + slidesToScroll: 1, + variableWidth: true, + nextArrow: , + prevArrow: , + responsive: [ + { + breakpoint: 820, + settings: { + slidesToShow: 1, + }, + }, + { + breakpoint: 1080, + settings: { + slidesToShow: 2, + }, + }, + { + breakpoint: 1360, + settings: { + slidesToShow: 3, + }, + }, + { + breakpoint: 1620, + settings: { + slidesToShow: 4, + }, + }, + { + breakpoint: 1900, + settings: { + slidesToShow: 5, + }, + }, + { + breakpoint: 2160, + settings: { + slidesToShow: 6, + }, + }, + { + breakpoint: 2440, + settings: { + slidesToShow: 7, + }, + }, + { + breakpoint: 2700, + settings: { + slidesToShow: 8, + }, + }, + { + breakpoint: 2980, + settings: { + slidesToShow: 9, + }, + }, + { + breakpoint: 3240, + settings: { + slidesToShow: 10, + }, + }, + ], +} diff --git a/dapp/src/components/shared/Activities/ActivityCarousel/utils/index.ts b/dapp/src/components/shared/Activities/ActivityCarousel/utils/index.ts new file mode 100644 index 000000000..15749ecf0 --- /dev/null +++ b/dapp/src/components/shared/Activities/ActivityCarousel/utils/index.ts @@ -0,0 +1,2 @@ +export * from "./carouselArrows" +export * from "./carouselSettings" diff --git a/dapp/src/components/shared/Activities/index.tsx b/dapp/src/components/shared/Activities/index.tsx new file mode 100644 index 000000000..f1f7edeea --- /dev/null +++ b/dapp/src/components/shared/Activities/index.tsx @@ -0,0 +1,2 @@ +export * from "./ActivityBar" +export * from "./ActivityCarousel" diff --git a/dapp/src/components/shared/Activities/mock-activities.ts b/dapp/src/components/shared/Activities/mock-activities.ts new file mode 100644 index 000000000..a6efd2a2a --- /dev/null +++ b/dapp/src/components/shared/Activities/mock-activities.ts @@ -0,0 +1,67 @@ +import { ActivityInfo } from "#/types" + +export const mockedActivities: ActivityInfo[] = [ + { + amount: 324000000, + action: "stake", + currency: "bitcoin", + txHash: "2dc2341e6c8463b8731eeb356e52acb7", + status: "syncing", + }, + { + amount: 524000000, + action: "unstake", + currency: "bitcoin", + txHash: "92eb5ffee6ae2fec3ad71c777531578f", + status: "pending", + }, + { + amount: 224000000, + action: "receive", + currency: "bitcoin", + txHash: "0cc175b9c0f1b6a831c399e269772661", + status: "completed", + }, + { + amount: 324000000, + action: "stake", + currency: "bitcoin", + txHash: "2dc2341e6c8463b8731eeb356e52aca1", + status: "syncing", + }, + { + amount: 524000000, + action: "unstake", + currency: "bitcoin", + txHash: "92eb5ffee6ae2fec3ad71c77753157a2", + status: "pending", + }, + { + amount: 224000000, + action: "receive", + currency: "bitcoin", + txHash: "0cc175b9c0f1b6a831c399e2697726a3", + status: "completed", + }, + { + amount: 324000000, + action: "stake", + currency: "bitcoin", + txHash: "2dc2341e6c8463b8731eeb356e52aca4", + status: "syncing", + }, + { + amount: 524000000, + action: "unstake", + currency: "bitcoin", + txHash: "92eb5ffee6ae2fec3ad71c77753157a5", + status: "pending", + }, + { + amount: 224000000, + action: "receive", + currency: "bitcoin", + txHash: "0cc175b9c0f1b6a831c399e2697726a6", + status: "completed", + }, +] diff --git a/dapp/src/components/shared/ActivityBar/ActivityCard.tsx b/dapp/src/components/shared/ActivityBar/ActivityCard.tsx deleted file mode 100644 index 96e8cc8ba..000000000 --- a/dapp/src/components/shared/ActivityBar/ActivityCard.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import React, { useCallback } from "react" -import { - CardBody, - CardFooter, - CardHeader, - CardProps, - HStack, - Icon, - Tooltip, - CloseButton, -} from "@chakra-ui/react" -import { useLocation } from "react-router-dom" -import { ActivityInfo, LocationState } from "#/types" -import { capitalize } from "#/utils" -import { ChevronRightIcon } from "#/assets/icons" -import { CurrencyBalance } from "#/components/shared/CurrencyBalance" -import StatusInfo from "#/components/shared/StatusInfo" -import { TextSm } from "#/components/shared/Typography" -import ActivityCardContainer from "./ActivityCardContainer" - -type ActivityCardType = CardProps & { - activity: ActivityInfo - onRemove: (txHash: string) => void -} - -function ActivityCard({ activity, onRemove }: ActivityCardType) { - const state = useLocation().state as LocationState | null - const isActive = state ? activity.txHash === state.activity.txHash : false - const isCompleted = activity.status === "completed" - - const onClose = useCallback( - (event: React.MouseEvent) => { - event.preventDefault() - if (activity.txHash) { - onRemove(activity.txHash) - } - }, - [onRemove, activity.txHash], - ) - - return ( - - - - - {isCompleted ? ( - - - - ) : ( - - )} - - - - - {capitalize(activity.action)} - - - - - - - ) -} - -export default ActivityCard diff --git a/dapp/src/components/shared/ActivityBar/index.tsx b/dapp/src/components/shared/ActivityBar/index.tsx deleted file mode 100644 index 4eb65f505..000000000 --- a/dapp/src/components/shared/ActivityBar/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useCallback, useState } from "react" -import { Link as ReactRouterLink } from "react-router-dom" -import { Flex, Link as ChakraLink, FlexboxProps } from "@chakra-ui/react" -import ActivityCard from "./ActivityCard" -import { mockedActivities } from "./mock-activities" - -function ActivityBar(props: FlexboxProps) { - const [activities, setActivities] = useState(mockedActivities) - - const onRemove = useCallback( - (activityHash: string) => { - const filteredActivities = activities.filter( - (activity) => activity.txHash !== activityHash, - ) - setActivities(filteredActivities) - }, - [activities], - ) - return ( - - {activities.map((activity) => ( - - - - ))} - - ) -} - -export default ActivityBar diff --git a/dapp/src/components/shared/ActivityBar/mock-activities.ts b/dapp/src/components/shared/ActivityBar/mock-activities.ts deleted file mode 100644 index 022f925fd..000000000 --- a/dapp/src/components/shared/ActivityBar/mock-activities.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ActivityInfo } from "#/types" - -export const mockedActivities: ActivityInfo[] = [ - { - amount: 324000000, - action: "stake", - currency: "bitcoin", - txHash: "2dc2341e6c8463b8731eeb356e52acb7", - status: "syncing", - }, - { - amount: 524000000, - action: "unstake", - currency: "bitcoin", - txHash: "92eb5ffee6ae2fec3ad71c777531578f", - status: "pending", - }, - { - amount: 224000000, - action: "receive", - currency: "bitcoin", - txHash: "0cc175b9c0f1b6a831c399e269772661", - status: "completed", - }, -] diff --git a/dapp/src/pages/ActivityPage/index.tsx b/dapp/src/pages/ActivityPage/index.tsx index 8295d008f..77afcc62a 100644 --- a/dapp/src/pages/ActivityPage/index.tsx +++ b/dapp/src/pages/ActivityPage/index.tsx @@ -4,7 +4,7 @@ import { Flex, Link as ChakraLink, Icon } from "@chakra-ui/react" import { Link as ReactRouterLink } from "react-router-dom" import { useSidebar } from "#/hooks" import { ArrowLeft } from "#/assets/icons" -import ActivityBar from "#/components/shared/ActivityBar" +import { ActivityBar } from "#/components/shared/Activities" import ActivityDetails from "./ActivityDetails" export default function ActivityPage() { @@ -29,7 +29,7 @@ export default function ActivityPage() { /> - + diff --git a/dapp/src/pages/OverviewPage/DocsCard.tsx b/dapp/src/pages/OverviewPage/DocsCard.tsx new file mode 100644 index 000000000..2844e6a75 --- /dev/null +++ b/dapp/src/pages/OverviewPage/DocsCard.tsx @@ -0,0 +1,33 @@ +import React from "react" +import { Card } from "@chakra-ui/react" +import { useDocsDrawer } from "#/hooks" +import { TextSm } from "#/components/shared/Typography" +import ButtonLink from "#/components/shared/ButtonLink" + +export function DocsCard() { + const { onOpen } = useDocsDrawer() + + return ( + + + Documentation + + + Everything you need to know about our contracts. + + ) +} diff --git a/dapp/src/pages/OverviewPage/index.tsx b/dapp/src/pages/OverviewPage/index.tsx index 54bb52d8b..3ebbf743d 100644 --- a/dapp/src/pages/OverviewPage/index.tsx +++ b/dapp/src/pages/OverviewPage/index.tsx @@ -1,37 +1,36 @@ import React from "react" -import { Flex, Grid, HStack, Switch } from "@chakra-ui/react" -import { useDocsDrawer } from "#/hooks" +import { Flex, Grid, HStack, SimpleGrid, Switch } from "@chakra-ui/react" import { TextSm } from "#/components/shared/Typography" import { USD } from "#/constants" -import ButtonLink from "#/components/shared/ButtonLink" +import { ActivityCarousel } from "#/components/shared/Activities/" import PositionDetails from "./PositionDetails" import Statistics from "./Statistics" import TransactionHistory from "./TransactionHistory" -import ActivityBar from "../../components/shared/ActivityBar" +import { DocsCard } from "./DocsCard" export default function OverviewPage() { - const { onOpen } = useDocsDrawer() - return ( - - + + {/* TODO: Handle click actions */} Show values in {USD.symbol} - - - - Docs - - + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbc589b20..df065c1f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,9 +150,12 @@ importers: '@tanstack/react-table': specifier: ^8.11.3 version: 8.11.7(react-dom@18.2.0)(react@18.2.0) + '@types/react-slick': + specifier: ^0.23.13 + version: 0.23.13 axios: specifier: ^1.6.7 - version: 1.6.7(debug@4.3.4) + version: 1.6.7 ethers: specifier: ^6.10.0 version: 6.10.0 @@ -174,6 +177,9 @@ importers: react-router-dom: specifier: ^6.22.0 version: 6.22.0(react-dom@18.2.0)(react@18.2.0) + react-slick: + specifier: ^0.30.2 + version: 0.30.2(react-dom@18.2.0)(react@18.2.0) recharts: specifier: ^2.12.0 version: 2.12.0(react-dom@18.2.0)(react@18.2.0) @@ -425,7 +431,7 @@ packages: '@babel/traverse': 7.23.4 '@babel/types': 7.23.4 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1724,7 +1730,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.4 '@babel/types': 7.23.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3449,7 +3455,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.6.1 globals: 13.23.0 ignore: 5.3.0 @@ -4038,7 +4044,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6837,6 +6843,12 @@ packages: '@types/react': 18.2.38 dev: true + /@types/react-slick@0.23.13: + resolution: {integrity: sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==} + dependencies: + '@types/react': 18.2.38 + dev: false + /@types/react@18.2.38: resolution: {integrity: sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==} dependencies: @@ -6941,7 +6953,7 @@ packages: '@typescript-eslint/type-utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.3.0 @@ -6986,7 +6998,7 @@ packages: '@typescript-eslint/types': 6.12.0 '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.54.0 typescript: 5.3.2 transitivePeerDependencies: @@ -7037,7 +7049,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.54.0 ts-api-utils: 1.0.3(typescript@5.3.2) typescript: 5.3.2 @@ -7084,7 +7096,7 @@ packages: dependencies: '@typescript-eslint/types': 6.12.0 '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -7804,6 +7816,16 @@ packages: transitivePeerDependencies: - debug + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axios@1.6.7(debug@4.3.4): resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: @@ -7812,6 +7834,7 @@ packages: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + dev: true /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -8832,6 +8855,10 @@ packages: node-gyp-build: 4.7.0 dev: true + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: false + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -9662,6 +9689,17 @@ packages: dependencies: ms: 2.1.3 + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -10187,6 +10225,10 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 + /enquire.js@2.1.6: + resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==} + dev: false + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -10819,7 +10861,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -11592,6 +11634,16 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /follow-redirects@1.15.5(debug@4.3.4): resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} @@ -11602,6 +11654,7 @@ packages: optional: true dependencies: debug: 4.3.4(supports-color@8.1.1) + dev: true /follow-redirects@1.5.10: resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} @@ -14238,6 +14291,12 @@ packages: delimit-stream: 0.1.0 dev: false + /json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + dependencies: + string-convert: 0.2.1 + dev: false + /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -16739,6 +16798,21 @@ packages: react: 18.2.0 dev: false + /react-slick@0.30.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==} + peerDependencies: + react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + classnames: 2.5.1 + enquire.js: 2.1.6 + json2mq: 0.2.0 + lodash.debounce: 4.0.8 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + dev: false + /react-smooth@4.0.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2NMXOBY1uVUQx1jBeENGA497HK20y6CPGYL1ZnJLeoQ8rrc3UfmOM82sRxtzpcoCkUMy4CS0RGylfuVhuFjBgg==} peerDependencies: @@ -17037,6 +17111,10 @@ packages: /require-package-name@2.0.1: resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -17843,6 +17921,10 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + /string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + dev: false + /string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} dev: true