diff --git a/package.json b/package.json index 40f31186d..fb886a7b9 100644 --- a/package.json +++ b/package.json @@ -182,7 +182,7 @@ "prop-types": "^15.8.1", "storybook": "^8.1.1", "ts-node": "^10.9.1", - "typescript": "~5.1.6", + "typescript": "~5.3.3", "unplugin-fonts": "^1.1.1", "vite-plugin-svgr": "^4.2.0", "vite-tsconfig-paths": "^5.0.1", diff --git a/src/components/Layout/Header/MobileNavBar/MobileNavBarContent.tsx b/src/components/Layout/Header/MobileNavBar/MobileNavBarContent.tsx index bdbfabfe0..45f2ff9fa 100644 --- a/src/components/Layout/Header/MobileNavBar/MobileNavBarContent.tsx +++ b/src/components/Layout/Header/MobileNavBar/MobileNavBarContent.tsx @@ -10,6 +10,7 @@ import { SNavBarItemHidden } from "./MobileNavBar.styled" import { MobileNavBarItem } from "./MobileNavBarItem" import { MoreButton } from "./MoreButton" import { SNoFunBadge } from "components/Layout/Header/menu/HeaderMenu.styled" +import { useState } from "react" export const MobileNavBarContent = () => { const { t } = useTranslation() @@ -17,6 +18,8 @@ export const MobileNavBarContent = () => { const search = useSearch() const isMediumMedia = useMedia(theme.viewport.gte.sm) + const [activeSubMenu, setActiveSubMenu] = useState(null) + const [visibleTabs, hiddenTabs] = MENU_ITEMS.filter( (item) => item.enabled && !(item.asyncEnabled && !featureFlags[item.key]), ).reduce( @@ -53,7 +56,18 @@ export const MobileNavBarContent = () => { .sort((a, b) => a.mobOrder - b.mobOrder) .map((item, index) => { if (item.subItems?.length) { - return + return ( + + setActiveSubMenu((prev) => + prev === item.key ? null : item.key, + ) + } + key={index} + item={item} + /> + ) } if (item.external) { return ( diff --git a/src/components/Layout/Header/menu/HeaderMenu.tsx b/src/components/Layout/Header/menu/HeaderMenu.tsx index 64ece07b1..9e5d6a701 100644 --- a/src/components/Layout/Header/menu/HeaderMenu.tsx +++ b/src/components/Layout/Header/menu/HeaderMenu.tsx @@ -22,13 +22,26 @@ export const HeaderMenu = () => { const { items, hiddenItems, moreButtonKey, observe } = useVisibleHeaderMenuItems() + const [activeSubMenu, setActiveSubMenu] = useState(null) + return (
{items.map((item, i) => { if (item.subItems?.length) { - return + return ( + + setActiveSubMenu((prev) => + prev === item.key ? null : item.key, + ) + } + /> + ) } if (item.external) { diff --git a/src/components/Layout/Header/menu/HeaderSubMenu.tsx b/src/components/Layout/Header/menu/HeaderSubMenu.tsx index 7d2905e99..62a83b6fa 100644 --- a/src/components/Layout/Header/menu/HeaderSubMenu.tsx +++ b/src/components/Layout/Header/menu/HeaderSubMenu.tsx @@ -8,11 +8,11 @@ import { import IconChevron from "assets/icons/ChevronDown.svg?react" import IconArrow from "assets/icons/IconArrow.svg?react" import { Text } from "components/Typography/Text/Text" -import React, { useState } from "react" +import React, { useMemo } from "react" import { useTranslation } from "react-i18next" import { useMedia } from "react-use" import { theme } from "theme" -import { TabItemWithSubItems, resetSearchParams } from "utils/navigation" +import { LINKS, TabItemWithSubItems, resetSearchParams } from "utils/navigation" import { SArrow, SItem, @@ -21,33 +21,59 @@ import { SSubMenuItem, } from "./HeaderMenu.styled" import { MobileNavBarItem } from "components/Layout/Header/MobileNavBar/MobileNavBarItem" +import { useAccountAssets } from "api/deposits" -type Props = { item: TabItemWithSubItems } +type HeaderSubMenuProps = { + isOpen: boolean + onOpenChange: () => void + item: TabItemWithSubItems +} -export const HeaderSubMenu = ({ item }: Props) => { +export const HeaderSubMenu: React.FC = ({ + item, + isOpen, + onOpenChange, +}) => { const { t } = useTranslation() - const [open, setOpen] = useState(false) const navigate = useNavigate() const isTablet = useMedia(theme.viewport.gte.sm) const match = useMatchRoute() - const { key, subItems } = item + const balances = useAccountAssets() + + const isPoolBalances = !!balances.data?.isAnyPoolPositions + + const { href, key, subItems } = item const isActive = subItems.some(({ href }) => match({ to: href })) - const filteredItems = subItems.filter((subItem) => subItem.enabled) + + const filteredItems = useMemo(() => { + return subItems.filter((subItem) => { + if (subItem.key === "liquidity.myLiquidity") { + return isPoolBalances + } + + return subItem.enabled + }) + }, [isPoolBalances, subItems]) return ( - + { e.preventDefault() e.stopPropagation() - setOpen((prev) => !prev) + onOpenChange() const firstLink = filteredItems?.[0] - isTablet && firstLink && navigate({ to: firstLink.href }) + + if (href === LINKS.borrow) { + navigate({ to: href }) + } else { + navigate({ to: firstLink?.href ?? href }) + } }} onPointerDown={(e) => { e.preventDefault() @@ -60,16 +86,16 @@ export const HeaderSubMenu = ({ item }: Props) => { ) : ( - + )} ({ ...subItem, - title: t(`header.${key}.${subItem.key}.title`), - subtitle: t(`header.${key}.${subItem.key}.subtitle`), + title: t(`header.${subItem.key}.title`), + subtitle: t(`header.${subItem.key}.subtitle`), }))} - onItemClick={() => setOpen(false)} + onItemClick={onOpenChange} /> ) @@ -110,7 +136,14 @@ export const HeaderSubMenuContents: React.FC = ({ onClick={onItemClick} > - +
{title} diff --git a/src/components/Layout/Page/Page.tsx b/src/components/Layout/Page/Page.tsx index c2ae1e5c1..3dc7f56fc 100644 --- a/src/components/Layout/Page/Page.tsx +++ b/src/components/Layout/Page/Page.tsx @@ -79,6 +79,7 @@ const useSubheaderComponent = () => { if ( matchRoute({ to: LINKS.borrow }) || + matchRoute({ to: LINKS.borrowDashboard }) || matchRoute({ to: LINKS.borrowMarkets }) ) { return @@ -93,7 +94,7 @@ const useSubheaderComponent = () => { ) : ( ) } diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 548ee3794..c8703cfe1 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -121,6 +121,24 @@ "header.trade.dca.subtitle": "Spread your Omnipool trades over time", "header.trade.yieldDca.title": "Yield DCA", "header.trade.yieldDca.subtitle": "Diversify your yield from staked DOT", + "header.borrow.dashboard.title": "My Dashboard", + "header.borrow.dashboard.subtitle": "", + "header.borrow.markets.title": "Markets", + "header.borrow.markets.subtitle": "", + "header.liquidity.myLiquidity.title": "My Liquidity", + "header.liquidity.myLiquidity.subtitle": "", + "header.liquidity.allPools.title": "All Pools", + "header.liquidity.allPools.subtitle": "", + "header.liquidity.omnipoolAndStablepool.title": "Omnipool & Stablepool", + "header.liquidity.omnipoolAndStablepool.subtitle": "", + "header.liquidity.isolated.title": "Isolated pools", + "header.liquidity.isolated.subtitle": "", + "header.wallet.yourAssets.title": "Your Assets", + "header.wallet.yourAssets.subtitle": "", + "header.wallet.transactions.title": "Transactions", + "header.wallet.transactions.subtitle": "", + "header.wallet.vesting.title": "Vesting", + "header.wallet.vesting.subtitle": "", "header.liquidity": "Liquidity", "header.wallet": "Wallet", "header.more": "More", @@ -161,10 +179,6 @@ "value.token": "{{ value, bignumber(type: 'token') }}", "value.tokenWithSymbol": "{{ value, bignumber(type: 'token') }} {{symbol}}", "value.tokenWithHub": "{{ value, bignumber(type: 'token') }} {{ symbol }} + {{ hub, bignumber(type: 'token') }} {{hubSymbol}}", - "liquidity.navigation.myLiquidity": "My Liquidity", - "liquidity.navigation.allPools": "All Pools", - "liquidity.navigation.omnipoolAndStablepool": "Omnipool & Stablepool", - "liquidity.navigation.isolated": "Isolated pools", "liquidity.search.placeholder": "Search by pool name, token name or symbol", "liquidity.reserves": "Currency reserves", "liquidity.stablepool": "Stablepool", @@ -481,9 +495,6 @@ "wallet.header.assets": "Assets", "wallet.header.liquidity": "Liquidity", "wallet.header.farming": "Farming", - "wallet.header.yourAssets": "Your Assets", - "wallet.header.transactions": "Transactions", - "wallet.header.vesting": "Vesting", "wallet.header.switchAccount": "Switch account", "wallet.header.copyAddress.hover": "Copy to clipboard", "wallet.header.copyAddress.click": "Copied!", @@ -1044,9 +1055,7 @@ "lending.apyType.switch.title": "Select APY type to switch", "lending.apyType.switch.charts": "See charts", "lending.collateralUsage": "Collateral usage", - "lending.navigation.dashboard": "My Dashboard", "lending.navigation.dashboard.back": "Back to dashboard", - "lending.navigation.markets": "Markets", "lending.navigation.markets.back": "Back to markets", "lending.countdown.ongoing.title": "Borrowing is coming soon", "lending.countdown.expired.title": "Borrowing is coming soon", diff --git a/src/routes.tsx b/src/routes.tsx index 73f1e5243..e51194b83 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -118,6 +118,10 @@ const LendingPage = lazy(async () => ({ default: (await import("sections/lending/LendingPage")).LendingPage, })) +const LendingPageIndex = lazy(async () => ({ + default: (await import("sections/lending/LendingPage")).LendingPageIndex, +})) + const LendingDashboardPage = lazy(async () => ({ default: (await import("sections/lending/LendingDashboardPage")) .LendingDashboardPage, @@ -423,6 +427,14 @@ export const routes: Route[] = [ children: [ { path: "/", + element: ( + }> + + + ), + }, + { + path: LINKS.borrowDashboard.split("/").pop(), element: ( }> diff --git a/src/sections/lending/LendingPage.tsx b/src/sections/lending/LendingPage.tsx index a718c351d..646cf51da 100644 --- a/src/sections/lending/LendingPage.tsx +++ b/src/sections/lending/LendingPage.tsx @@ -1,8 +1,24 @@ -import { Outlet } from "@tanstack/react-location" +import { Navigate, Outlet } from "@tanstack/react-location" import { useRpcProvider } from "providers/rpcProvider" +import { useAppDataContext } from "sections/lending/hooks/app-data-provider/useAppDataProvider" import { LendingPageProviders } from "sections/lending/providers/LendingPageProviders" import { LendingDashboardSkeleton } from "sections/lending/skeleton/LendingDashboardSkeleton" import { useMarketChangeSubscription } from "sections/lending/utils/marketsAndNetworksConfig" +import { LINKS } from "utils/navigation" + +export const LendingPageIndex = () => { + const { user, loading } = useAppDataContext() + + if (loading) { + return + } + + if (user.netWorthUSD === "0") { + return + } + + return +} export const LendingPage = () => { useMarketChangeSubscription() diff --git a/src/sections/lending/components/primitives/Link.tsx b/src/sections/lending/components/primitives/Link.tsx index e0330008d..6bc0d9995 100644 --- a/src/sections/lending/components/primitives/Link.tsx +++ b/src/sections/lending/components/primitives/Link.tsx @@ -35,7 +35,7 @@ export const Link = forwardRef( ) export const ROUTES = { - dashboard: "/borrow", + dashboard: "/borrow/dashboard", markets: "/borrow/markets", faucet: "/borrow/faucet", migrationTool: "/borrow/v3-migration", diff --git a/src/sections/lending/components/transactions/Warnings/IsolationModeWarning.tsx b/src/sections/lending/components/transactions/Warnings/IsolationModeWarning.tsx index 80372ea73..b00b2d718 100644 --- a/src/sections/lending/components/transactions/Warnings/IsolationModeWarning.tsx +++ b/src/sections/lending/components/transactions/Warnings/IsolationModeWarning.tsx @@ -1,5 +1,4 @@ import { Alert } from "components/Alert" -import { Link } from "sections/lending/components/primitives/Link" import { Text } from "components/Typography/Text/Text" interface IsolationModeWarningProps { diff --git a/src/sections/lending/ui/navigation/Navigation.tsx b/src/sections/lending/ui/navigation/Navigation.tsx index 8ca01f2c1..18a331087 100644 --- a/src/sections/lending/ui/navigation/Navigation.tsx +++ b/src/sections/lending/ui/navigation/Navigation.tsx @@ -14,12 +14,12 @@ export const Navigation = () => { } - label={t("lending.navigation.dashboard")} + label={t("header.borrow.dashboard.title")} /> } - label={t("lending.navigation.markets")} + label={t("header.borrow.markets.title")} /> ) diff --git a/src/sections/pools/navigation/MyLiquidityTabLink.tsx b/src/sections/pools/navigation/MyLiquidityTabLink.tsx index 8127f8321..c7afa3c29 100644 --- a/src/sections/pools/navigation/MyLiquidityTabLink.tsx +++ b/src/sections/pools/navigation/MyLiquidityTabLink.tsx @@ -22,7 +22,7 @@ export const MyLiquidity = () => { icon={ } - label={t("liquidity.navigation.myLiquidity")} + label={t("header.liquidity.myLiquidity.title")} /> ({ })) const routeMap = new Map([ - [LINKS.allPools, t("liquidity.navigation.allPools")], - [LINKS.myLiquidity, t("liquidity.navigation.myLiquidity")], - [LINKS.omnipool, t("liquidity.navigation.omnipoolAndStablepool")], - [LINKS.isolated, t("liquidity.navigation.isolated")], + [LINKS.allPools, t("header.liquidity.allPools.title")], + [LINKS.myLiquidity, t("header.liquidity.myLiquidity.title")], + [LINKS.omnipool, t("header.liquidity.omnipoolAndStablepool.title")], + [LINKS.isolated, t("header.liquidity.isolated.title")], ]) export const Navigation = () => { @@ -33,17 +33,17 @@ export const Navigation = () => { } /> } /> } /> diff --git a/src/sections/wallet/navigation/Navigation.tsx b/src/sections/wallet/navigation/Navigation.tsx index a243bb0c3..cfda82a51 100644 --- a/src/sections/wallet/navigation/Navigation.tsx +++ b/src/sections/wallet/navigation/Navigation.tsx @@ -17,19 +17,19 @@ export const Navigation = () => { } - label={t("wallet.header.yourAssets")} + label={t("header.wallet.yourAssets.title")} /> {isDevelopment && ( } - label={t("wallet.header.transactions")} + label={t("header.wallet.transactions.title")} /> )} } - label={t("wallet.header.vesting")} + label={t("header.wallet.vesting.title")} /> ) diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts index af753fb65..0c5ce0acd 100644 --- a/src/utils/navigation.ts +++ b/src/utils/navigation.ts @@ -12,6 +12,12 @@ import ChainlinkIcon from "assets/icons/ChainlinkIcon.svg?react" import RocketIcon from "assets/icons/RocketIcon.svg?react" import IconYieldDCA from "assets/icons/YieldDcaIcon.svg?react" import IconPercentageSquare from "assets/icons/IconPercentageSquare.svg?react" +import AssetsIcon from "assets/icons/AssetsIcon.svg?react" +import UserIcon from "assets/icons/UserIcon.svg?react" +import AllPools from "assets/icons/AllPools.svg?react" +import IsolatedPools from "assets/icons/IsolatedPools.svg?react" +import OmniStablepools from "assets/icons/Omnipool&Stablepool.svg?react" +import PositionsIcon from "assets/icons/PositionsIcon.svg?react" import { Search } from "@tanstack/react-location" export const LINKS = { @@ -45,6 +51,7 @@ export const LINKS = { stakingGovernance: "/staking/governance", referrals: "/referrals", borrow: "/borrow", + borrowDashboard: "/borrow/dashboard", borrowMarkets: "/borrow/markets", memepad: "/memepad", submitTransaction: "/submit-transaction", @@ -56,17 +63,17 @@ export const MENU_ITEMS = [ href: LINKS.swap, Icon: TradeIcon, subItems: [ - { key: "swap", href: LINKS.swap, Icon: IconSwap, enabled: true }, - { key: "dca", href: LINKS.dca, Icon: IconDCA, enabled: true }, + { key: "trade.swap", href: LINKS.swap, Icon: IconSwap, enabled: true }, + { key: "trade.dca", href: LINKS.dca, Icon: IconDCA, enabled: true }, { - key: "yieldDca", + key: "trade.yieldDca", href: LINKS.yieldDca, Icon: IconYieldDCA, enabled: true, }, - { key: "otc", href: LINKS.otc, Icon: IconOTC, enabled: true }, + { key: "trade.otc", href: LINKS.otc, Icon: IconOTC, enabled: true }, { - key: "bonds", + key: "trade.bonds", href: LINKS.bonds, Icon: IconBonds, enabled: true, @@ -83,37 +90,94 @@ export const MENU_ITEMS = [ key: "borrow", href: LINKS.borrow, Icon: IconPercentageSquare, - subItems: undefined, enabled: true, external: false, mobVisible: false, tabVisible: true, mobOrder: 4, asyncEnabled: false, + subItems: [ + { + key: "borrow.dashboard", + href: LINKS.borrowDashboard, + Icon: UserIcon, + enabled: true, + }, + { + key: "borrow.markets", + href: LINKS.borrowMarkets, + Icon: AssetsIcon, + enabled: true, + }, + ], }, { key: "liquidity", href: LINKS.allPools, Icon: PoolsAndFarmsIcon, - subItems: undefined, enabled: true, external: false, mobVisible: true, tabVisible: true, mobOrder: 2, asyncEnabled: false, + subItems: [ + { + key: "liquidity.myLiquidity", + href: LINKS.myLiquidity, + Icon: UserIcon, + enabled: false, + }, + { + key: "liquidity.allPools", + href: LINKS.allPools, + Icon: AllPools, + enabled: true, + }, + { + key: "liquidity.omnipoolAndStablepool", + href: LINKS.omnipool, + Icon: OmniStablepools, + enabled: true, + }, + { + key: "liquidity.isolated", + href: LINKS.isolated, + Icon: IsolatedPools, + enabled: true, + }, + ], }, { key: "wallet", href: LINKS.walletAssets, Icon: WalletIcon, - subItems: undefined, enabled: true, external: false, mobVisible: true, tabVisible: true, mobOrder: 0, asyncEnabled: false, + subItems: [ + { + key: "wallet.yourAssets", + href: LINKS.walletAssets, + Icon: AssetsIcon, + enabled: true, + }, + { + key: "wallet.transactions", + href: LINKS.walletTransactions, + Icon: TransferIcon, + enabled: import.meta.env.VITE_ENV === "development", + }, + { + key: "wallet.vesting", + href: LINKS.walletVesting, + Icon: PositionsIcon, + enabled: true, + }, + ], }, { key: "xcm", diff --git a/yarn.lock b/yarn.lock index 1cbee3fff..d625b786a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11663,7 +11663,7 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -"prettier-fallback@npm:prettier@^3", prettier@^2.8.0, prettier@^3.1.1, prettier@^3.3.2: +"prettier-fallback@npm:prettier@^3": version "3.3.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== @@ -11675,6 +11675,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +prettier@^2.8.0, prettier@^3.1.1, prettier@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" + integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -12984,7 +12989,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -13441,10 +13453,10 @@ typescript@^4.4.3, typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typescript@~5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +typescript@~5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ua-parser-js@^1.0.35: version "1.0.38" @@ -14003,7 +14015,16 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^6.2.0, wrap-ansi@^8.1.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@7.0.0, wrap-ansi@^6.2.0, wrap-ansi@^8.1.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==