diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js index 345cfdee961..1896e0bfbd8 100644 --- a/.dependency-cruiser.js +++ b/.dependency-cruiser.js @@ -94,13 +94,14 @@ module.exports = { from: { path: '^src/app/features/.*' }, to: { path: '^src/app/pages/.*' }, }, - { - name: 'only-allow-react-icons-fi', - comment: 'Ensure only icons from `fi` group are allowed', - severity: 'error', - from: { path: '^src' }, - to: { path: 'react-icons.*', pathNot: 'react-icons/fi' }, - }, + // TODO: Replace in future with new icon library + // { + // name: 'only-allow-react-icons-fi', + // comment: 'Ensure only icons from `fi` group are allowed', + // severity: 'error', + // from: { path: '^src' }, + // to: { path: 'react-icons.*', pathNot: 'react-icons/fi' }, + // }, { name: 'no-using-pino-directly', comment: 'Enforce use of Pino logging library via @logger wrapper', diff --git a/.vscode/settings.json b/.vscode/settings.json index cdf2d7710b9..f26241ce518 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { "prettier.documentSelectors": ["src/**/*.{ts,tsx}", "*.{js,json}"], "vitest.include": ["src/**/*.spec.ts"], - "githubPullRequests.ignoredPullRequestBranches": ["dev"], - "editor.folding": false + "githubPullRequests.ignoredPullRequestBranches": ["dev"] } diff --git a/README.md b/README.md index 4059843a6b3..e024189f18b 100755 --- a/README.md +++ b/README.md @@ -7,8 +7,6 @@ Leather is the most popular and trusted wallet for apps built on Bitcoin. Connect to apps and manage assets secured by Bitcoin and Bitcoin L2s with battle-tested wallet for the Stacks blockchain. -To integrate this wallet into your app, we recommend [@stacks/connect](https://github.com/hirosystems/connect). - [📚 See Leather Developer Documentation →](https://leather.gitbook.io/developers/home/welcome) [📩 Join the mailing list for updates →](https://forms.gle/sdZPu2jbX1AeQ8Fi9) diff --git a/package.json b/package.json index 07689a5c9ea..0b1ca1a4f6b 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "dependencies": { "@bitcoinerlab/secp256k1": "1.0.2", "@coinbase/cbpay-js": "1.0.2", - "@dlc-link/dlc-tools": "1.0.4", + "@dlc-link/dlc-tools": "1.0.7", "@fungible-systems/zone-file": "2.0.0", "@hirosystems/token-metadata-api-client": "1.1.0", "@ledgerhq/hw-transport-webusb": "6.27.19", @@ -153,10 +153,6 @@ "@stacks/rpc-client": "1.0.3", "@stacks/storage": "6.9.0", "@stacks/transactions": "6.9.0", - "@stacks/ui": "7.10.0", - "@stacks/ui-core": "7.3.0", - "@stacks/ui-theme": "7.5.0", - "@stacks/ui-utils": "7.5.0", "@stacks/wallet-sdk": "6.9.0", "@stitches/react": "1.2.8", "@styled-system/theme-get": "5.1.2", @@ -197,12 +193,12 @@ "limiter": "2.1.0", "lodash.get": "4.4.2", "lodash.uniqby": "4.7.0", - "mdi-react": "9.2.0", "micro-packed": "0.3.2", "object-hash": "3.0.0", "observable-hooks": "4.2.3", "pino": "8.15.4", "postcss-preset-env": "9.1.4", + "prism-react-renderer": "2.2.0", "prismjs": "1.29.0", "promise-memoize": "1.2.1", "punycode": "2.3.0", @@ -213,7 +209,6 @@ "react-dom-confetti": "0.2.0", "react-head": "3.4.2", "react-hot-toast": "2.4.1", - "react-icons": "4.10.1", "react-intersection-observer": "9.5.2", "react-lottie": "1.2.3", "react-redux": "8.1.3", @@ -235,13 +230,10 @@ }, "devDependencies": { "@actions/core": "1.10.1", - "@babel/core": "7.23.0", - "@babel/preset-react": "7.22.15", - "@babel/preset-typescript": "7.23.0", "@btckit/types": "0.0.19", "@leather-wallet/prettier-config": "0.0.1", "@ls-lint/ls-lint": "2.1.0", - "@pandacss/dev": "0.17.0", + "@pandacss/dev": "0.18.3", "@playwright/test": "1.38.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", "@redux-devtools/cli": "3.0.2", @@ -277,7 +269,6 @@ "@typescript-eslint/parser": "6.7.4", "@vitest/coverage-istanbul": "0.34.6", "audit-ci": "6.6.1", - "babel-loader": "9.1.3", "base64-loader": "1.0.0", "bip32": "4.0.0", "blns": "2.0.4", @@ -292,7 +283,7 @@ "deepmerge": "4.3.1", "dependency-cruiser": "14.1.1", "dotenv-webpack": "8.0.1", - "esbuild": "0.19.4", + "esbuild": "0.19.7", "esbuild-loader": "4.0.2", "eslint-plugin-deprecation": "2.0.0", "eslint-plugin-react": "7.33.2", @@ -320,14 +311,15 @@ "vm-browserify": "1.1.2", "web-ext": "7.8.0", "web-ext-submit": "7.8.0", - "webpack": "5.88.2", - "webpack-bundle-analyzer": "4.9.1", + "webpack": "5.89.0", + "webpack-bundle-analyzer": "4.10.1", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1", "webpack-hot-middleware": "2.25.4", "webpack-shell-plugin": "0.5.0" }, "resolutions": { + "nanoid": "3.3.4", "socket.io-parser": "4.2.4", "**/**/bn.js": "5.2.1" }, diff --git a/public/assets/base.css b/public/assets/base.css index e0e4f0ec10d..d587b55a591 100644 --- a/public/assets/base.css +++ b/public/assets/base.css @@ -29,7 +29,8 @@ @font-face { font-family: 'Fira Code'; - src: url('/assets/fonts/fira-code/woff2/FiraCode-Light.woff2') format('woff2'), + src: + url('/assets/fonts/fira-code/woff2/FiraCode-Light.woff2') format('woff2'), url('/assets/fonts/fira-code/woff/FiraCode-Light.woff') format('woff'); font-weight: 300; font-style: normal; @@ -37,7 +38,8 @@ @font-face { font-family: 'Fira Code'; - src: url('/assets/fonts/fira-code/woff2/FiraCode-Regular.woff2') format('woff2'), + src: + url('/assets/fonts/fira-code/woff2/FiraCode-Regular.woff2') format('woff2'), url('/assets/fonts/fira-code/woff/FiraCode-Regular.woff') format('woff'); font-weight: 400; font-style: normal; diff --git a/public/assets/images/bitcoin-stamp.png b/public/assets/images/bitcoin-stamp.png deleted file mode 100644 index cc129286799..00000000000 Binary files a/public/assets/images/bitcoin-stamp.png and /dev/null differ diff --git a/public/assets/images/stamps-icon.png b/public/assets/images/stamps-icon.png new file mode 100644 index 00000000000..067ad5f1b43 Binary files /dev/null and b/public/assets/images/stamps-icon.png differ diff --git a/public/assets/images/wallet-type-ledger.svg b/public/assets/images/wallet-type-ledger.svg deleted file mode 100644 index 7cb36cac928..00000000000 --- a/public/assets/images/wallet-type-ledger.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/app/app.tsx b/src/app/app.tsx index cc00ce37996..ac9526927ad 100644 --- a/src/app/app.tsx +++ b/src/app/app.tsx @@ -2,12 +2,11 @@ import { Suspense } from 'react'; import { Provider as ReduxProvider } from 'react-redux'; import { radixBaseCSS } from '@radix-ui/themes/styles.css'; -import { ThemeProvider } from '@stacks/ui'; import { QueryClientProvider } from '@tanstack/react-query'; +import { styled } from 'leather-styles/jsx'; import { PersistGate } from 'redux-persist/integration/react'; import { queryClient } from '@app/common/persistence'; -import { theme } from '@app/common/theme'; import { FullPageLoadingSpinner } from '@app/components/loading-spinner'; import { Devtools } from '@app/features/devtool/devtools'; import { AppErrorBoundary } from '@app/features/errors/app-error-boundary'; @@ -26,8 +25,8 @@ export function App() { } persistor={persistor}> {/* TODO: this works but investigate importing radixBaseCSS in panda layer config */} - - + + }> @@ -36,8 +35,8 @@ export function App() { {reactQueryDevToolsEnabled && } - - + + ); diff --git a/src/app/common/authentication/use-finish-auth-request.ts b/src/app/common/authentication/use-finish-auth-request.ts index a24732b409a..5675ef53bcb 100644 --- a/src/app/common/authentication/use-finish-auth-request.ts +++ b/src/app/common/authentication/use-finish-auth-request.ts @@ -1,6 +1,5 @@ import { useCallback } from 'react'; -import { bytesToHex } from '@stacks/common'; import { createWalletGaiaConfig, getOrCreateWalletConfig, @@ -16,13 +15,13 @@ import { useAuthRequestParams } from '@app/common/hooks/auth/use-auth-request-pa import { useOnboardingState } from '@app/common/hooks/auth/use-onboarding-state'; import { useKeyActions } from '@app/common/hooks/use-key-actions'; import { useWalletType } from '@app/common/use-wallet-type'; -import { useNativeSegwitNetworkSigners } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; -import { useTaprootNetworkSigners } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; import { useLegacyStacksWallet, useStacksAccounts, } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { useGetLegacyAuthBitcoinAddresses } from './use-legacy-auth-bitcoin-addresses'; + export function useFinishAuthRequest() { const { decodedAuthRequest, authRequest, appIcon, appName } = useOnboardingState(); const keyActions = useKeyActions(); @@ -36,8 +35,7 @@ export function useFinishAuthRequest() { // TODO: It would be good to separate out finishing auth by the wallet vs an app // so that the additional data we provide apps can be removed from our onboarding. // Currently, these create errors unless early returns are used in the keychain code. - const deriveAllNativeSegWitNetworkSigners = useNativeSegwitNetworkSigners(); - const deriveAllTaprootNetworkSigners = useTaprootNetworkSigners(); + const getLegacyAuthBitcoinData = useGetLegacyAuthBitcoinAddresses(); return useCallback( async (accountIndex: number) => { @@ -75,9 +73,6 @@ export function useFinishAuthRequest() { }, }); - const taprootAccount = deriveAllTaprootNetworkSigners(accountIndex); - const nativeSegwitAccount = deriveAllNativeSegWitNetworkSigners(accountIndex); - const authResponse = await makeAuthResponse({ gaiaHubUrl: gaiaUrl, appDomain: appURL.origin, @@ -85,25 +80,8 @@ export function useFinishAuthRequest() { scopes: decodedAuthRequest.scopes, account: account, additionalData: { - btcAddress: { - p2tr: { - mainnet: taprootAccount.mainnet.payment.address, - testnet: taprootAccount.testnet.payment.address, - regtest: taprootAccount.regtest.payment.address, - signet: taprootAccount.signet.payment.address, - }, - p2wpkh: { - mainnet: nativeSegwitAccount.mainnet.payment.address, - testnet: nativeSegwitAccount.testnet.payment.address, - regtest: nativeSegwitAccount.regtest.payment.address, - signet: nativeSegwitAccount.signet.payment.address, - }, - }, - btcPublicKey: { - p2tr: bytesToHex(taprootAccount.mainnet.keychain.publicKey!), - p2wpkh: bytesToHex(nativeSegwitAccount.mainnet.keychain.publicKey!), - }, - walletProvider: 'hiro-wallet', + ...getLegacyAuthBitcoinData(accountIndex), + walletProvider: 'leather', }, }); keyActions.switchAccount(accountIndex); @@ -127,8 +105,7 @@ export function useFinishAuthRequest() { wallet, appIcon, appName, - deriveAllTaprootNetworkSigners, - deriveAllNativeSegWitNetworkSigners, + getLegacyAuthBitcoinData, keyActions, ] ); diff --git a/src/app/common/authentication/use-legacy-auth-bitcoin-addresses.ts b/src/app/common/authentication/use-legacy-auth-bitcoin-addresses.ts new file mode 100644 index 00000000000..4e04dd9e5e6 --- /dev/null +++ b/src/app/common/authentication/use-legacy-auth-bitcoin-addresses.ts @@ -0,0 +1,35 @@ +import { bytesToHex } from '@noble/hashes/utils'; + +import { useNativeSegwitNetworkSigners } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { useTaprootNetworkSigners } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; + +export function useGetLegacyAuthBitcoinAddresses() { + const deriveAllNativeSegWitNetworkSigners = useNativeSegwitNetworkSigners(); + const deriveAllTaprootNetworkSigners = useTaprootNetworkSigners(); + + return (accountIndex: number) => { + const taprootAccount = deriveAllTaprootNetworkSigners(accountIndex); + const nativeSegwitAccount = deriveAllNativeSegWitNetworkSigners(accountIndex); + + return { + btcAddress: { + p2tr: { + mainnet: taprootAccount?.mainnet?.payment.address, + testnet: taprootAccount?.testnet?.payment.address, + regtest: taprootAccount?.regtest?.payment.address, + signet: taprootAccount?.signet?.payment.address, + }, + p2wpkh: { + mainnet: nativeSegwitAccount?.mainnet?.payment.address, + testnet: nativeSegwitAccount?.testnet?.payment.address, + regtest: nativeSegwitAccount?.regtest?.payment.address, + signet: nativeSegwitAccount?.signet?.payment.address, + }, + }, + btcPublicKey: { + p2tr: bytesToHex(taprootAccount?.mainnet?.keychain.publicKey!), + p2wpkh: bytesToHex(nativeSegwitAccount?.mainnet?.keychain.publicKey!), + }, + }; + }; +} diff --git a/src/app/common/hooks/account/use-account-gradient.ts b/src/app/common/hooks/account/use-account-gradient.ts deleted file mode 100644 index 105342d997e..00000000000 --- a/src/app/common/hooks/account/use-account-gradient.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { useMemo } from 'react'; - -import { generateHash, hashValue, moduloRange, stringToHslColor } from '@stacks/ui-utils'; -import chroma from 'chroma-js'; - -function generateGradientType(string: string) { - const gradientType = `${hashValue(string, ['linear', 'radial'])}-gradient`; - const isLinear = gradientType === 'linear-gradient'; - - if (!isLinear) { - const radialModifier = `${hashValue(string, [ - 'farthest-side', - 'farthest-corner', - 'circle', - 'closest-side', - 'closest-corner', - 'ellipse', - ])} at ${Math.abs(moduloRange(generateHash(string), [isLinear ? 0 : 50, 100], true))}%`; - return `${gradientType}(${radialModifier}`; - } else { - const linearModifier = `${Math.abs(generateHash(string) % 360)}deg`; - return `${gradientType}(${linearModifier}`; - } -} - -export function useAccountGradient(publicKey: string) { - return useMemo(() => { - const keyLength = publicKey.length; - const part1 = publicKey.substring(0, keyLength / 2); - const part2 = publicKey.substring(keyLength / 2, keyLength); - - const bg = stringToHslColor(part1, 50, 60); - let bg2 = stringToHslColor(part2, 50, 60); - const bg3 = stringToHslColor(part2 + '__' + part1, 50, 60); - - const contrast = chroma.contrast(bg, bg2); - - if (contrast < 1.15) { - bg2 = chroma(bg2).darken(1.25).hex(); - } - - const gradientTypeString = part1 + '__' + part2; - const gradientType = generateGradientType(gradientTypeString); - - return `${gradientType}, ${bg3} 0%, ${bg2} 70%, ${bg} 100%)`; - }, [publicKey]); -} diff --git a/src/app/common/hooks/use-bitcoin-contracts.ts b/src/app/common/hooks/use-bitcoin-contracts.ts index ec7a5c93d90..ad0fef43a4a 100644 --- a/src/app/common/hooks/use-bitcoin-contracts.ts +++ b/src/app/common/hooks/use-bitcoin-contracts.ts @@ -34,7 +34,7 @@ import { useDefaultRequestParams } from './use-default-request-search-params'; export interface SimplifiedBitcoinContract { bitcoinContractId: string; bitcoinContractCollateralAmount: number; - bitcoinContractExpirationDate: string; + bitcoinContractEmergencyRefundTime: string; } interface CounterpartyWalletDetails { @@ -63,13 +63,14 @@ export function useBitcoinContracts() { const bitcoinAccountDetails = useCurrentAccountNativeSegwitIndexZeroSigner(); const currentIndex = useCurrentAccountIndex(); const nativeSegwitPrivateKeychain = useNativeSegwitAccountBuilder()?.(currentIndex); - const currentBitcoinNetwork = useCurrentNetwork(); + const currentNetwork = useCurrentNetwork(); async function getBitcoinContractInterface(): Promise { if (!nativeSegwitPrivateKeychain || !bitcoinAccountDetails) return; const currentAddress = bitcoinAccountDetails.address; const currentAccountIndex = extractAddressIndexFromPath(bitcoinAccountDetails.derivationPath); + const currentBitcoinNetwork = currentNetwork.chain.bitcoin; const currentAddressPrivateKey = deriveAddressIndexKeychainFromAccount( nativeSegwitPrivateKeychain.keychain @@ -77,11 +78,25 @@ export function useBitcoinContracts() { if (!currentAddressPrivateKey) return; + if ( + currentBitcoinNetwork.bitcoinNetwork === 'mainnet' || + currentBitcoinNetwork.bitcoinNetwork === 'signet' + ) + return; + + const bitcoinContractStorageMap: Record<'testnet' | 'regtest', string> = { + testnet: 'https://testnet.dlc.link/storage-api', + regtest: 'https://devnet.dlc.link/storage-api', + }; + const bitcoinContractStorageApiUrl = + bitcoinContractStorageMap[currentBitcoinNetwork.bitcoinNetwork]; + const bitcoinContractInterface = await JsDLCInterface.new( bytesToHex(currentAddressPrivateKey), currentAddress, - currentBitcoinNetwork.chain.bitcoin.network, - currentBitcoinNetwork.chain.bitcoin.url + currentBitcoinNetwork.bitcoinNetwork, + currentBitcoinNetwork.bitcoinUrl, + bitcoinContractStorageApiUrl ); return bitcoinContractInterface; @@ -97,14 +112,14 @@ export function useBitcoinContracts() { const bitcoinContractId = bitcoinContractOffer.temporaryContractId; const bitcoinContractCollateralAmount = bitcoinContractOffer.contractInfo.singleContractInfo.totalCollateral; - const bitcoinContractExpirationDate = new Date( - bitcoinContractOffer.cetLocktime * 1000 + const bitcoinContractEmergencyRefundTime = new Date( + bitcoinContractOffer.refundLocktime * 1000 ).toLocaleDateString(); const simplifiedBitcoinContractOffer: SimplifiedBitcoinContract = { bitcoinContractId, bitcoinContractCollateralAmount, - bitcoinContractExpirationDate, + bitcoinContractEmergencyRefundTime, }; const bitcoinContractOfferDetails: BitcoinContractOfferDetails = { diff --git a/src/app/common/hooks/use-event-listener.ts b/src/app/common/hooks/use-event-listener.ts new file mode 100644 index 00000000000..d7a1c1bd48d --- /dev/null +++ b/src/app/common/hooks/use-event-listener.ts @@ -0,0 +1,74 @@ +import { useEffect } from 'react'; + +import { useLatestRef } from './use-latest-ref'; + +// eslint-disable-next-line @typescript-eslint/ban-types +type FunctionArguments = T extends (...args: infer R) => any ? R : never; +type AddEventListener = FunctionArguments; + +let _window: Window | undefined = undefined; + +// Note: Accessing "window" in IE11 is somewhat expensive, and calling "typeof window" +// hits a memory leak, whereas aliasing it and calling "typeof _window" does not. +// Caching the window value at the file scope lets us minimize the impact. +try { + _window = window; +} catch (e) { + /* no-op */ +} + +/** + * Helper to get the window object. The helper will make sure to use a cached variable + * of "window", to avoid overhead and memory leaks in IE11. + */ +function getWindow(node?: HTMLElement | null): Window | undefined { + return node?.ownerDocument?.defaultView ?? _window; +} + +/** + * Check if we can use the DOM. Useful for SSR purposes + */ +function checkIsBrowser() { + const _window = getWindow(); + return Boolean( + // eslint-disable-next-line @typescript-eslint/unbound-method, deprecation/deprecation + typeof _window !== 'undefined' && _window.document && _window.document.createElement + ); +} + +const isBrowser = checkIsBrowser(); + +/** + * React hook to manage browser event listeners + * + * @param event the event name + * @param handler the event handler function to execute + * @param doc the dom environment to execute against (defaults to `document`) + * @param options the event listener options + */ +export function useEventListener( + event: keyof WindowEventMap, + handler: (event: any) => void, + doc: Document | null = isBrowser ? document : null, + options?: AddEventListener[2] +) { + const savedHandler = useLatestRef(handler); + + useEffect(() => { + if (!doc) return; + + const listener = (event: any) => { + savedHandler.current(event); + }; + + doc.addEventListener(event, listener, options); + + return () => { + doc.removeEventListener(event, listener, options); + }; + }, [event, doc, options, savedHandler]); + + return () => { + doc?.removeEventListener(event, savedHandler.current, options); + }; +} diff --git a/src/app/common/hooks/use-explorer-link.ts b/src/app/common/hooks/use-explorer-link.ts index f118b1adb6d..cd446dc1c7b 100644 --- a/src/app/common/hooks/use-explorer-link.ts +++ b/src/app/common/hooks/use-explorer-link.ts @@ -10,13 +10,13 @@ import { openInNewTab } from '../utils/open-in-new-tab'; export interface HandleOpenTxLinkArgs { blockchain: Blockchains; suffix?: string; - txId: string; + txid: string; } export function useExplorerLink() { const { mode } = useCurrentNetworkState(); const handleOpenTxLink = useCallback( - ({ blockchain, suffix, txId }: HandleOpenTxLinkArgs) => - openInNewTab(makeTxExplorerLink({ blockchain, mode, suffix, txId })), + ({ blockchain, suffix, txid }: HandleOpenTxLinkArgs) => + openInNewTab(makeTxExplorerLink({ blockchain, mode, suffix, txid })), [mode] ); diff --git a/src/app/common/hooks/use-latest-ref.ts b/src/app/common/hooks/use-latest-ref.ts new file mode 100644 index 00000000000..aa73b9c1b29 --- /dev/null +++ b/src/app/common/hooks/use-latest-ref.ts @@ -0,0 +1,17 @@ +import { useEffect, useRef } from 'react'; + +/** + * React hook to persist any value between renders, + * but keeps it up-to-date if it changes. + * + * @param value the value or function to persist + */ +export function useLatestRef(value: T) { + const ref = useRef(value); + + useEffect(() => { + ref.current = value; + }, [value]); + + return ref; +} diff --git a/src/app/common/hooks/use-location-state.ts b/src/app/common/hooks/use-location-state.ts index deabaafb4d7..b3e9e2491f6 100644 --- a/src/app/common/hooks/use-location-state.ts +++ b/src/app/common/hooks/use-location-state.ts @@ -5,7 +5,7 @@ import get from 'lodash.get'; import { isUndefined } from '@shared/utils'; -type LocationState = string | undefined | number | Location; +type LocationState = string | boolean | undefined | number | Location; export function useLocationState(propName: string): T; export function useLocationState( diff --git a/src/app/common/hooks/use-modifier-key.ts b/src/app/common/hooks/use-modifier-key.ts index 3d320a534c7..b1ff2cf9756 100644 --- a/src/app/common/hooks/use-modifier-key.ts +++ b/src/app/common/hooks/use-modifier-key.ts @@ -1,5 +1,13 @@ import { useCallback, useEffect, useState } from 'react'; +export function buildEnterKeyEvent(onClick: () => void) { + return (event: React.KeyboardEvent) => { + if (event.key === 'Enter' && onClick) { + onClick(); + } + }; +} + let timer = 0; export function useModifierKey(key: 'alt' | 'control', delay = 0) { diff --git a/src/app/common/hooks/use-submit-stx-transaction.ts b/src/app/common/hooks/use-submit-stx-transaction.ts index f8918db7bed..56de95a7992 100644 --- a/src/app/common/hooks/use-submit-stx-transaction.ts +++ b/src/app/common/hooks/use-submit-stx-transaction.ts @@ -51,6 +51,7 @@ export function useSubmitTransactionCallback({ loadingKey }: UseSubmitTransactio txId: safelyFormatHexTxid(response.txid), }); toast.success('Transaction submitted!'); + void analytics.track('broadcast_transaction', { symbol: 'stx' }); onSuccess(safelyFormatHexTxid(response.txid)); setIsIdle(); diff --git a/src/app/common/psbt/use-psbt-request-params.ts b/src/app/common/psbt/use-psbt-request-params.ts index b2c70671c4e..a034196d70d 100644 --- a/src/app/common/psbt/use-psbt-request-params.ts +++ b/src/app/common/psbt/use-psbt-request-params.ts @@ -1,17 +1,14 @@ import { useMemo } from 'react'; -import { useSearchParams } from 'react-router-dom'; import { ensureArray, undefinedIfLengthZero } from '@shared/utils'; -import { useRejectIfLedgerWallet } from '@app/common/rpc-helpers'; - import { useDefaultRequestParams } from '../hooks/use-default-request-search-params'; +import { initialSearchParams } from '../initial-search-params'; import { getPsbtPayloadFromToken } from './requests'; export function usePsbtRequestSearchParams() { - const [searchParams] = useSearchParams(); const { origin, tabId } = useDefaultRequestParams(); - const requestToken = searchParams.get('request'); + const requestToken = initialSearchParams.get('request'); if (!requestToken) throw new Error('Cannot decode psbt without request token'); @@ -33,23 +30,21 @@ export function usePsbtRequestSearchParams() { } export function useRpcSignPsbtParams() { - useRejectIfLedgerWallet('signPsbt'); - - const [searchParams] = useSearchParams(); const { origin, tabId } = useDefaultRequestParams(); - const broadcast = searchParams.get('broadcast'); - const psbtHex = searchParams.get('hex'); - const requestId = searchParams.get('requestId'); - const signAtIndex = searchParams.getAll('signAtIndex'); + const broadcast = initialSearchParams.get('broadcast'); + const psbtHex = initialSearchParams.get('hex'); + const requestId = initialSearchParams.get('requestId'); + const signAtIndex = initialSearchParams.getAll('signAtIndex'); - return useMemo(() => { - return { + return useMemo( + () => ({ broadcast: broadcast === 'true', origin, psbtHex, requestId, signAtIndex: undefinedIfLengthZero(ensureArray(signAtIndex).map(h => Number(h))), tabId: tabId ?? 0, - }; - }, [broadcast, origin, psbtHex, requestId, signAtIndex, tabId]); + }), + [broadcast, origin, psbtHex, requestId, signAtIndex, tabId] + ); } diff --git a/src/app/common/publish-subscribe.ts b/src/app/common/publish-subscribe.ts index c36e4c472a1..4f97b4d5621 100644 --- a/src/app/common/publish-subscribe.ts +++ b/src/app/common/publish-subscribe.ts @@ -1,3 +1,4 @@ +import type { Transaction } from '@scure/btc-signer'; import type { StacksTransaction } from '@stacks/transactions'; type PubTypeFn = ( @@ -19,7 +20,7 @@ interface PubSubType { subscribe: SubTypeFn; unsubscribe: SubTypeFn; } -function PublishSubscribe(): PubSubType { +function createPublishSubscribe(): PubSubType { const handlers: { [key: string]: MessageFn[] } = {}; return { @@ -42,7 +43,7 @@ function PublishSubscribe(): PubSubType { } // Global app events. Only add events if your feature isn't capable of -//communicating internally. +// communicating internally. export interface GlobalAppEvents { ledgerStacksTxSigned: { unsignedTx: string; @@ -51,6 +52,13 @@ export interface GlobalAppEvents { ledgerStacksTxSigningCancelled: { unsignedTx: string; }; + ledgerBitcoinTxSigned: { + unsignedPsbt: string; + signedPsbt: Transaction; + }; + ledgerBitcoinTxSigningCancelled: { + unsignedPsbt: string; + }; } -export const appEvents = PublishSubscribe(); +export const appEvents = createPublishSubscribe(); diff --git a/src/app/common/theme.ts b/src/app/common/theme.ts deleted file mode 100644 index ea7bf0b9138..00000000000 --- a/src/app/common/theme.ts +++ /dev/null @@ -1,20 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import { theme as uiTheme } from '@stacks/ui-theme'; - -export const theme = { - ...uiTheme, - colors: { - ...uiTheme.colors, - ink: { - ...uiTheme.colors.ink, - 400: '#9C9CA2', - 1000: '#141416', - }, - }, - fonts: { - ...uiTheme.fonts, - heading: - '"Marche", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"', - }, -}; diff --git a/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts b/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts index e06fdae6d67..cdbe309d93f 100644 --- a/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts +++ b/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts @@ -25,9 +25,11 @@ export function determineUtxosForSpendAll({ const txSizer = new BtcSizeFeeEstimator(); + const filteredUtxos = utxos.filter(utxo => utxo.value >= BTC_P2WPKH_DUST_AMOUNT); + const sizeInfo = txSizer.calcTxSize({ input_script: 'p2wpkh', - input_count: utxos.length, + input_count: filteredUtxos.length, [addressInfo.type + '_output_count']: 1, }); @@ -37,8 +39,7 @@ export function determineUtxosForSpendAll({ const fee = Math.ceil(sizeInfo.txVBytes * feeRate); return { - utxos, - inputs: utxos, + inputs: filteredUtxos, outputs, size: sizeInfo.txVBytes, fee, @@ -69,7 +70,7 @@ export function determineUtxosForSpend({ sizeInfo = txSizer.calcTxSize({ // Only p2wpkh is supported by the wallet input_script: 'p2wpkh', - input_count: neededUtxos.length + 1, + input_count: neededUtxos.length, // From the address of the recipient, we infer the output type [addressInfo.type + '_output_count']: 2, }); diff --git a/src/app/common/transactions/bitcoin/use-generate-bitcoin-tx.ts b/src/app/common/transactions/bitcoin/use-generate-bitcoin-tx.ts index bcb0eeb1080..ca95fc972c8 100644 --- a/src/app/common/transactions/bitcoin/use-generate-bitcoin-tx.ts +++ b/src/app/common/transactions/bitcoin/use-generate-bitcoin-tx.ts @@ -13,18 +13,18 @@ import { UtxoResponseItem } from '@app/query/bitcoin/bitcoin-client'; import { useBitcoinScureLibNetworkConfig } from '@app/store/accounts/blockchain/bitcoin/bitcoin-keychain'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; -interface GenerateNativeSegwitTxValues { +interface GenerateNativeSegwitSingleRecipientTxValues { amount: Money; recipient: string; } -export function useGenerateSignedNativeSegwitTx() { +export function useGenerateUnsignedNativeSegwitSingleRecipientTx() { const signer = useCurrentAccountNativeSegwitIndexZeroSigner(); const networkMode = useBitcoinScureLibNetworkConfig(); return useCallback( - ( - values: GenerateNativeSegwitTxValues, + async ( + values: GenerateNativeSegwitSingleRecipientTxValues, feeRate: number, utxos: UtxoResponseItem[], isSendingMax?: boolean @@ -56,8 +56,9 @@ export function useGenerateSignedNativeSegwitTx() { if (outputs.length > 2) throw new Error('Address reuse mode: wallet should have max 2 outputs'); - inputs.forEach(input => { - const p2wpkh = btc.p2wpkh(signer.publicKey, networkMode); + const p2wpkh = btc.p2wpkh(signer.publicKey, networkMode); + + for (const input of inputs) { tx.addInput({ txid: input.txid, index: input.vout, @@ -68,7 +69,8 @@ export function useGenerateSignedNativeSegwitTx() { amount: BigInt(input.value), }, }); - }); + } + outputs.forEach(output => { // When coin selection returns output with no address we assume it is // a change output @@ -78,16 +80,14 @@ export function useGenerateSignedNativeSegwitTx() { } tx.addOutputAddress(values.recipient, BigInt(output.value), networkMode); }); - signer.sign(tx); - tx.finalize(); - return { hex: tx.hex, fee }; + return { hex: tx.hex, fee, psbt: tx.toPSBT(), inputs }; } catch (e) { // eslint-disable-next-line no-console console.log('Error signing bitcoin transaction', e); return null; } }, - [networkMode, signer] + [networkMode, signer.address, signer.publicKey] ); } diff --git a/src/app/common/transactions/bitcoin/utils.ts b/src/app/common/transactions/bitcoin/utils.ts index 3199954b03f..81758437473 100644 --- a/src/app/common/transactions/bitcoin/utils.ts +++ b/src/app/common/transactions/bitcoin/utils.ts @@ -1,4 +1,3 @@ -import { truncateMiddle } from '@stacks/ui-utils'; import { getAddressInfo } from 'bitcoin-address-validation'; import { BitcoinTransactionVectorOutput } from '@shared/models/transactions/bitcoin-transaction.model'; @@ -6,9 +5,31 @@ import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model import { sumNumbers } from '@app/common/math/helpers'; import { satToBtc } from '@app/common/money/unit-conversion'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { BtcSizeFeeEstimator } from './fees/btc-size-fee-estimator'; +type BtcTxStatus = 'pending' | 'success'; +type BtcStatusColorMap = Record; + +const statusFromBitcoinTx = (tx: BitcoinTx): BtcTxStatus => { + if (tx.status.confirmed) return 'success'; + return 'pending'; +}; + +export const getColorFromBitcoinTx = (tx: BitcoinTx) => { + const colorMap: BtcStatusColorMap = { + pending: 'warning.label', + success: 'stacks', + }; + + return colorMap[statusFromBitcoinTx(tx)] ?? 'feedback-error'; +}; + +export function containsTaprootInput(tx: BitcoinTx) { + return tx.vin.some(input => input.prevout.scriptpubkey_type === 'v1_p2tr'); +} + export function getSizeInfo(payload: { inputLength: number; recipient: string; diff --git a/src/app/common/transactions/stacks/transaction.utils.ts b/src/app/common/transactions/stacks/transaction.utils.ts index d74dac8d624..068daeac07b 100644 --- a/src/app/common/transactions/stacks/transaction.utils.ts +++ b/src/app/common/transactions/stacks/transaction.utils.ts @@ -14,12 +14,13 @@ import { addressHashModeToVersion, addressToString, } from '@stacks/transactions'; -import { getContractName, truncateMiddle } from '@stacks/ui-utils'; import { BigNumber } from 'bignumber.js'; import { StacksTx, StacksTxStatus } from '@shared/models/transactions/stacks-transaction.model'; import { stacksValue } from '@app/common/stacks-utils'; +import { getContractName } from '@app/ui/utils/get-contract-name'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; export const statusFromTx = (tx: StacksTx): StacksTxStatus => { const { tx_status } = tx; @@ -140,3 +141,7 @@ export function getEstimatedConfirmationTime( return `~${arrivesIn / 60} min`; } + +export function isPendingTx(tx: StacksTx) { + return tx.tx_status === 'pending'; +} diff --git a/src/app/common/utils.ts b/src/app/common/utils.ts index 8c03cf9fb2c..50d227bdecd 100644 --- a/src/app/common/utils.ts +++ b/src/app/common/utils.ts @@ -43,19 +43,19 @@ interface MakeTxExplorerLinkArgs { blockchain: Blockchains; mode: BitcoinNetworkModes; suffix?: string; - txId: string; + txid: string; } export function makeTxExplorerLink({ blockchain, mode, suffix = '', - txId, + txid, }: MakeTxExplorerLinkArgs) { switch (blockchain) { case 'bitcoin': - return `https://mempool.space/${mode !== 'mainnet' ? mode + '/' : ''}tx/${txId}`; + return `https://mempool.space/${mode !== 'mainnet' ? mode + '/' : ''}tx/${txid}`; case 'stacks': - return `https://explorer.hiro.so/txid/${txId}?chain=${mode}${suffix}`; + return `https://explorer.hiro.so/txid/${txid}?chain=${mode}${suffix}`; default: return ''; } diff --git a/src/app/common/utils/safe-await.ts b/src/app/common/utils/safe-await.ts new file mode 100644 index 00000000000..304aff22a0c --- /dev/null +++ b/src/app/common/utils/safe-await.ts @@ -0,0 +1,35 @@ +// TypeScript port of https://github.com/DavidWells/safe-await/ + +// Native Error types https://mzl.la/2Veh3TR +const nativeExceptions = [ + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError, +].filter(except => typeof except === 'function'); + +function throwNative(error: Error) { + for (const Exception of nativeExceptions) { + if (error instanceof Exception) throw error; + } +} + +export async function safeAwait(promise: Promise, finallyFn?: () => void) { + return promise + .then(data => { + if (data instanceof Error) { + throwNative(data); + return [data] as readonly [Error]; + } + return [undefined, data] as const; + }) + .catch((error: Error) => { + throwNative(error); + return [error] as const; + }) + .finally(() => { + if (finallyFn) finallyFn(); + }); +} diff --git a/src/app/components/account/account-avatar-item.tsx b/src/app/components/account/account-avatar-item.tsx new file mode 100644 index 00000000000..a6470aca3de --- /dev/null +++ b/src/app/components/account/account-avatar-item.tsx @@ -0,0 +1,12 @@ +import { memo } from 'react'; + +import { AccountAvatar } from '@app/components/account/account-avatar'; + +interface AccountAvatarItemProps { + publicKey: string; + index: number; + name: string; +} +export const AccountAvatarItem = memo(({ name, publicKey, index }: AccountAvatarItemProps) => { + return ; +}); diff --git a/src/app/components/account/account-avatar.tsx b/src/app/components/account/account-avatar.tsx index a125d066872..fa0640ab2c1 100644 --- a/src/app/components/account/account-avatar.tsx +++ b/src/app/components/account/account-avatar.tsx @@ -1,14 +1,26 @@ import { memo } from 'react'; -import { BoxProps } from '@stacks/ui'; +import { Box, CircleProps } from 'leather-styles/jsx'; -import { AccountAvatar } from '@app/components/account/account-avatar/account-avatar'; +import { DynamicColorCircle } from '@app/ui/components/dynamic-color-circle'; -interface AccountAvatarItemProps extends BoxProps { +const getAccountNumber = (index: number) => { + // Always return account number in the Account Circle + return String(index + 1); +}; + +interface AccountAvatarProps extends CircleProps { + name: string; publicKey: string; index: number; - name: string; } -export const AccountAvatarItem = memo(({ name, publicKey, index }: AccountAvatarItemProps) => { - return ; +export const AccountAvatar = memo(({ name, publicKey, index, ...props }: AccountAvatarProps) => { + const gradient = publicKey + index.toString(); + const text = getAccountNumber(index); + + return ( + + {text} + + ); }); diff --git a/src/app/components/account/account-avatar/account-avatar.tsx b/src/app/components/account/account-avatar/account-avatar.tsx deleted file mode 100644 index 589734ef85a..00000000000 --- a/src/app/components/account/account-avatar/account-avatar.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { memo } from 'react'; - -import { BoxProps, Circle, color } from '@stacks/ui'; - -import { useAccountGradient } from '@app/common/hooks/account/use-account-gradient'; - -const getAvatarText = (name: string, index: number) => { - // Returns a string with the account's ordinal number. - // - // Assumes that account names starting with "Account" have been autogenerated - // by the app. This will probably break when the account has a BNS name - // starting with "Account", although it's probably good enough for now. - if (name.startsWith('Account')) return String(index + 1); - - // At the time of writing, Firefox does not yet support Segmenter. Avatar - // text will default to the account's ordinal number. - if (!Intl.Segmenter) { - return String(index + 1); - } - - // Displays the first grapheme of the account name in uppercase. - // - // Using graphemes allows proper handling of emojis and other characters - // with multiple code points. - return [...new Intl.Segmenter().segment(name)][0].segment.toUpperCase(); -}; - -interface AccountAvatarProps extends BoxProps { - name: string; - publicKey: string; - index: number; -} -export const AccountAvatar = memo(({ name, publicKey, index, ...props }: AccountAvatarProps) => { - const gradient = useAccountGradient(publicKey ?? ''); - const text = getAvatarText(name, index); - const isFirstGraphemeEmoji = /\p{Extended_Pictographic}/u.test(text); - - return ( - - {text} - - ); -}); diff --git a/src/app/components/account/account-list-item-layout.tsx b/src/app/components/account/account-list-item-layout.tsx index af74a45dd09..ece5f388f52 100644 --- a/src/app/components/account/account-list-item-layout.tsx +++ b/src/app/components/account/account-list-item-layout.tsx @@ -1,15 +1,14 @@ -import { Spinner } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { Flex, HStack, Stack, StackProps, styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { useViewportMinWidth } from '@app/common/hooks/use-media-query'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { Spinner } from '@app/ui/components/spinner'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { CaptionDotSeparator } from '../caption-dot-separator'; -import { CheckmarkIcon } from '../icons/checkmark-icon'; import { Flag } from '../layout/flag'; -import { StacksAccountLoader } from '../stacks-account-loader'; +import { StacksAccountLoader } from '../loaders/stacks-account-loader'; import { BitcoinNativeSegwitAccountLoader } from './bitcoin-account-loader'; interface AccountListItemLayoutProps extends StackProps { @@ -19,9 +18,6 @@ interface AccountListItemLayoutProps extends StackProps { accountName: React.ReactNode; avatar: React.JSX.Element; balanceLabel: React.ReactNode; - hasCopied?: boolean; - onCopyToClipboard?(e: React.MouseEvent): void; - onClickBtcCopyIcon?(e: React.MouseEvent): void; onSelectAccount(): void; } export function AccountListItemLayout(props: AccountListItemLayoutProps) { @@ -33,9 +29,6 @@ export function AccountListItemLayout(props: AccountListItemLayoutProps) { avatar, balanceLabel, onSelectAccount, - hasCopied, - onCopyToClipboard, - onClickBtcCopyIcon, children = null, ...rest } = props; @@ -61,11 +54,11 @@ export function AccountListItemLayout(props: AccountListItemLayoutProps) { {isLoading ? ( ) : ( balanceLabel diff --git a/src/app/components/account/account-name.tsx b/src/app/components/account/account-name.tsx index 381bd4671b7..67a07d4fdbf 100644 --- a/src/app/components/account/account-name.tsx +++ b/src/app/components/account/account-name.tsx @@ -1,22 +1,10 @@ import { memo } from 'react'; -import { BoxProps } from '@stacks/ui'; import { styled } from 'leather-styles/jsx'; -import { useAccountDisplayName } from '@app/common/hooks/account/use-account-names'; -import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.models'; - interface AccountNameLayoutProps { children: React.ReactNode; } export const AccountNameLayout = memo(({ children }: AccountNameLayoutProps) => ( {children} )); - -interface AccountNameProps extends BoxProps { - account: StacksAccount; -} -export const AccountName = memo(({ account }: AccountNameProps) => { - const name = useAccountDisplayName(account); - return {name}; -}); diff --git a/src/app/components/address-displayer/address-displayer.layout.tsx b/src/app/components/address-displayer/address-displayer.layout.tsx index c6ce8a41071..0c3c8a6d96e 100644 --- a/src/app/components/address-displayer/address-displayer.layout.tsx +++ b/src/app/components/address-displayer/address-displayer.layout.tsx @@ -8,9 +8,8 @@ export function AddressDisplayerLayout({ isEven, ...props }: AddressDisplayerLay return ( ); diff --git a/src/app/components/address-displayer/form-address-displayer.tsx b/src/app/components/address-displayer/form-address-displayer.tsx index 0076f94a7b5..71fba94b964 100644 --- a/src/app/components/address-displayer/form-address-displayer.tsx +++ b/src/app/components/address-displayer/form-address-displayer.tsx @@ -1,22 +1,20 @@ -import { Box, BoxProps } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; +import { Box, BoxProps } from 'leather-styles/jsx'; import { AddressDisplayer } from './address-displayer'; interface FormAddressDisplayerProps extends BoxProps { address: string; } - export function FormAddressDisplayer({ address, ...rest }: FormAddressDisplayerProps) { return ( diff --git a/src/app/components/app-version.tsx b/src/app/components/app-version.tsx index 21d416c9bb9..798b9ab8297 100644 --- a/src/app/components/app-version.tsx +++ b/src/app/components/app-version.tsx @@ -17,11 +17,10 @@ const AppVersionLabel = forwardRef( ({ children, isLatestVersion, ...props }: AppVersionLabelProps, ref) => ( - - Available balance - - - - + + + + Available balance + + + + + - - {formatMoney(balance)} - + + + {formatMoney(balance)} + + ); } diff --git a/src/app/components/balance-btc.tsx b/src/app/components/balance-btc.tsx index db36dfb72dd..9455316d660 100644 --- a/src/app/components/balance-btc.tsx +++ b/src/app/components/balance-btc.tsx @@ -1,9 +1,9 @@ import { formatMoney } from '@app/common/money/format-money'; -import { Caption } from '@app/components/typography'; import { useCurrentNativeSegwitAddressBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; export function BtcBalance() { const balance = useCurrentNativeSegwitAddressBalance(); - return {formatMoney(balance)}; + return {formatMoney(balance)}; } diff --git a/src/app/components/balance-stx.tsx b/src/app/components/balance-stx.tsx index eb7d024745c..65418c5c6b8 100644 --- a/src/app/components/balance-stx.tsx +++ b/src/app/components/balance-stx.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; import { stacksValue } from '@app/common/stacks-utils'; -import { Caption } from '@app/components/typography'; import { useAnchoredStacksAccountBalances } from '@app/query/stacks/balance/stx-balance.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; interface BalanceProps { address: string; @@ -20,5 +20,5 @@ export function StxBalance(props: BalanceProps) { [balances] ); - return {balance}; + return {balance}; } diff --git a/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point-layout.tsx b/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point-layout.tsx index 0c29c1fb4da..8f514fc05e0 100644 --- a/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point-layout.tsx +++ b/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point-layout.tsx @@ -1,5 +1,4 @@ -import { Flex, HStack } from 'leather-styles/jsx'; -import { StackProperties } from 'leather-styles/patterns'; +import { Flex, HStack, styled } from 'leather-styles/jsx'; import { Money } from '@shared/models/money.model'; @@ -7,11 +6,10 @@ import { formatBalance } from '@app/common/format-balance'; import { ftDecimals } from '@app/common/stacks-utils'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; -import { Caption, Text } from '@app/components/typography'; import { LoadingSpinner } from '../loading-spinner'; -interface BitcoinContractEntryPointLayoutProps extends StackProperties { +interface BitcoinContractEntryPointLayoutProps { balance: Money; caption: string; icon: React.JSX.Element; @@ -30,21 +28,23 @@ export function BitcoinContractEntryPointLayout(props: BitcoinContractEntryPoint return ( - + - {'Bitcoin Contracts'} + Bitcoin Contracts - + {isLoading ? : formattedBalance.value} - + - - {caption} - {isLoading ? '' : {usdBalance}} + + {caption} + + {isLoading ? '' : {usdBalance}} + diff --git a/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point.tsx b/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point.tsx index 277447e6640..b4bd3751681 100644 --- a/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point.tsx +++ b/src/app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point.tsx @@ -1,22 +1,20 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; +import { useAsync } from 'react-async-hook'; import { useNavigate } from 'react-router-dom'; -import { Box } from '@stacks/ui'; - import { Money, createMoneyFromDecimal } from '@shared/models/money.model'; import { RouteUrls } from '@shared/route-urls'; import { useBitcoinContracts } from '@app/common/hooks/use-bitcoin-contracts'; import { i18nFormatCurrency } from '@app/common/money/format-money'; import { useCalculateBitcoinFiatValue } from '@app/query/common/market-data/market-data.hooks'; +import { BitcoinContractIcon } from '@app/ui/components/icons/bitcoin-contract-icon'; -import { BitcoinContractIcon } from '../icons/bitcoin-contract-icon'; import { BitcoinContractEntryPointLayout } from './bitcoin-contract-entry-point-layout'; interface BitcoinContractEntryPointProps { btcAddress: string; } - export function BitcoinContractEntryPoint({ btcAddress }: BitcoinContractEntryPointProps) { const navigate = useNavigate(); const { sumBitcoinContractCollateralAmounts } = useBitcoinContracts(); @@ -26,16 +24,12 @@ export function BitcoinContractEntryPoint({ btcAddress }: BitcoinContractEntryPo createMoneyFromDecimal(0, 'BTC') ); - useEffect(() => { - const getBitcoinContractDataAndSetState = async () => { - setIsLoading(true); - const currentBitcoinContractSum = await sumBitcoinContractCollateralAmounts(); - if (!currentBitcoinContractSum) return; - setBitcoinContractSum(currentBitcoinContractSum); - setIsLoading(false); - }; - getBitcoinContractDataAndSetState(); - // eslint-disable-next-line react-hooks/exhaustive-deps + useAsync(async () => { + setIsLoading(true); + const currentBitcoinContractSum = await sumBitcoinContractCollateralAmounts(); + if (!currentBitcoinContractSum) return; + setBitcoinContractSum(currentBitcoinContractSum); + setIsLoading(false); }, [btcAddress]); function onClick() { @@ -48,7 +42,7 @@ export function BitcoinContractEntryPoint({ btcAddress }: BitcoinContractEntryPo isLoading={isLoading} balance={bitcoinContractSum} caption={bitcoinContractSum.symbol} - icon={} + icon={} usdBalance={i18nFormatCurrency(calculateFiatValue(bitcoinContractSum))} onClick={onClick} /> diff --git a/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee-fiat.tsx b/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee-fiat.tsx index 14b13049747..629a6053b78 100644 --- a/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee-fiat.tsx +++ b/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee-fiat.tsx @@ -1,7 +1,7 @@ import { useMemo } from 'react'; -import { Flex, Text } from '@stacks/ui'; import { useField } from 'formik'; +import { Flex, styled } from 'leather-styles/jsx'; import { satToBtc } from '@app/common/money/unit-conversion'; @@ -32,9 +32,13 @@ export function BitcoinCustomFeeFiat({ if (!canShow) return null; return ( - - {feeData.fiatFeeValue} - {feeData.feeInBtc} BTC + + + {feeData.fiatFeeValue} + + + {feeData.feeInBtc} BTC + ); } diff --git a/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee.tsx b/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee.tsx index 596bf7cbab2..1f04036ff6d 100644 --- a/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee.tsx +++ b/src/app/components/bitcoin-custom-fee/bitcoin-custom-fee.tsx @@ -1,15 +1,14 @@ import { Dispatch, SetStateAction, useCallback, useRef } from 'react'; -import { Link } from '@radix-ui/themes'; -import { Stack } from '@stacks/ui'; import { Form, Formik } from 'formik'; -import { styled } from 'leather-styles/jsx'; +import { Stack, styled } from 'leather-styles/jsx'; import * as yup from 'yup'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { PreviewButton } from '@app/components/preview-button'; +import { LeatherButton } from '@app/ui/components/button'; import { OnChooseFeeArgs } from '../bitcoin-fees-list/bitcoin-fees-list'; import { TextInputField } from '../text-input-field'; @@ -81,27 +80,28 @@ export function BitcoinCustomFee({ {props => { return (
- - - - {'Higher fee rates typically lead to faster confirmation times. '} - + + + Higher fee rates typically lead to faster confirmation times. + openInNewTab('https://buybitcoinworldwide.com/fee-calculator/')} + textStyle="body.02" + variant="link" > View fee calculator - + - + { + onClick={async () => { feeInputRef?.current?.focus(); - props.setValues({ ...props.values }); + await props.setValues({ ...props.values }); }} onChange={e => { setCustomFeeInitialValue((e.target as HTMLInputElement).value); @@ -115,7 +115,6 @@ export function BitcoinCustomFee({ /> - diff --git a/src/app/components/bitcoin-fees-list/bitcoin-fees-list.tsx b/src/app/components/bitcoin-fees-list/bitcoin-fees-list.tsx index 843fb4e097e..71286c386d6 100644 --- a/src/app/components/bitcoin-fees-list/bitcoin-fees-list.tsx +++ b/src/app/components/bitcoin-fees-list/bitcoin-fees-list.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; @@ -52,7 +52,7 @@ export function BitcoinFeesList({ if (!feesList.length) return ; return ( - + {feesList.map(({ label, value, btcValue, fiatValue, time, feeRate }) => ( - Possibly caused by api issues -
, -]; +const helpTextList = []; const title = 'Unable to calculate fees'; export function FeesListError() { const navigate = useNavigate(); return ( - + - - + + {feeType} {arrivesIn} @@ -50,6 +49,6 @@ export function FeesListItem({ {`${feeFiatValue} | ${feeRate} sats/vB | ${feeAmount}`} - + ); } diff --git a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-caption.tsx b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-caption.tsx index 16732ca15f4..a1e6b2a0e72 100644 --- a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-caption.tsx +++ b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-caption.tsx @@ -1,12 +1,12 @@ -import { Text, color } from '@stacks/ui'; +import { styled } from 'leather-styles/jsx'; interface BitcoinTransactionCaptionProps { children: string; } export function BitcoinTransactionCaption({ children }: BitcoinTransactionCaptionProps) { return ( - + {children} - +
); } diff --git a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-icon.tsx b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-icon.tsx index 91b208e89f8..ad55fd9369e 100644 --- a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-icon.tsx +++ b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-icon.tsx @@ -1,32 +1,41 @@ -import { Box, BoxProps, Circle, Flex, color } from '@stacks/ui'; +import { Circle, CircleProps, Flex } from 'leather-styles/jsx'; import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; -import { BtcIcon } from '@app/components/icons/btc-icon'; +import { getColorFromBitcoinTx, isBitcoinTxInbound } from '@app/common/transactions/bitcoin/utils'; +import { ArrowDownIcon } from '@app/ui/components/icons/arrow-down-icon'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; -import { IconForTx, colorFromTx } from './utils'; +export function TxStatusIcon(props: { address: string; tx: BitcoinTx }) { + const { address, tx } = props; + if (isBitcoinTxInbound(address, tx)) return ; + return ; +} -interface TransactionIconProps extends BoxProps { +interface TransactionIconProps extends CircleProps { transaction: BitcoinTx; btcAddress: string; } - -export function BitcoinTransactionIcon({ transaction, btcAddress, ...rest }: TransactionIconProps) { +export function BitcoinTransactionIcon({ + transaction, + btcAddress, + ...props +}: TransactionIconProps) { return ( - + - + ); diff --git a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-inscription-icon.tsx b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-inscription-icon.tsx index 27e62f4076d..d334b23d13f 100644 --- a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-inscription-icon.tsx +++ b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-inscription-icon.tsx @@ -1,10 +1,12 @@ -import { Box, Circle, Flex, color } from '@stacks/ui'; +import { Box, Circle, Flex } from 'leather-styles/jsx'; import { SupportedInscription } from '@shared/models/inscription.model'; import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; -import { OrdinalIcon } from '../icons/ordinal-icon'; -import { IconForTx, colorFromTx } from './utils'; +import { getColorFromBitcoinTx } from '@app/common/transactions/bitcoin/utils'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; + +import { TxStatusIcon } from './bitcoin-transaction-icon'; interface BitcoinTransactionInscriptionIconProps { inscription: SupportedInscription; @@ -17,8 +19,8 @@ function InscriptionIcon({ inscription, ...rest }: { inscription: SupportedInscr case 'image': return ( - + + + ); diff --git a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-item.tsx b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-item.tsx index 4bc58d0c060..649a8a7c608 100644 --- a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-item.tsx +++ b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-item.tsx @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import { BoxProps } from '@stacks/ui'; +import { BoxProps } from 'leather-styles/jsx'; import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; import { RouteUrls } from '@shared/route-urls'; @@ -9,11 +9,11 @@ import { RouteUrls } from '@shared/route-urls'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; import { + containsTaprootInput, getBitcoinTxCaption, getBitcoinTxValue, isBitcoinTxInbound, } from '@app/common/transactions/bitcoin/utils'; -import { useWalletType } from '@app/common/use-wallet-type'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { usePressable } from '@app/components/item-hover'; import { IncreaseFeeButton } from '@app/components/stacks-transaction-item/increase-fee-button'; @@ -32,7 +32,6 @@ import { BitcoinTransactionIcon } from './bitcoin-transaction-icon'; import { BitcoinTransactionInscriptionIcon } from './bitcoin-transaction-inscription-icon'; import { BitcoinTransactionStatus } from './bitcoin-transaction-status'; import { BitcoinTransactionValue } from './bitcoin-transaction-value'; -import { containsTaprootInput } from './utils'; interface BitcoinTransactionItemProps extends BoxProps { transaction: BitcoinTx; @@ -41,7 +40,6 @@ export function BitcoinTransactionItem({ transaction, ...rest }: BitcoinTransact const [component, bind, { isHovered }] = usePressable(true); const { pathname } = useLocation(); const navigate = useNavigate(); - const { whenWallet } = useWalletType(); const { data: inscriptionData } = useGetInscriptionsByOutputQuery(transaction, { select(data) { @@ -63,12 +61,7 @@ export function BitcoinTransactionItem({ transaction, ...rest }: BitcoinTransact if (!transaction) return null; const onIncreaseFee = () => { - whenWallet({ - ledger: () => { - // TO-DO when implement BTC in Ledger - }, - software: () => navigate(RouteUrls.IncreaseBtcFee, { state: { btcTx: transaction } }), - })(); + navigate(RouteUrls.IncreaseBtcFee, { state: { btcTx: transaction } }); }; const openTxLink = () => { @@ -77,10 +70,7 @@ export function BitcoinTransactionItem({ transaction, ...rest }: BitcoinTransact openInNewTab(createInscriptionInfoUrl(inscriptionData.id)); return; } - handleOpenTxLink({ - blockchain: 'bitcoin', - txId: transaction?.txid || '', - }); + handleOpenTxLink({ blockchain: 'bitcoin', txid: transaction?.txid || '' }); }; const isOriginator = !isBitcoinTxInbound(bitcoinAddress, transaction); diff --git a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-value.tsx b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-value.tsx index beb712c5830..71b9e77eb02 100644 --- a/src/app/components/bitcoin-transaction-item/bitcoin-transaction-value.tsx +++ b/src/app/components/bitcoin-transaction-item/bitcoin-transaction-value.tsx @@ -1,4 +1,4 @@ -import { Title } from '@app/components/typography'; +import { Title } from '@app/ui/components/typography/title'; interface BitcoinTransactionValueProps { children: string; diff --git a/src/app/components/bitcoin-transaction-item/utils.ts b/src/app/components/bitcoin-transaction-item/utils.ts deleted file mode 100644 index ebf026f228d..00000000000 --- a/src/app/components/bitcoin-transaction-item/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { FiArrowDown as IconArrowDown, FiArrowUp as IconArrowUp } from 'react-icons/fi'; - -import { ColorsStringLiteral } from '@stacks/ui-theme'; - -import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; - -import { isBitcoinTxInbound } from '@app/common/transactions/bitcoin/utils'; - -type BtcTxStatus = 'pending' | 'success'; -type BtcStatusColorMap = Record; - -const statusFromTx = (tx: BitcoinTx): BtcTxStatus => { - if (tx.status.confirmed) return 'success'; - return 'pending'; -}; - -export const colorFromTx = (tx: BitcoinTx): ColorsStringLiteral => { - const colorMap: BtcStatusColorMap = { - pending: 'feedback-alert', - success: 'brand', - }; - - return colorMap[statusFromTx(tx)] ?? 'feedback-error'; -}; - -export function IconForTx(address: string, tx: BitcoinTx) { - if (isBitcoinTxInbound(address, tx)) return IconArrowDown; - return IconArrowUp; -} - -export function containsTaprootInput(tx: BitcoinTx) { - return tx.vin.some(input => input.prevout.scriptpubkey_type === 'v1_p2tr'); -} diff --git a/src/app/components/broadcast-error-drawer/broadcast-error-drawer.layout.tsx b/src/app/components/broadcast-error-drawer/broadcast-error-drawer.layout.tsx index 63d8aaf31b6..12295071811 100644 --- a/src/app/components/broadcast-error-drawer/broadcast-error-drawer.layout.tsx +++ b/src/app/components/broadcast-error-drawer/broadcast-error-drawer.layout.tsx @@ -1,9 +1,8 @@ import GenericError from '@assets/images/generic-error.png'; -import { Box, Button, Flex } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; - -import { Body, Title } from '../typography'; +import { LeatherButton } from '@app/ui/components/button'; interface BroadcastErrorDrawerLayoutProps { message: string; @@ -15,20 +14,22 @@ export function BroadcastErrorDrawerLayout({ message, onClose }: BroadcastErrorD - - Unable to broadcast transaction - + + + Unable to broadcast transaction + + Your transaction failed to broadcast{' '} {message && <>because of the error: {message.toLowerCase()}} - - + ); diff --git a/src/app/components/caption-dot-separator.tsx b/src/app/components/caption-dot-separator.tsx index 8500e315f10..f7a27864bdc 100644 --- a/src/app/components/caption-dot-separator.tsx +++ b/src/app/components/caption-dot-separator.tsx @@ -1,6 +1,14 @@ import { cloneElement, isValidElement } from 'react'; -import { CaptionSeparatorDot } from './typography'; +import { BoxProps, styled } from 'leather-styles/jsx'; + +function CaptionSeparatorDot(props: BoxProps) { + return ( + + • + + ); +} interface CaptionDotSeparatorProps { children: React.ReactNode; diff --git a/src/app/components/centered-page-container.tsx b/src/app/components/centered-page-container.tsx index d5b6bda570b..fc1d1c41d95 100644 --- a/src/app/components/centered-page-container.tsx +++ b/src/app/components/centered-page-container.tsx @@ -1,4 +1,4 @@ -import { Flex, FlexProps } from '@stacks/ui'; +import { Flex, FlexProps } from 'leather-styles/jsx'; export function CenteredPageContainer(props: FlexProps) { return ( @@ -6,9 +6,9 @@ export function CenteredPageContainer(props: FlexProps) { alignItems={['left', 'center']} flexGrow={1} flexDirection="column" - minHeight={['70vh', '90vh']} justifyContent={['start', 'center', 'center']} - mb="loose" + mb="space.05" + minHeight={['70vh', '90vh']} {...props} /> ); diff --git a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-list.tsx b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-list.tsx index 3233dfeb23b..10adfb1ee8f 100644 --- a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-list.tsx +++ b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/brc20-token-asset-list.tsx @@ -26,6 +26,8 @@ export function Brc20TokenAssetList(props: { brc20Tokens?: Brc20Token[] }) { }); } + if (!props.brc20Tokens?.length) return null; + return ( {props.brc20Tokens?.map(token => ( diff --git a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.layout.tsx b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.layout.tsx index 229615c2393..b31dfa74f2c 100644 --- a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.layout.tsx +++ b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.layout.tsx @@ -1,58 +1,60 @@ -import { BoxProps, Flex } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; -import { HStack, styled } from 'leather-styles/jsx'; +import { BoxProps, Flex, HStack, styled } from 'leather-styles/jsx'; import type { Money } from '@shared/models/money.model'; import { formatBalance } from '@app/common/format-balance'; import { AssetCaption } from '@app/components/crypto-assets/components/asset-caption'; -import { Brc20TokenIcon } from '@app/components/icons/brc20-token-icon'; import { usePressable } from '@app/components/item-hover'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; +import { Brc20TokenIcon } from '@app/ui/components/icons/brc20-token-icon'; interface Brc20TokenAssetItemLayoutProps extends BoxProps { balance: Money; caption: string; isPressable?: boolean; + onClick?(): void; title: string; } -export const Brc20TokenAssetItemLayout = forwardRefWithAs( - (props: Brc20TokenAssetItemLayoutProps, ref) => { - const { balance, caption, isPressable, title, ...rest } = props; - const [component, bind] = usePressable(isPressable); +export function Brc20TokenAssetItemLayout({ + balance, + caption, + isPressable, + onClick, + title, +}: Brc20TokenAssetItemLayoutProps) { + const [component, bind] = usePressable(isPressable); - const formattedBalance = formatBalance(balance.amount.toString()); + const formattedBalance = formatBalance(balance.amount.toString()); - return ( - - } spacing="base" width="100%"> - - - {title} + return ( + + } spacing="space.04" width="100%"> + + + {title} + + + + {formattedBalance.value} - - - {formattedBalance.value} - - - - - - - {component} - - - ); - } -); + + + + + + {component} + + + ); +} diff --git a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.tsx b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.tsx index 618e0e57a08..0fe3db50c8e 100644 --- a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.tsx +++ b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item.tsx @@ -1,27 +1,22 @@ -import { BoxProps } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; - import { createMoney } from '@shared/models/money.model'; import { Brc20Token } from '@app/query/bitcoin/ordinals/brc20/brc20-tokens.query'; import { Brc20TokenAssetItemLayout } from './brc20-token-asset-item.layout'; -interface Brc20TokenAssetItemProps extends BoxProps { +interface Brc20TokenAssetItemProps { token: Brc20Token; isPressable?: boolean; + onClick?: () => void; } -export const Brc20TokenAssetItem = forwardRefWithAs((props: Brc20TokenAssetItemProps, ref) => { - const { token, isPressable, ...rest } = props; - +export function Brc20TokenAssetItem({ token, isPressable, onClick }: Brc20TokenAssetItemProps) { return ( ); -}); +} diff --git a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-list.layout.tsx b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-list.layout.tsx index 33c02c129f4..bf306441449 100644 --- a/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-list.layout.tsx +++ b/src/app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-list.layout.tsx @@ -1,14 +1,14 @@ -import { Stack, StackProps } from '@stacks/ui'; import { CryptoAssetSelectors } from '@tests/selectors/crypto-asset.selectors'; +import { Stack, StackProps } from 'leather-styles/jsx'; export function Brc20AssetListLayout({ children }: StackProps) { return ( {children} diff --git a/src/app/components/crypto-assets/components/asset-caption.tsx b/src/app/components/crypto-assets/components/asset-caption.tsx index 224c29ed36b..b451063bda9 100644 --- a/src/app/components/crypto-assets/components/asset-caption.tsx +++ b/src/app/components/crypto-assets/components/asset-caption.tsx @@ -1,7 +1,7 @@ -import { FiInfo } from 'react-icons/fi'; +import { Flex, HStack, styled } from 'leather-styles/jsx'; -import { Box, Flex, Stack, Tooltip, color } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; +import { Tooltip } from '@app/components/tooltip'; +import { InfoIcon } from '@app/ui/components/icons/info-icon'; interface AssetCaptionProps { caption: string; @@ -17,21 +17,15 @@ export function AssetCaption({ caption, isUnanchored }: AssetCaptionProps) { • Microblock - + - + - + ) : ( diff --git a/src/app/components/crypto-assets/crypto-currency-asset/asset-copy-icon.tsx b/src/app/components/crypto-assets/crypto-currency-asset/asset-copy-icon.tsx deleted file mode 100644 index 3d707ef929f..00000000000 --- a/src/app/components/crypto-assets/crypto-currency-asset/asset-copy-icon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { FiCheck, FiCopy } from 'react-icons/fi'; - -import { Box, Flex, color } from '@stacks/ui'; - -interface AssetItemCopyIconProps { - hasCopied: boolean; -} - -export function AssetItemCopyIcon({ hasCopied }: AssetItemCopyIconProps) { - return ( - - - - ); -} diff --git a/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.layout.tsx b/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.layout.tsx index bd6907c7f11..a075acc54f3 100644 --- a/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.layout.tsx +++ b/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.layout.tsx @@ -1,7 +1,5 @@ -import { Flex, StackProps } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; -import { truncateMiddle } from '@stacks/ui-utils'; import { CryptoAssetSelectors } from '@tests/selectors/crypto-asset.selectors'; +import { Flex } from 'leather-styles/jsx'; import { styled } from 'leather-styles/jsx'; import { CryptoCurrencies } from '@shared/models/currencies.model'; @@ -12,10 +10,11 @@ import { ftDecimals } from '@app/common/stacks-utils'; import { usePressable } from '@app/components/item-hover'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { AssetRowGrid } from '../components/asset-row-grid'; -interface CryptoCurrencyAssetItemLayoutProps extends StackProps { +interface CryptoCurrencyAssetItemLayoutProps { balance: Money; caption: string; icon: React.ReactNode; @@ -24,86 +23,76 @@ interface CryptoCurrencyAssetItemLayoutProps extends StackProps { title: string; usdBalance?: string; address?: string; - canCopy?: boolean; isHovered?: boolean; currency?: CryptoCurrencies; additionalBalanceInfo?: React.ReactNode; additionalUsdBalanceInfo?: React.ReactNode; rightElement?: React.ReactNode; + onClick?(): void; } -export const CryptoCurrencyAssetItemLayout = forwardRefWithAs( - (props: CryptoCurrencyAssetItemLayoutProps, ref) => { - const { - balance, - caption, - icon, - copyIcon, - isPressable, - title, - usdBalance, - address = '', - isHovered = false, - additionalBalanceInfo, - additionalUsdBalanceInfo, - rightElement, - ...rest - } = props; - const [component, bind] = usePressable(isPressable); +export function CryptoCurrencyAssetItemLayout({ + balance, + caption, + icon, + copyIcon, + isPressable, + title, + usdBalance, + address = '', + isHovered = false, + additionalBalanceInfo, + additionalUsdBalanceInfo, + rightElement, + onClick, +}: CryptoCurrencyAssetItemLayoutProps) { + const [component, bind] = usePressable(isPressable); - const amount = balance.decimals - ? ftDecimals(balance.amount, balance.decimals) - : balance.amount.toString(); - const dataTestId = CryptoAssetSelectors.CryptoAssetListItem.replace( - '{symbol}', - balance.symbol.toLowerCase() - ); - const formattedBalance = formatBalance(amount); + const amount = balance.decimals + ? ftDecimals(balance.amount, balance.decimals) + : balance.amount.toString(); + const dataTestId = CryptoAssetSelectors.CryptoAssetListItem.replace( + '{symbol}', + balance.symbol.toLowerCase() + ); + const formattedBalance = formatBalance(amount); - return ( - + - - - {isHovered ? truncateMiddle(address, 6) : title} + + {isHovered ? truncateMiddle(address, 6) : title} + + } + balance={ + + + {formattedBalance.value} {additionalBalanceInfo} - } - balance={ - - - {formattedBalance.value} {additionalBalanceInfo} - - - } - caption={{caption}} - usdBalance={ - - {balance.amount.toNumber() > 0 && address ? ( - {usdBalance} - ) : null} - {additionalUsdBalanceInfo} - - } - rightElement={rightElement} - /> - - {component} - - ); - } -); + + } + caption={{caption}} + usdBalance={ + + {balance.amount.toNumber() > 0 && address ? ( + {usdBalance} + ) : null} + {additionalUsdBalanceInfo} + + } + rightElement={rightElement} + /> + + {component} + + ); +} diff --git a/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.tsx b/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.tsx index 6df02e8f024..6f382a7e785 100644 --- a/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.tsx +++ b/src/app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item.tsx @@ -1,91 +1,46 @@ -import { useState } from 'react'; -import { toast } from 'react-hot-toast'; - -import { StackProps } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; - import type { AllCryptoCurrencyAssetBalances } from '@shared/models/crypto-asset-balance.model'; -import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; import { spamFilter } from '@app/common/utils/spam-filter'; -import { AssetItemCopyIcon } from './asset-copy-icon'; import { CryptoCurrencyAssetItemLayout } from './crypto-currency-asset-item.layout'; -interface CryptoCurrencyAssetItemProps extends StackProps { +interface CryptoCurrencyAssetItemProps { assetBalance: AllCryptoCurrencyAssetBalances; icon: React.ReactNode; usdBalance?: string; address?: string; isPressable?: boolean; - canCopy?: boolean; additionalBalanceInfo?: React.ReactNode; additionalUsdBalanceInfo?: React.ReactNode; rightElement?: React.ReactNode; + onClick?: () => void; +} +export function CryptoCurrencyAssetItem({ + additionalBalanceInfo, + additionalUsdBalanceInfo, + address, + assetBalance, + icon, + isPressable, + onClick, + rightElement, + usdBalance, +}: CryptoCurrencyAssetItemProps) { + const { balance, asset } = assetBalance; + + return ( + + ); } -export const CryptoCurrencyAssetItem = forwardRefWithAs( - (props: CryptoCurrencyAssetItemProps, ref) => { - const { - assetBalance, - icon, - isPressable, - address, - canCopy, - usdBalance, - additionalBalanceInfo, - additionalUsdBalanceInfo, - rightElement, - ...rest - } = props; - const { balance, asset } = assetBalance; - const [isHovered, setIsHovered] = useState(false); - const { onCopy, hasCopied } = useClipboard(address || ''); - const analytics = useAnalytics(); - - function onHover() { - if (!canCopy) { - return; - } - setIsHovered(true); - } - - function onBlur() { - if (!canCopy) { - return; - } - setIsHovered(false); - } - - function onClick() { - if (!canCopy) { - return; - } - void analytics.track('copy_address_to_clipboard'); - onCopy(); - toast.success('Address copied!'); - } - - return ( - : undefined} - isPressable={isPressable} - ref={ref} - title={spamFilter(asset.name)} - isHovered={isHovered} - address={address} - usdBalance={usdBalance} - onClick={onClick} - onMouseOver={onHover} - onMouseOut={onBlur} - additionalBalanceInfo={additionalBalanceInfo} - additionalUsdBalanceInfo={additionalUsdBalanceInfo} - rightElement={rightElement} - {...rest} - /> - ); - } -); diff --git a/src/app/components/crypto-assets/stacks/components/stacks-asset-avatar.tsx b/src/app/components/crypto-assets/stacks/components/stacks-asset-avatar.tsx index 3194b665536..13fd5147231 100644 --- a/src/app/components/crypto-assets/stacks/components/stacks-asset-avatar.tsx +++ b/src/app/components/crypto-assets/stacks/components/stacks-asset-avatar.tsx @@ -1,5 +1,6 @@ -import { DynamicColorCircle } from '@stacks/ui'; -import { BoxProps } from '@stacks/ui-core'; +import { Box, BoxProps } from 'leather-styles/jsx'; + +import { DynamicColorCircle } from '@app/ui/components/dynamic-color-circle'; import { StacksUnanchoredStatusIcon } from './stacks-unanchored-status-icon'; import { StxAvatar } from './stx-avatar'; @@ -9,6 +10,7 @@ interface StacksAssetAvatarProps extends BoxProps { imageCanonicalUri?: string; isStx?: boolean; isUnanchored?: boolean; + size?: string; } export function StacksAssetAvatar({ children, @@ -16,22 +18,21 @@ export function StacksAssetAvatar({ imageCanonicalUri, isStx, isUnanchored, + size = '36', ...props }: StacksAssetAvatarProps) { if (isStx) return ; - const { color, size } = props; - const imageDimension = (size && +size) || '36px'; + const { color } = props; if (imageCanonicalUri) - return ( - - ); + return ; + if (!gradientString) return null; return ( - - {children} + + {children} {isUnanchored ? : null} ); diff --git a/src/app/components/crypto-assets/stacks/components/stacks-unanchored-status-icon.tsx b/src/app/components/crypto-assets/stacks/components/stacks-unanchored-status-icon.tsx index 25410eb5e67..b412c6df1a8 100644 --- a/src/app/components/crypto-assets/stacks/components/stacks-unanchored-status-icon.tsx +++ b/src/app/components/crypto-assets/stacks/components/stacks-unanchored-status-icon.tsx @@ -1,20 +1,6 @@ -import { color } from '@stacks/ui-utils'; - -import { MicroblockIcon } from '@app/components/icons/microblock'; import { TransactionTypeIconWrapper } from '@app/components/transaction/transaction-type-icon-wrapper'; +import { ZapIcon } from '@app/ui/components/icons/zap-icon'; export function StacksUnanchoredStatusIcon() { - return ( - ( - - )} - /> - ); + return } />; } diff --git a/src/app/components/crypto-assets/stacks/components/stx-avatar.tsx b/src/app/components/crypto-assets/stacks/components/stx-avatar.tsx index 4561e4300f2..34bba2f3c0a 100644 --- a/src/app/components/crypto-assets/stacks/components/stx-avatar.tsx +++ b/src/app/components/crypto-assets/stacks/components/stx-avatar.tsx @@ -1,15 +1,21 @@ -import { BoxProps, Circle, color } from '@stacks/ui'; +import { Circle, CircleProps } from 'leather-styles/jsx'; -import { StxIcon } from '@app/components/icons/stx-icon'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; import { StacksUnanchoredStatusIcon } from './stacks-unanchored-status-icon'; -interface StxAvatarProps extends BoxProps { +interface StxAvatarProps extends CircleProps { isUnanchored?: boolean; } export function StxAvatar({ isUnanchored, ...props }: StxAvatarProps) { return ( - + {isUnanchored ? : null} diff --git a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx index 384ade2ed17..fdc4753f97f 100644 --- a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx +++ b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.layout.tsx @@ -1,6 +1,4 @@ -import { BoxProps } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; -import { Flex, styled } from 'leather-styles/jsx'; +import { Flex, FlexProps, styled } from 'leather-styles/jsx'; import type { Money } from '@shared/models/money.model'; @@ -14,58 +12,63 @@ import { Tooltip } from '@app/components/tooltip'; import { AssetCaption } from '../../components/asset-caption'; import { AssetRowGrid } from '../../components/asset-row-grid'; -interface StacksFungibleTokenAssetItemLayoutProps extends BoxProps { +interface StacksFungibleTokenAssetItemLayoutProps extends FlexProps { avatar: string; balance: Money; caption: string; imageCanonicalUri?: string; isPressable?: boolean; title: string; + onClick?: () => void; } -export const StacksFungibleTokenAssetItemLayout = forwardRefWithAs( - (props: StacksFungibleTokenAssetItemLayoutProps, ref) => { - const { avatar, balance, caption, imageCanonicalUri, isPressable, title, ...rest } = props; - const [component, bind] = usePressable(isPressable); +export function StacksFungibleTokenAssetItemLayout({ + avatar, + balance, + caption, + imageCanonicalUri, + isPressable, + title, + onClick, +}: StacksFungibleTokenAssetItemLayoutProps) { + const [component, bind] = usePressable(isPressable); - const amount = balance.decimals - ? ftDecimals(balance.amount, balance.decimals || 0) - : balance.amount.toString(); - const formattedBalance = formatBalance(amount); + const amount = balance.decimals + ? ftDecimals(balance.amount, balance.decimals || 0) + : balance.amount.toString(); + const formattedBalance = formatBalance(amount); - return ( - - + + {title[0]} + + } + spacing="space.04" + width="100%" + > + {title}} + balance={ + - {title[0]} - + + {formattedBalance.value} + + } - spacing="space.04" - width="100%" - > - {title}} - balance={ - - - {formattedBalance.value} - - - } - caption={} - /> - {component} - - - ); - } -); + caption={} + /> + {component} + + + ); +} diff --git a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.tsx b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.tsx index a15e0e9d7c4..895720521bb 100644 --- a/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.tsx +++ b/src/app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item.tsx @@ -1,7 +1,5 @@ -import { BoxProps } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; -import { getAssetName } from '@stacks/ui-utils'; import { CryptoAssetSelectors } from '@tests/selectors/crypto-asset.selectors'; +import { FlexProps } from 'leather-styles/jsx'; import type { StacksFungibleTokenAssetBalance } from '@shared/models/crypto-asset-balance.model'; import { Money } from '@shared/models/money.model'; @@ -9,39 +7,42 @@ import { Money } from '@shared/models/money.model'; import { getImageCanonicalUri } from '@app/common/crypto-assets/stacks-crypto-asset.utils'; import { formatContractId, getTicker } from '@app/common/utils'; import { spamFilter } from '@app/common/utils/spam-filter'; +import { getAssetName } from '@app/ui/utils/get-asset-name'; import { StacksFungibleTokenAssetItemLayout } from './stacks-fungible-token-asset-item.layout'; -interface StacksFungibleTokenAssetItemProps extends BoxProps { +interface StacksFungibleTokenAssetItemProps extends FlexProps { assetBalance: StacksFungibleTokenAssetBalance; unanchoredAssetBalance?: Money; isPressable?: boolean; + onClick?: () => void; } -export const StacksFungibleTokenAssetItem = forwardRefWithAs( - (props: StacksFungibleTokenAssetItemProps, ref) => { - const { assetBalance, ...rest } = props; - const { asset, balance } = assetBalance; - const { contractAddress, contractAssetName, contractName, name, symbol } = asset; +export function StacksFungibleTokenAssetItem({ + assetBalance, + isPressable, + onClick, +}: StacksFungibleTokenAssetItemProps) { + const { asset, balance } = assetBalance; + const { contractAddress, contractAssetName, contractName, name, symbol } = asset; - const avatar = `${formatContractId(contractAddress, contractName)}::${contractAssetName}`; - const dataTestId = - symbol && CryptoAssetSelectors.CryptoAssetListItem.replace('{symbol}', symbol.toLowerCase()); - const friendlyName = - name || - (contractAssetName.includes('::') ? getAssetName(contractAssetName) : contractAssetName); - const imageCanonicalUri = getImageCanonicalUri(asset.imageCanonicalUri, asset.name); - const caption = symbol || getTicker(friendlyName); - return ( - - ); - } -); + const avatar = `${formatContractId(contractAddress, contractName)}::${contractAssetName}`; + const dataTestId = + symbol && CryptoAssetSelectors.CryptoAssetListItem.replace('{symbol}', symbol.toLowerCase()); + const friendlyName = + name || + (contractAssetName.includes('::') ? getAssetName(contractAssetName) : contractAssetName); + const imageCanonicalUri = getImageCanonicalUri(asset.imageCanonicalUri, asset.name); + const caption = symbol || getTicker(friendlyName); + return ( + + ); +} diff --git a/src/app/components/disclaimer.tsx b/src/app/components/disclaimer.tsx index 4debf7747a7..a623d4396dc 100644 --- a/src/app/components/disclaimer.tsx +++ b/src/app/components/disclaimer.tsx @@ -1,8 +1,7 @@ import { Box, BoxProps, styled } from 'leather-styles/jsx'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; - -import { LeatherButton } from './button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface DisclaimerProps extends BoxProps { disclaimerText: string; diff --git a/src/app/components/drawer/base-drawer.tsx b/src/app/components/drawer/base-drawer.tsx index 2bf4f9fd4e7..91f37039dea 100644 --- a/src/app/components/drawer/base-drawer.tsx +++ b/src/app/components/drawer/base-drawer.tsx @@ -1,14 +1,12 @@ import { ReactNode, Suspense, memo, useCallback, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Flex, FlexProps, transition, useEventListener } from '@stacks/ui'; -import { Box } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; +import { Box, Flex, FlexProps } from 'leather-styles/jsx'; import { noop } from '@shared/utils'; +import { useEventListener } from '@app/common/hooks/use-event-listener'; import { useOnClickOutside } from '@app/common/hooks/use-onclickoutside'; -import { useThemeSwitcher } from '@app/common/theme-provider'; import { DrawerHeader } from './components/drawer-header'; @@ -56,20 +54,19 @@ export const BaseDrawer = memo((props: BaseDrawerProps) => { } = props; const ref = useDrawer(isShowing, onClose ? onClose : noop, pauseOnClickOutside); const navigate = useNavigate(); - const { theme } = useThemeSwitcher(); const onGoBack = () => navigate(-1); return ( { ref={ref} opacity={isShowing ? 1 : 0} transform={isShowing ? 'none' : 'translateY(35px)'} - transition={isShowing ? transition + ' 0.1s' : transition} + transition={isShowing ? 'transition' + ' 0.1s' : 'transition'} transitionDuration="0.4s" willChange="transform, opacity" width="100%" - maxWidth="472px" - bg={theme === 'dark' ? token('colors.black') : token('colors.white')} - borderTopLeftRadius="16px" - borderTopRightRadius="16px" - borderBottomLeftRadius={[0, '16px', '16px', '16px']} - borderBottomRightRadius={[0, '16px', '16px', '16px']} + maxWidth={['768px', '768px', '472px']} + bg="accent.background-primary" + borderTopLeftRadius="lg" + borderTopRightRadius="lg" + borderBottomLeftRadius={[0, 0, 'lg']} + borderBottomRightRadius={[0, 0, 'lg']} position="relative" - mt={['auto', 'unset', 'unset', 'unset']} + mt={['auto', 'auto', 'unset']} maxHeight={['calc(100vh - 24px)', 'calc(100vh - 96px)']} > {title}} {isHovered && isWaitingOnPerformedAction && ( - + {waitingOnPerformedActionMessage} - + )} {onClose && ( - {icon} + {icon} ); } diff --git a/src/app/components/edit-nonce-button.tsx b/src/app/components/edit-nonce-button.tsx index 0b2d1a63461..ae71f0ebf09 100644 --- a/src/app/components/edit-nonce-button.tsx +++ b/src/app/components/edit-nonce-button.tsx @@ -1,22 +1,12 @@ -import { BoxProps } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { ButtonProps, LeatherButton } from '@app/ui/components/button'; -import { Caption } from '@app/components/typography'; - -interface EditNonceButtonProps extends BoxProps { +interface EditNonceButtonProps extends ButtonProps { onEditNonce(): void; } export function EditNonceButton({ onEditNonce, ...props }: EditNonceButtonProps) { return ( - + Edit nonce - + ); } diff --git a/src/app/components/error-label.tsx b/src/app/components/error-label.tsx index 4e8a76a961a..bb31a2d985f 100644 --- a/src/app/components/error-label.tsx +++ b/src/app/components/error-label.tsx @@ -1,25 +1,24 @@ import { css } from 'leather-styles/css'; import { HStack, HstackProps } from 'leather-styles/jsx'; -import { AlertIcon } from './icons/alert-icon'; +import { ErrorCircleIcon } from '@app/ui/components/icons/error-circle-icon'; export function ErrorLabel({ children, ...rest }: HstackProps) { return ( - + {children} ); diff --git a/src/app/components/event-card.tsx b/src/app/components/event-card.tsx index 69f84467132..adb07838a9c 100644 --- a/src/app/components/event-card.tsx +++ b/src/app/components/event-card.tsx @@ -1,9 +1,7 @@ -import { FiMoreHorizontal } from 'react-icons/fi'; +import { Box, HStack, Stack, styled } from 'leather-styles/jsx'; -import { Box, IconButton, Stack, Text, color } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; - -import { Caption } from '@app/components/typography'; +import { EllipsesHorizontalIcon } from '@app/ui/components/icons/ellipses-h-icon'; +import { Caption } from '@app/ui/components/typography/caption'; import { TxAssetItem } from './tx-asset-item'; @@ -23,13 +21,14 @@ export function EventCard(props: EventCardProps): React.JSX.Element { return ( <> - + - - {title} - + {title} + {/* TODO: What does this do? */} {actions && ( - + + + )} @@ -42,11 +41,11 @@ export function EventCard(props: EventCardProps): React.JSX.Element { {message && ( {message} diff --git a/src/app/components/fees-row/components/custom-fee-field.tsx b/src/app/components/fees-row/components/custom-fee-field.tsx index a5a8f4a7d62..cc61499bf39 100644 --- a/src/app/components/fees-row/components/custom-fee-field.tsx +++ b/src/app/components/fees-row/components/custom-fee-field.tsx @@ -1,25 +1,27 @@ import { FormEvent, useCallback } from 'react'; -import { Input, InputGroup, Stack, StackProps, color } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; import { useField } from 'formik'; +import { Flex, Stack, styled } from 'leather-styles/jsx'; import { CryptoCurrencies } from '@shared/models/currencies.model'; import { StacksFeeEstimate } from '@shared/models/fees/stacks-fees.model'; import { stxToMicroStx } from '@app/common/money/unit-conversion'; import { SendFormWarningMessages } from '@app/common/warning-messages'; -import { Caption } from '@app/components/typography'; -interface CustomFeeFieldProps extends StackProps { +interface CustomFeeFieldProps { feeCurrencySymbol: CryptoCurrencies; lowFeeEstimate: StacksFeeEstimate; setFieldWarning(value: string): void; disableFeeSelection?: boolean; } -export function CustomFeeField(props: CustomFeeFieldProps) { - const { feeCurrencySymbol, lowFeeEstimate, setFieldWarning, disableFeeSelection, ...rest } = - props; +export function CustomFeeField({ + feeCurrencySymbol, + lowFeeEstimate, + setFieldWarning, + disableFeeSelection, +}: CustomFeeFieldProps) { const [field, meta, helpers] = useField('fee'); const checkFieldWarning = useCallback( @@ -35,28 +37,29 @@ export function CustomFeeField(props: CustomFeeFieldProps) { ); return ( - - + - - {feeCurrencySymbol} - - + {feeCurrencySymbol} + + ) => { - helpers.setValue(evt.currentTarget.value); + disabled={disableFeeSelection} + onChange={async (evt: FormEvent) => { + await helpers.setValue(evt.currentTarget.value); // Separating warning check from field validations // bc we want the user to be able to submit the form // with the low fee warning present. @@ -64,11 +67,12 @@ export function CustomFeeField(props: CustomFeeFieldProps) { }} pr="38px" placeholder="0" + ring="none" textAlign="right" - type="number" + textStyle="label.02" value={field.value} /> - + ); } diff --git a/src/app/components/fees-row/components/fee-estimate-item.tsx b/src/app/components/fees-row/components/fee-estimate-item.tsx index f5f60e18eae..f2f21e8f218 100644 --- a/src/app/components/fees-row/components/fee-estimate-item.tsx +++ b/src/app/components/fees-row/components/fee-estimate-item.tsx @@ -1,7 +1,10 @@ import { useMemo } from 'react'; -import { FiCheck, FiChevronDown } from 'react-icons/fi'; -import { Stack, Text, color } from '@stacks/ui'; +import { HStack, styled } from 'leather-styles/jsx'; + +import { LeatherButton } from '@app/ui/components/button'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { ChevronDownIcon } from '@app/ui/components/icons/chevron-down-icon'; const labels = ['Low', 'Standard', 'High', 'Custom']; const testLabels = labels.map(label => label.toLowerCase()); @@ -13,30 +16,38 @@ interface FeeEstimateItemProps { selectedItem: number; disableFeeSelection?: boolean; } -export function FeeEstimateItem(props: FeeEstimateItemProps) { - const { index, isVisible, onSelectItem, selectedItem, disableFeeSelection } = props; - +export function FeeEstimateItem({ + index, + isVisible, + onSelectItem, + selectedItem, + disableFeeSelection, +}: FeeEstimateItemProps) { const selectedIcon = useMemo(() => { const isSelected = index === selectedItem; - return isSelected ? : <>; + return isSelected ? : <>; }, [index, selectedItem]); return ( - !disableFeeSelection && onSelectItem(index)} - p="tight" + pl={isVisible ? 'space.02' : 'unset'} + variant="text" > - - {labels[index]} - - {!disableFeeSelection && (isVisible ? selectedIcon : )} - + + {labels[index]} + {!disableFeeSelection && (isVisible ? selectedIcon : )} + + ); } diff --git a/src/app/components/fees-row/components/fee-estimate-select.layout.tsx b/src/app/components/fees-row/components/fee-estimate-select.layout.tsx index d0c5fa78e0f..f4eb3f61398 100644 --- a/src/app/components/fees-row/components/fee-estimate-select.layout.tsx +++ b/src/app/components/fees-row/components/fee-estimate-select.layout.tsx @@ -1,29 +1,28 @@ import { ReactNode, useRef } from 'react'; -import { FiInfo } from 'react-icons/fi'; -import { Box, Fade, Stack, Tooltip, color } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; +import { Stack } from 'leather-styles/jsx'; import { FeeTypes } from '@shared/models/fees/fees.model'; import { useOnClickOutside } from '@app/common/hooks/use-onclickoutside'; -import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { FeeEstimateItem } from './fee-estimate-item'; -const feesInfo = - 'Higher fees increase the likelihood of your transaction getting confirmed before others. Click to learn more.'; -const url = 'https://hiro.so/questions/fee-estimates'; - interface FeeEstimateSelectLayoutProps { children: ReactNode; - isVisible: boolean; onSetIsSelectVisible(value: boolean): void; selectedItem: number; disableFeeSelection?: boolean; + isVisible?: boolean; } -export function FeeEstimateSelectLayout(props: FeeEstimateSelectLayoutProps) { - const { children, isVisible, onSetIsSelectVisible, selectedItem, disableFeeSelection } = props; +export function FeeEstimateSelectLayout({ + children, + onSetIsSelectVisible, + selectedItem, + disableFeeSelection, + isVisible, +}: FeeEstimateSelectLayoutProps) { const ref = useRef(null); useOnClickOutside(ref, () => onSetIsSelectVisible(false)); @@ -34,43 +33,30 @@ export function FeeEstimateSelectLayout(props: FeeEstimateSelectLayoutProps) { onSetIsSelectVisible(true)} selectedItem={FeeTypes.Middle} /> - - {styles => ( - - {children} - - )} - + {isVisible ? ( + + {children} + + ) : null} - - - openInNewTab(url)} - size="14px" - /> - - ); } diff --git a/src/app/components/fees-row/components/fee-estimate-select.tsx b/src/app/components/fees-row/components/fee-estimate-select.tsx index f2503471209..6b9c2f371e7 100644 --- a/src/app/components/fees-row/components/fee-estimate-select.tsx +++ b/src/app/components/fees-row/components/fee-estimate-select.tsx @@ -13,17 +13,15 @@ interface FeeEstimateSelectProps { allowCustom: boolean; disableFeeSelection?: boolean; } -export function FeeEstimateSelect(props: FeeEstimateSelectProps) { - const { - isVisible, - estimate, - onSelectItem, - onSetIsSelectVisible, - selectedItem, - allowCustom, - disableFeeSelection, - } = props; - +export function FeeEstimateSelect({ + isVisible, + estimate, + onSelectItem, + onSetIsSelectVisible, + selectedItem, + allowCustom, + disableFeeSelection, +}: FeeEstimateSelectProps) { return ( - - - Fee + + + + + + + Fee + + openInNewTab(url)} size="xs" /> + + {!isSponsored ? selectInput : null} - + {feeField} {isSponsored && } {!meta.error && fieldWarning && {fieldWarning}} - + ); } diff --git a/src/app/components/fees-row/components/transaction-fee.tsx b/src/app/components/fees-row/components/transaction-fee.tsx index 198820f3236..2b04b9361ed 100644 --- a/src/app/components/fees-row/components/transaction-fee.tsx +++ b/src/app/components/fees-row/components/transaction-fee.tsx @@ -1,11 +1,11 @@ -import { Tooltip } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; +import { styled } from 'leather-styles/jsx'; import { CryptoCurrencies } from '@shared/models/currencies.model'; import { Money } from '@shared/models/money.model'; import { formatDustUsdAmounts, i18nFormatCurrency } from '@app/common/money/format-money'; -import { Caption } from '@app/components/typography'; +import { Tooltip } from '@app/components/tooltip'; interface TransactionFeeProps { fee: string | number; @@ -14,9 +14,13 @@ interface TransactionFeeProps { } export function TransactionFee({ fee, feeCurrencySymbol, usdAmount }: TransactionFeeProps) { const feeLabel = ( - + {fee} {feeCurrencySymbol} - + ); if (!usdAmount || usdAmount.amount.isNaN()) return feeLabel; return {feeLabel}; diff --git a/src/app/components/fees-row/fees-row.tsx b/src/app/components/fees-row/fees-row.tsx index ac600510b0c..2e19021382f 100644 --- a/src/app/components/fees-row/fees-row.tsx +++ b/src/app/components/fees-row/fees-row.tsx @@ -1,9 +1,9 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; -import { Box, StackProps } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; import BigNumber from 'bignumber.js'; import { useField } from 'formik'; +import { styled } from 'leather-styles/jsx'; import { STX_DECIMALS } from '@shared/constants'; import { FeeTypes, Fees } from '@shared/models/fees/fees.model'; @@ -19,23 +19,20 @@ import { FeeEstimateSelect } from './components/fee-estimate-select'; import { FeesRowLayout } from './components/fees-row.layout'; import { TransactionFee } from './components/transaction-fee'; -interface FeeRowProps extends StackProps { +interface FeeRowProps { fees?: Fees; allowCustom?: boolean; isSponsored: boolean; defaultFeeValue?: number; disableFeeSelection?: boolean; } -export function FeesRow(props: FeeRowProps) { - const { - fees, - isSponsored, - allowCustom = true, - defaultFeeValue, - disableFeeSelection, - ...rest - } = props; - +export function FeesRow({ + fees, + isSponsored, + allowCustom = true, + defaultFeeValue, + disableFeeSelection, +}: FeeRowProps) { const [feeField, _, feeHelper] = useField('fee'); const [feeCurrencyField] = useField('feeCurrency'); const [feeTypeField, __, feeTypeHelper] = useField('feeType'); @@ -104,7 +101,7 @@ export function FeesRow(props: FeeRowProps) { [feeTypeHelper, feeHelper, fees, defaultFeeValue] ); - if (!hasFeeEstimates) return ; + if (!hasFeeEstimates) return ; return ( setFieldWarning(value)} /> ) : ( - handleSelectFeeEstimateOrCustomField(FeeTypes.Custom)}> + handleSelectFeeEstimateOrCustomField(FeeTypes.Custom)} + textAlign="right" + width="100%" + type="button" + > - + ) } fieldWarning={fieldWarning} @@ -135,12 +137,11 @@ export function FeesRow(props: FeeRowProps) { allowCustom={allowCustom} isVisible={isSelectVisible} estimate={fees.estimates} - onSelectItem={handleSelectFeeEstimateOrCustomField} + onSelectItem={(index: number) => handleSelectFeeEstimateOrCustomField(index)} onSetIsSelectVisible={(value: boolean) => setIsSelectVisible(value)} selectedItem={selectedItem} /> } - {...rest} /> ); } diff --git a/src/app/components/field-error.tsx b/src/app/components/field-error.tsx index 4c0dac8aa8e..75e53024aab 100644 --- a/src/app/components/field-error.tsx +++ b/src/app/components/field-error.tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from 'react'; import AnimateHeight from 'react-animate-height'; -import { Box, Flex } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { useField } from 'formik'; +import { Box, Flex } from 'leather-styles/jsx'; import { useShowFieldError } from '@app/common/form-utils'; import { ErrorLabel } from '@app/components/error-label'; @@ -28,7 +28,7 @@ export function TextInputFieldError(props: { name: string }) { if (!showError) return ; return ( - + diff --git a/src/app/components/generic-error/generic-error.layout.tsx b/src/app/components/generic-error/generic-error.layout.tsx index c588c78bda6..148dae8939d 100644 --- a/src/app/components/generic-error/generic-error.layout.tsx +++ b/src/app/components/generic-error/generic-error.layout.tsx @@ -4,9 +4,8 @@ import GenericError from '@assets/images/generic-error.png'; import { Flex, FlexProps, HStack, styled } from 'leather-styles/jsx'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; - -import { LeatherButton } from '../button/button'; -import { ExternalLinkIcon } from '../icons/external-link-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; const supportUrl = 'https://wallet.hiro.so/wallet-faq/where-can-i-find-support-for-the-stacks-wallet'; @@ -37,7 +36,7 @@ export function GenericErrorLayout(props: GenericErrorProps) { Reach out to our support team - openInNewTab(supportUrl)}> + openInNewTab(supportUrl)} type="button"> diff --git a/src/app/components/generic-error/generic-error.tsx b/src/app/components/generic-error/generic-error.tsx index 6928ff7283b..6c4e401f977 100644 --- a/src/app/components/generic-error/generic-error.tsx +++ b/src/app/components/generic-error/generic-error.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import { FlexProps } from 'leather-styles/jsx'; +import { FlexProps, styled } from 'leather-styles/jsx'; import { closeWindow } from '@shared/utils'; @@ -9,12 +9,17 @@ import { Header } from '@app/components/header'; import { GenericErrorLayout } from './generic-error.layout'; +export function GenericErrorListItem({ text }: { text: ReactNode }) { + return {text}; +} + interface GenericErrorProps extends FlexProps { body: string; helpTextList: ReactNode[]; onClose?(): void; title: string; } + export function GenericError(props: GenericErrorProps) { const { body, helpTextList, onClose = () => closeWindow(), title, ...rest } = props; diff --git a/src/app/components/header.tsx b/src/app/components/header.tsx index ad547dcaeef..c989663cc83 100644 --- a/src/app/components/header.tsx +++ b/src/app/components/header.tsx @@ -1,22 +1,21 @@ import { useMemo } from 'react'; -import { FiArrowLeft } from 'react-icons/fi'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Box, Flex, FlexProps, IconButton, Stack, useMediaQuery } from '@stacks/ui'; import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; -import { token } from 'leather-styles/tokens'; +import { Flex, FlexProps, HStack, styled } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { useDrawers } from '@app/common/hooks/use-drawers'; +import { useViewportMinWidth } from '@app/common/hooks/use-media-query'; import { LeatherLogo } from '@app/components/leather-logo'; import { NetworkModeBadge } from '@app/components/network-mode-badge'; -import { Title } from '@app/components/typography'; +import { LeatherButton } from '@app/ui/components/button'; +import { ArrowLeftIcon } from '@app/ui/components/icons/arrow-left-icon'; +import { HamburgerIcon } from '@app/ui/components/icons/hamburger-icon'; import { AppVersion } from './app-version'; -import { LeatherButton } from './button/button'; -import { HamburgerIcon } from './icons/hamburger-icon'; interface HeaderProps extends FlexProps { actionButton?: React.JSX.Element; @@ -30,78 +29,71 @@ export function Header(props: HeaderProps) { const { pathname } = useLocation(); const navigate = useNavigate(); - const [desktopViewport] = useMediaQuery(`(min-width: ${token('sizes.desktopViewportMinWidth')})`); + const isBreakpointSm = useViewportMinWidth('sm'); const leatherLogoIsClickable = useMemo(() => { return ( pathname !== RouteUrls.RequestDiagnostics && pathname !== RouteUrls.Onboarding && pathname !== RouteUrls.BackUpSecretKey && - pathname !== RouteUrls.SetPassword + pathname !== RouteUrls.SetPassword && + pathname !== RouteUrls.SignIn && + pathname !== RouteUrls.Home ); }, [pathname]); return ( {onClose ? ( - - - + + + + + ) : null} - {!title && (!onClose || desktopViewport) ? ( + {!title && (!onClose || isBreakpointSm) ? ( - + navigate(RouteUrls.Home) : undefined} /> - + ) : ( - + <styled.span alignSelf="center" flexBasis="60%" textAlign="center" textStyle="heading.05"> {title} - + )} - + {!hideActions && ( setIsShowingSettings(true)} - pointerEvents={isShowingSettings ? 'none' : 'all'} + onClick={() => setIsShowingSettings(!isShowingSettings)} variant="ghost" > )} {actionButton ? actionButton : null} - + ); } diff --git a/src/app/components/hr.tsx b/src/app/components/hr.tsx deleted file mode 100644 index f3776ce8218..00000000000 --- a/src/app/components/hr.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Box, BoxProps } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; -import { JsxStyleProps } from 'leather-styles/types'; - -export function Hr(props: BoxProps) { - return ; -} - -export function DashedHr(props: JsxStyleProps) { - return ( - - ); -} diff --git a/src/app/components/icons/alert-icon.tsx b/src/app/components/icons/alert-icon.tsx deleted file mode 100644 index 6a88f750d6f..00000000000 --- a/src/app/components/icons/alert-icon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export function AlertIcon(props: React.SVGProps) { - return ( - - - - - - ); -} diff --git a/src/app/components/icons/arrow-down-icon.tsx b/src/app/components/icons/arrow-down-icon.tsx deleted file mode 100644 index 017c25f82fa..00000000000 --- a/src/app/components/icons/arrow-down-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -export function ArrowDownIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/arrow-down.tsx b/src/app/components/icons/arrow-down.tsx deleted file mode 100644 index d6941e5e27f..00000000000 --- a/src/app/components/icons/arrow-down.tsx +++ /dev/null @@ -1,19 +0,0 @@ -export function ArrowDown(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/arrow-icon.tsx b/src/app/components/icons/arrow-icon.tsx deleted file mode 100644 index 40259b0b21f..00000000000 --- a/src/app/components/icons/arrow-icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { figmaTheme } from '@app/common/utils/figma-theme'; - -export function ArrowIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/arrow-left-icon.tsx b/src/app/components/icons/arrow-left-icon.tsx deleted file mode 100644 index 824c4646693..00000000000 --- a/src/app/components/icons/arrow-left-icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -export function ArrowLeftIcon(props: React.SVGProps) { - return ( - - - - - - ); -} diff --git a/src/app/components/icons/arrow-up-icon.tsx b/src/app/components/icons/arrow-up-icon.tsx deleted file mode 100644 index 182db96ca8c..00000000000 --- a/src/app/components/icons/arrow-up-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -export function ArrowUpIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/bitcoin-contract-icon.tsx b/src/app/components/icons/bitcoin-contract-icon.tsx deleted file mode 100644 index 195db6aed1e..00000000000 --- a/src/app/components/icons/bitcoin-contract-icon.tsx +++ /dev/null @@ -1,40 +0,0 @@ -export function BitcoinContractIcon() { - return ( - - - - - - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/brc20-token-icon.tsx b/src/app/components/icons/brc20-token-icon.tsx deleted file mode 100644 index 2c3e67e4ae2..00000000000 --- a/src/app/components/icons/brc20-token-icon.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export function Brc20TokenIcon() { - return ( - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/btc-icon.tsx b/src/app/components/icons/btc-icon.tsx deleted file mode 100644 index 410cf96a707..00000000000 --- a/src/app/components/icons/btc-icon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export function BtcIcon() { - return ( - - - - - ); -} diff --git a/src/app/components/icons/btc-ledger-icon.tsx b/src/app/components/icons/btc-ledger-icon.tsx deleted file mode 100644 index 0c5c1f8b48b..00000000000 --- a/src/app/components/icons/btc-ledger-icon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export function BtcLedgerIcon() { - return ( - - - - ); -} diff --git a/src/app/components/icons/btc-stamps-icon.tsx b/src/app/components/icons/btc-stamps-icon.tsx deleted file mode 100644 index b70a453740b..00000000000 --- a/src/app/components/icons/btc-stamps-icon.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import BitcoinStampImg from '@assets/images/bitcoin-stamp.png'; -import { Box } from '@stacks/ui'; - -export function BtcStampsIcon() { - return ; -} diff --git a/src/app/components/icons/checkmark-icon.tsx b/src/app/components/icons/checkmark-icon.tsx deleted file mode 100644 index 9b860c42db0..00000000000 --- a/src/app/components/icons/checkmark-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -export function CheckmarkIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/chevron-down-icon.tsx b/src/app/components/icons/chevron-down-icon.tsx deleted file mode 100644 index ca919137bb3..00000000000 --- a/src/app/components/icons/chevron-down-icon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -export function ChevronDownIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/chevron-up-icon.tsx b/src/app/components/icons/chevron-up-icon.tsx deleted file mode 100644 index 5924271c943..00000000000 --- a/src/app/components/icons/chevron-up-icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -export function ChevronUpIcon(props: React.SVGProps) { - return ( - - - - - - ); -} diff --git a/src/app/components/icons/close-icon.tsx b/src/app/components/icons/close-icon.tsx deleted file mode 100644 index 98316c42590..00000000000 --- a/src/app/components/icons/close-icon.tsx +++ /dev/null @@ -1,29 +0,0 @@ -export function CloseIcon(props: React.SVGProps) { - return ( - - - - - - - ); -} diff --git a/src/app/components/icons/copy-icon.tsx b/src/app/components/icons/copy-icon.tsx deleted file mode 100644 index 175c2c99d76..00000000000 --- a/src/app/components/icons/copy-icon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -export function CopyIcon(props: React.SVGProps) { - return ( - - - - - - - - - - ); -} diff --git a/src/app/components/icons/error-icon.tsx b/src/app/components/icons/error-icon.tsx deleted file mode 100644 index b319dedf3ad..00000000000 --- a/src/app/components/icons/error-icon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export function ErrorIcon(props: React.SVGProps) { - return ( - - - - - - ); -} diff --git a/src/app/components/icons/external-link-icon.tsx b/src/app/components/icons/external-link-icon.tsx deleted file mode 100644 index 5eb39b787e5..00000000000 --- a/src/app/components/icons/external-link-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -export function ExternalLinkIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/eye-slash-icon.tsx b/src/app/components/icons/eye-slash-icon.tsx deleted file mode 100644 index 093f5933e80..00000000000 --- a/src/app/components/icons/eye-slash-icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { figmaTheme } from '@app/common/utils/figma-theme'; - -export function EyeSlashIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/hamburger-icon.tsx b/src/app/components/icons/hamburger-icon.tsx deleted file mode 100644 index 4902e52d1d4..00000000000 --- a/src/app/components/icons/hamburger-icon.tsx +++ /dev/null @@ -1,32 +0,0 @@ -export function HamburgerIcon(props: React.SVGProps) { - return ( - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/info-icon.tsx b/src/app/components/icons/info-icon.tsx deleted file mode 100644 index 575175b81f7..00000000000 --- a/src/app/components/icons/info-icon.tsx +++ /dev/null @@ -1,33 +0,0 @@ -export function InfoIcon(props: React.SVGProps) { - return ( - - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/l-icon.tsx b/src/app/components/icons/l-icon.tsx deleted file mode 100644 index 6c5e7c8a496..00000000000 --- a/src/app/components/icons/l-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -export function LIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/ledger-icon.tsx b/src/app/components/icons/ledger-icon.tsx deleted file mode 100644 index c33d67864e9..00000000000 --- a/src/app/components/icons/ledger-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -export function LedgerIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/lock-icon.tsx b/src/app/components/icons/lock-icon.tsx deleted file mode 100644 index d5ca3019645..00000000000 --- a/src/app/components/icons/lock-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -export function LockIcon(props: React.SVGProps) { - return ( - - - - - - - ); -} diff --git a/src/app/components/icons/microblock.tsx b/src/app/components/icons/microblock.tsx deleted file mode 100644 index ff1eb17dc52..00000000000 --- a/src/app/components/icons/microblock.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { FiZap } from 'react-icons/fi'; - -import { Box, BoxProps } from '@stacks/ui'; - -export function MicroblockIcon(props: BoxProps) { - return ; -} diff --git a/src/app/components/icons/ordinal-icon-full.tsx b/src/app/components/icons/ordinal-icon-full.tsx deleted file mode 100644 index ad732b432f4..00000000000 --- a/src/app/components/icons/ordinal-icon-full.tsx +++ /dev/null @@ -1,15 +0,0 @@ -export function OrdinalIconFull(props: React.SVGProps) { - return ( - - - - - ); -} diff --git a/src/app/components/icons/ordinal-icon.tsx b/src/app/components/icons/ordinal-icon.tsx deleted file mode 100644 index dd6d7164988..00000000000 --- a/src/app/components/icons/ordinal-icon.tsx +++ /dev/null @@ -1,29 +0,0 @@ -export function OrdinalIcon() { - return ( - - - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/ordinal-minimal-icon.tsx b/src/app/components/icons/ordinal-minimal-icon.tsx deleted file mode 100644 index 7e86b7bfe95..00000000000 --- a/src/app/components/icons/ordinal-minimal-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -export function OrdinalMinimalIcon(props: React.SVGProps) { - return ( - - - - - - ); -} diff --git a/src/app/components/icons/plus.tsx b/src/app/components/icons/plus.tsx deleted file mode 100644 index 3a929ec2771..00000000000 --- a/src/app/components/icons/plus.tsx +++ /dev/null @@ -1,17 +0,0 @@ -export function Plus(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/plus2.tsx b/src/app/components/icons/plus2.tsx deleted file mode 100644 index d8402b055d7..00000000000 --- a/src/app/components/icons/plus2.tsx +++ /dev/null @@ -1,15 +0,0 @@ -export function Plus2(props: React.SVGProps) { - return ( - - - - - ); -} diff --git a/src/app/components/icons/qr-code-icon.tsx b/src/app/components/icons/qr-code-icon.tsx deleted file mode 100644 index 4f9bcd27128..00000000000 --- a/src/app/components/icons/qr-code-icon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -export function QrCodeIcon(props: React.SVGProps) { - return ( - - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/refresh-icon.tsx b/src/app/components/icons/refresh-icon.tsx deleted file mode 100644 index e5f38fecebd..00000000000 --- a/src/app/components/icons/refresh-icon.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export function RefreshIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/src/app/components/icons/stx-icon.tsx b/src/app/components/icons/stx-icon.tsx deleted file mode 100644 index 52c7d56155b..00000000000 --- a/src/app/components/icons/stx-icon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { BoxProps, Svg } from '@stacks/ui'; - -export function StxIcon(props: BoxProps) { - return ( - - - - - ); -} diff --git a/src/app/components/icons/stx-ledger-icon.tsx b/src/app/components/icons/stx-ledger-icon.tsx deleted file mode 100644 index 305a8c1b55e..00000000000 --- a/src/app/components/icons/stx-ledger-icon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -export function StxLedgerIcon() { - return ( - - - - - ); -} diff --git a/src/app/components/icons/swap-icon.tsx b/src/app/components/icons/swap-icon.tsx deleted file mode 100644 index c7da54524fd..00000000000 --- a/src/app/components/icons/swap-icon.tsx +++ /dev/null @@ -1,26 +0,0 @@ -export function SwapIcon(props: React.SVGProps) { - return ( - - - - - - - - - - - ); -} diff --git a/src/app/components/icons/unlock-icon.tsx b/src/app/components/icons/unlock-icon.tsx deleted file mode 100644 index ba4f968e7ec..00000000000 --- a/src/app/components/icons/unlock-icon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -export function UnlockIcon(props: React.SVGProps) { - return ( - - - - - - - ); -} diff --git a/src/app/components/icons/wallet-type-ledger-icon.tsx b/src/app/components/icons/wallet-type-ledger-icon.tsx deleted file mode 100644 index e2224a63441..00000000000 --- a/src/app/components/icons/wallet-type-ledger-icon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Box, BoxProps } from '@stacks/ui'; - -export function WalletTypeLedgerIcon(props: BoxProps) { - return ( - - ); -} diff --git a/src/app/components/info-card/info-card.tsx b/src/app/components/info-card/info-card.tsx index 263f88d4632..aefa2d30f86 100644 --- a/src/app/components/info-card/info-card.tsx +++ b/src/app/components/info-card/info-card.tsx @@ -1,21 +1,21 @@ -import { Box, Flex, FlexProps, Stack, StackProps } from '@stacks/ui'; +import { ReactNode } from 'react'; + import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; -import { HStack, styled } from 'leather-styles/jsx'; +import { Box, BoxProps, Flex, FlexProps, HStack, Stack, styled } from 'leather-styles/jsx'; import { isString } from '@shared/utils'; import { whenPageMode } from '@app/common/utils'; - -import { LeatherButton } from '../button/button'; -import { DashedHr } from '../hr'; +import { LeatherButton } from '@app/ui/components/button'; +import { DashedHr } from '@app/ui/components/hr'; // InfoCard interface InfoCardProps extends FlexProps { - children: React.ReactNode; + children: ReactNode; } export function InfoCard({ children, ...props }: InfoCardProps) { return ( - + {children} ); @@ -24,10 +24,9 @@ export function InfoCard({ children, ...props }: InfoCardProps) { // InfoCardRow interface InfoCardRowProps { title?: string; - value: React.ReactNode; - titleAdditionalElement?: React.ReactNode; + value: ReactNode; + titleAdditionalElement?: ReactNode; } - export function InfoCardRow({ title, value, titleAdditionalElement, ...props }: InfoCardRowProps) { return ( @@ -59,14 +58,13 @@ export function InfoCardSeparator() { } // InfoCardAssetValue -interface InfoCardAssetValueProps extends StackProps { +interface InfoCardAssetValueProps extends BoxProps { value: number; fiatValue?: string; fiatSymbol?: string; symbol?: string; - icon?: React.FC; + icon?: ReactNode; } - export function InfoCardAssetValue({ value, fiatValue, @@ -77,14 +75,14 @@ export function InfoCardAssetValue({ }: InfoCardAssetValueProps) { return ( - - {icon && } + + {icon && icon} - + {value} {symbol} @@ -101,19 +99,18 @@ export function InfoCardAssetValue({ // InfoCardBtn interface InfoCardBtnProps { - icon: React.FC; + icon: ReactNode; label: string; onClick: () => void; } - export function InfoCardBtn({ icon, label, onClick }: InfoCardBtnProps) { return ( - + {label} - + {icon} ); @@ -121,26 +118,25 @@ export function InfoCardBtn({ icon, label, onClick }: InfoCardBtnProps) { // InfoCardFooter interface InfoCardFooterProps { - children: React.ReactNode; + children: ReactNode; } - export function InfoCardFooter({ children }: InfoCardFooterProps) { return ( {children} diff --git a/src/app/components/info-label.tsx b/src/app/components/info-label.tsx index ff0fec092d3..4f829ff9a08 100644 --- a/src/app/components/info-label.tsx +++ b/src/app/components/info-label.tsx @@ -11,12 +11,12 @@ export function InfoLabel({ children, title, ...rest }: InfoLabelProps) { diff --git a/src/app/components/inscription-preview-card/components/inscription-metadata.tsx b/src/app/components/inscription-preview-card/components/inscription-metadata.tsx index 5a39660174f..052a8b3e261 100644 --- a/src/app/components/inscription-preview-card/components/inscription-metadata.tsx +++ b/src/app/components/inscription-preview-card/components/inscription-metadata.tsx @@ -1,6 +1,6 @@ -import { Flex, color } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; -import { Text } from '@app/components/typography'; +import { LeatherButton } from '@app/ui/components/button'; interface InscriptionMetadataProps { action?(): void; @@ -19,23 +19,17 @@ export function InscriptionMetadata({ return ( {icon && icon} - - {title} - - - {subtitle} - + {title} + {subtitle} {action ? ( - action()} - type="button" + textStyle="caption.02" + variant="text" > {actionLabel} - + ) : null} ); diff --git a/src/app/components/inscription-preview-card/components/inscription-preview-container.tsx b/src/app/components/inscription-preview-card/components/inscription-preview-container.tsx index 3c4f05d48d9..c0553cb6ca5 100644 --- a/src/app/components/inscription-preview-card/components/inscription-preview-container.tsx +++ b/src/app/components/inscription-preview-card/components/inscription-preview-container.tsx @@ -1,19 +1,19 @@ -import { ReactElement } from 'react'; +import { Box, BoxProps } from 'leather-styles/jsx'; -import { Box, BoxProps } from '@stacks/ui'; +import { HasChildren } from '@app/common/has-children'; -export function InscriptionPreviewContainer(props: { children: ReactElement } & BoxProps) { +export function InscriptionPreviewContainer({ children, ...props }: HasChildren & BoxProps) { return ( - {props.children} + {children} ); } diff --git a/src/app/components/inscription-preview-card/components/inscription-preview.tsx b/src/app/components/inscription-preview-card/components/inscription-preview.tsx index df700480aee..78327a1030c 100644 --- a/src/app/components/inscription-preview-card/components/inscription-preview.tsx +++ b/src/app/components/inscription-preview-card/components/inscription-preview.tsx @@ -1,8 +1,8 @@ -import { Box, BoxProps, Flex } from '@stacks/ui'; +import { BoxProps, Flex } from 'leather-styles/jsx'; import { SupportedInscription } from '@shared/models/inscription.model'; -import { OrdinalIconFull } from '@app/components/icons/ordinal-icon-full'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; import { InscriptionImage } from './inscription-image'; import { InscriptionPreviewContainer } from './inscription-preview-container'; @@ -30,10 +30,8 @@ export function InscriptionPreview({ inscription, ...props }: InscriptionPreview case 'other': { return ( - - - - + + ); diff --git a/src/app/components/inscription-preview-card/components/inscription-text.tsx b/src/app/components/inscription-preview-card/components/inscription-text.tsx index f0c97d11625..a9f657cee47 100644 --- a/src/app/components/inscription-preview-card/components/inscription-text.tsx +++ b/src/app/components/inscription-preview-card/components/inscription-text.tsx @@ -1,7 +1,8 @@ -import { Box, Spinner, Text } from '@stacks/ui'; import { sanitize } from 'dompurify'; +import { Box } from 'leather-styles/jsx'; -import { figmaTheme } from '@app/common/utils/figma-theme'; +import { parseJson } from '@app/components/json'; +import { LoadingSpinner } from '@app/components/loading-spinner'; import { useInscriptionTextContentQuery } from '@app/query/bitcoin/ordinals/inscription-text-content.query'; interface InscriptionTextProps { @@ -10,20 +11,12 @@ interface InscriptionTextProps { export function InscriptionText(props: InscriptionTextProps) { const query = useInscriptionTextContentQuery(props.contentSrc); - if (query.isLoading) return ; + if (query.isLoading) return ; if (query.isError) return null; // TODO return ( - {sanitize(query.data)} +
{sanitize(parseJson(query.data))}
); } diff --git a/src/app/components/inscription-preview-card/inscription-preview-card.tsx b/src/app/components/inscription-preview-card/inscription-preview-card.tsx index 0240bf6088e..4d9e34c47f5 100644 --- a/src/app/components/inscription-preview-card/inscription-preview-card.tsx +++ b/src/app/components/inscription-preview-card/inscription-preview-card.tsx @@ -1,5 +1,3 @@ -import { token } from 'leather-styles/tokens'; - import { Flag } from '../layout/flag'; import { InscriptionMetadata } from './components/inscription-metadata'; @@ -24,12 +22,11 @@ export function InscriptionPreviewCard({ return ( @@ -30,9 +29,9 @@ type HoverBind = ReturnType[1]; type FocusBind = ReturnType[1]; interface DefaultSpreadProps extends HoverBind, FocusBind { + cursor: 'pointer' | 'default'; position: 'relative'; zIndex: 1; - cursor: 'pointer' | 'default'; } interface StateReturnProps { @@ -59,9 +58,9 @@ export function usePressable(isPressable?: boolean): UsePressableReturn { { ...bind, ...focusBind, + cursor: isPressable ? 'pointer' : 'default', position: 'relative', zIndex: 1, - cursor: isPressable ? 'pointer' : 'default', }, { isHovered, isFocused }, ]; diff --git a/src/app/components/json.tsx b/src/app/components/json.tsx index f53b9b9ac10..ddb68623c14 100644 --- a/src/app/components/json.tsx +++ b/src/app/components/json.tsx @@ -1,9 +1,17 @@ import { bytesToHex } from '@stacks/common'; -import { Box } from '@stacks/ui'; import { css } from 'leather-styles/css'; +import { Box } from 'leather-styles/jsx'; import { isBigInt, isTypedArray } from '@shared/utils'; +export function parseJson(content: string) { + try { + return JSON.stringify(JSON.parse(content), null, 2); + } catch (e) { + return content; + } +} + function parseJsonReadable(value: any) { if (isBigInt(value)) return value.toString(); if (isTypedArray(value)) return bytesToHex(value); @@ -20,9 +28,8 @@ export function Json(value: any) { wordWrap: 'break-word', }, })} - fontSize="14px" - lineHeight="1.7" - mt="loose" + textStyle="caption.01" + mt="space.05" >
{JSON.stringify(value, (_, v) => parseJsonReadable(v), 2)}
diff --git a/src/app/components/layout/divider-separator.tsx b/src/app/components/layout/divider-separator.tsx index 37d6bfe7394..69eb744fbad 100644 --- a/src/app/components/layout/divider-separator.tsx +++ b/src/app/components/layout/divider-separator.tsx @@ -1,11 +1,9 @@ -import React, { cloneElement, isValidElement } from 'react'; +import { ReactNode, cloneElement, isValidElement } from 'react'; -import { BoxProps } from '@stacks/ui'; +import { Hr, HrProps } from '@app/ui/components/hr'; -import { Hr } from '../hr'; - -interface DividerSeparatorProps extends BoxProps { - children: React.ReactNode; +interface DividerSeparatorProps extends HrProps { + children: ReactNode; } export function DividerSeparator({ children, ...props }: DividerSeparatorProps) { const parsedChildren = Array.isArray(children) ? children : [children]; @@ -19,7 +17,7 @@ export function DividerSeparator({ children, ...props }: DividerSeparatorProps) cloneElement(child, { key: index, }), -
, +
, ]; }) .filter((_value, index, array) => index !== array.length - 1)} diff --git a/src/app/components/layout/divider.tsx b/src/app/components/layout/divider.tsx index 726ff8b8839..618c2e42c64 100644 --- a/src/app/components/layout/divider.tsx +++ b/src/app/components/layout/divider.tsx @@ -1,5 +1,5 @@ -import { Box, BoxProps, color } from '@stacks/ui'; +import { Box, BoxProps } from 'leather-styles/jsx'; export function Divider(props: BoxProps) { - return ; + return ; } diff --git a/src/app/components/leather-logo.tsx b/src/app/components/leather-logo.tsx index f0934a3706c..91c301f076f 100644 --- a/src/app/components/leather-logo.tsx +++ b/src/app/components/leather-logo.tsx @@ -1,26 +1,26 @@ import { memo } from 'react'; -import { Stack, StackProps, color } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { LeatherButton } from '@app/ui/components/button'; +import { LeatherIcon } from '@app/ui/components/icons/leather-icon'; -import { LeatherIcon } from './icons/leather-icon'; - -interface LeatherLogoProps extends StackProps { +interface LeatherLogoProps { isClickable: boolean; + onClick?(): void; } export const LeatherLogo = memo((props: LeatherLogoProps) => { - const { isClickable, ...rest } = props; + const { isClickable, onClick } = props; return ( - - + ); }); diff --git a/src/app/components/link.tsx b/src/app/components/link.tsx deleted file mode 100644 index 4a8cd894519..00000000000 --- a/src/app/components/link.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { KeyboardEvent } from 'react'; - -import { BoxProps, Text, color } from '@stacks/ui'; - -export const buildEnterKeyEvent = (onClick: () => void) => { - return (event: KeyboardEvent) => { - if (event.key === 'Enter' && onClick) { - onClick(); - } - }; -}; - -export function Link(props: BoxProps): React.JSX.Element { - const { _hover = {}, children, fontSize = '12px', onClick, ...rest } = props; - return ( - - {children} - - ); -} diff --git a/src/app/components/loaders/bitcoin-account-loader.tsx b/src/app/components/loaders/bitcoin-account-loader.tsx new file mode 100644 index 00000000000..4dd3fe014b3 --- /dev/null +++ b/src/app/components/loaders/bitcoin-account-loader.tsx @@ -0,0 +1,14 @@ +import { BitcoinAccount } from '@shared/crypto/bitcoin/bitcoin.utils'; + +import { useCurrentNativeSegwitAccount } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { useCurrentTaprootAccount } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; + +interface CurrentBitcoinAccountLoaderProps { + children: (data: { nativeSegwit: BitcoinAccount; taproot: BitcoinAccount }) => React.ReactNode; +} +export function CurrentBitcoinAccountLoader({ children }: CurrentBitcoinAccountLoaderProps) { + const nativeSegwit = useCurrentNativeSegwitAccount(); + const taproot = useCurrentTaprootAccount(); + if (!taproot || !nativeSegwit) return null; + return children({ nativeSegwit, taproot }); +} diff --git a/src/app/components/stacks-account-loader.tsx b/src/app/components/loaders/stacks-account-loader.tsx similarity index 99% rename from src/app/components/stacks-account-loader.tsx rename to src/app/components/loaders/stacks-account-loader.tsx index aaefeb95402..5de8f2a5826 100644 --- a/src/app/components/stacks-account-loader.tsx +++ b/src/app/components/loaders/stacks-account-loader.tsx @@ -8,7 +8,6 @@ import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-acco interface CurrentStacksAccountLoaderProps { children(data: StacksAccount): React.ReactNode; } - export function CurrentStacksAccountLoader({ children }: CurrentStacksAccountLoaderProps) { const currentAccount = useCurrentStacksAccount(); if (!currentAccount) return null; diff --git a/src/app/components/loading-rectangle.tsx b/src/app/components/loading-rectangle.tsx index befdd38e00f..0a7f7ecd60f 100644 --- a/src/app/components/loading-rectangle.tsx +++ b/src/app/components/loading-rectangle.tsx @@ -1,11 +1,11 @@ -import { Box, BoxProps } from '@stacks/ui'; +import { Box, BoxProps } from 'leather-styles/jsx'; export function LoadingRectangle(props: BoxProps) { return ( ); diff --git a/src/app/components/loading-spinner.tsx b/src/app/components/loading-spinner.tsx index 7eeb2633e1b..ca7530d318b 100644 --- a/src/app/components/loading-spinner.tsx +++ b/src/app/components/loading-spinner.tsx @@ -1,12 +1,11 @@ -import { Spinner, SpinnerSize } from '@stacks/ui'; import { Flex, FlexProps } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; -export function LoadingSpinner(props: { size?: SpinnerSize } & FlexProps) { - const { size = 'lg' } = props; +import { Spinner } from '@app/ui/components/spinner'; + +export function LoadingSpinner(props: { size?: string } & FlexProps) { return ( - + ); } diff --git a/src/app/components/modal-header.tsx b/src/app/components/modal-header.tsx index 72f6db55466..f8d41c06aff 100644 --- a/src/app/components/modal-header.tsx +++ b/src/app/components/modal-header.tsx @@ -1,17 +1,15 @@ import { useNavigate } from 'react-router-dom'; -import { Box } from '@stacks/ui'; import { SharedComponentsSelectors } from '@tests/selectors/shared-component.selectors'; -import { Flex, styled } from 'leather-styles/jsx'; +import { Box, Flex, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; import { RouteUrls } from '@shared/route-urls'; import { NetworkModeBadge } from '@app/components/network-mode-badge'; - -import { LeatherButton } from './button/button'; -import { ArrowLeftIcon } from './icons/arrow-left-icon'; -import { CloseIcon } from './icons/close-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { ArrowLeftIcon } from '@app/ui/components/icons/arrow-left-icon'; +import { CloseIcon } from '@app/ui/components/icons/close-icon'; interface ModalHeaderProps { actionButton?: React.JSX.Element; @@ -50,7 +48,7 @@ export function ModalHeader({ diff --git a/src/app/components/network-mode-badge.tsx b/src/app/components/network-mode-badge.tsx index 549af5392d5..cab9d0517bf 100644 --- a/src/app/components/network-mode-badge.tsx +++ b/src/app/components/network-mode-badge.tsx @@ -2,8 +2,7 @@ import { memo, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { ChainID } from '@stacks/transactions'; -import { Flex, FlexProps, Text } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { Flex, FlexProps, styled } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; @@ -21,22 +20,20 @@ export const NetworkModeBadge = memo((props: FlexProps) => { return ( navigate(RouteUrls.SelectNetwork, { relative: 'path' })} + px="space.03" position="relative" zIndex={999} - _hover={{ cursor: 'pointer' }} - color={token('colors.accent.non-interactive')} - onClick={() => navigate(RouteUrls.SelectNetwork, { relative: 'path' })} {...props} > - + {name} - + ); }); diff --git a/src/app/components/pill.tsx b/src/app/components/pill.tsx index d64ce7121f1..21ed394b13f 100644 --- a/src/app/components/pill.tsx +++ b/src/app/components/pill.tsx @@ -11,11 +11,11 @@ export function Pill({ hoverLabel, label, ...props }: PillProps) { {label} diff --git a/src/app/components/preview-button.tsx b/src/app/components/preview-button.tsx index 01355c5addc..6161fd23a1a 100644 --- a/src/app/components/preview-button.tsx +++ b/src/app/components/preview-button.tsx @@ -1,7 +1,7 @@ import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { useFormikContext } from 'formik'; -import { LeatherButton } from './button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface PreviewButtonProps { text?: string; diff --git a/src/app/components/request-password.tsx b/src/app/components/request-password.tsx index d5eddf71c41..1cca4ecdea0 100644 --- a/src/app/components/request-password.tsx +++ b/src/app/components/request-password.tsx @@ -1,17 +1,15 @@ -import { FormEvent, useCallback, useState } from 'react'; +import { FormEvent, ReactNode, useCallback, useState } from 'react'; -import { Input } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { Stack, styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useKeyActions } from '@app/common/hooks/use-key-actions'; +import { buildEnterKeyEvent } from '@app/common/hooks/use-modifier-key'; import { WaitingMessages, useWaitingMessage } from '@app/common/utils/use-waiting-message'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import { ErrorLabel } from './error-label'; -import { buildEnterKeyEvent } from './link'; import { TwoColumnLayout } from './secret-key/two-column.layout'; const waitingMessages: WaitingMessages = { @@ -22,7 +20,7 @@ const waitingMessages: WaitingMessages = { interface RequestPasswordProps { onSuccess(): void; - title?: string; + title?: ReactNode; caption?: string; } export function RequestPassword({ title, caption, onSuccess }: RequestPasswordProps) { @@ -58,6 +56,7 @@ export function RequestPassword({ title, caption, onSuccess }: RequestPasswordPr <> @@ -80,20 +79,26 @@ export function RequestPassword({ title, caption, onSuccess }: RequestPasswordPr Your password - ) => { setError(''); setPassword(e.currentTarget.value); }} onKeyUp={buildEnterKeyEvent(submit)} + p="space.04" placeholder="Enter your password" + ring="none" type="password" + textStyle="body.02" value={password} width="100%" /> @@ -104,7 +109,7 @@ export function RequestPassword({ title, caption, onSuccess }: RequestPasswordPr disabled={isRunning || !!error} aria-busy={isRunning} onClick={submit} - mt="space.08" + mt={['space.11', 'space.05']} > Continue diff --git a/src/app/components/requester-flag.tsx b/src/app/components/requester-flag.tsx index 38e391a3730..ae8c9ca2547 100644 --- a/src/app/components/requester-flag.tsx +++ b/src/app/components/requester-flag.tsx @@ -13,9 +13,9 @@ export function RequesterFlag({ requester }: RequesterFlagProps) { img={} alignItems="center" justifyContent="center" - py="extra-tight" - px="tight" - borderRadius="10px" + py="space.04" + px="space.02" + borderRadius="sm" width="fit-content" > {requester} diff --git a/src/app/components/secret-key/mnemonic-key/mnemonic-input-field.tsx b/src/app/components/secret-key/mnemonic-key/mnemonic-input-field.tsx index 64de9f7be9a..939598c3c7c 100644 --- a/src/app/components/secret-key/mnemonic-key/mnemonic-input-field.tsx +++ b/src/app/components/secret-key/mnemonic-key/mnemonic-input-field.tsx @@ -62,7 +62,7 @@ export function InputField({ dataTestId, name, onPaste, onChange, value }: Input '&[data-state=error]': { _before: { ...psuedoBorderStyles, - borderColor: 'error', + border: 'error', }, }, })} diff --git a/src/app/components/secret-key/two-column.layout.tsx b/src/app/components/secret-key/two-column.layout.tsx index 92a41198954..460c9d43939 100644 --- a/src/app/components/secret-key/two-column.layout.tsx +++ b/src/app/components/secret-key/two-column.layout.tsx @@ -42,7 +42,7 @@ export function TwoColumnLayout({ pb={['space.02', 'space.05']} gap="space.04" backgroundColor="accent.background-primary" - borderRadius="8px" + borderRadius="xs" width="100%" flex="1" > diff --git a/src/app/components/sponsored-label.tsx b/src/app/components/sponsored-label.tsx index d6f181b3b66..c6b8668b0a7 100644 --- a/src/app/components/sponsored-label.tsx +++ b/src/app/components/sponsored-label.tsx @@ -1,28 +1,24 @@ -import { FiAlertCircle } from 'react-icons/fi'; +import { HStack, Stack, styled } from 'leather-styles/jsx'; -import { Box, Stack, Text, color } from '@stacks/ui'; +import { ErrorCircleIcon } from '@app/ui/components/icons/error-circle-icon'; +// #4476 TODO - visually inspect this export function SponsoredLabel(): React.JSX.Element { return ( - - - + + + This transaction is sponsored, so no fee is charged - - + +
); } diff --git a/src/app/components/stacks-transaction-item/increase-fee-button.tsx b/src/app/components/stacks-transaction-item/increase-fee-button.tsx index c93647aafb7..7cb383c8fef 100644 --- a/src/app/components/stacks-transaction-item/increase-fee-button.tsx +++ b/src/app/components/stacks-transaction-item/increase-fee-button.tsx @@ -1,6 +1,6 @@ -import { FiFastForward } from 'react-icons/fi'; +import { HStack, styled } from 'leather-styles/jsx'; -import { Box, Button, color } from '@stacks/ui'; +import { ChevronsRightIcon } from '@app/ui/components/icons/chevrons-right-icon'; interface IncreaseFeeButtonProps { isEnabled?: boolean; @@ -13,26 +13,28 @@ export function IncreaseFeeButton(props: IncreaseFeeButtonProps) { const isActive = isEnabled && isHovered && !isSelected; return ( - + + + Increase fee + + ); } diff --git a/src/app/components/stacks-transaction-item/stacks-transaction-icon.tsx b/src/app/components/stacks-transaction-item/stacks-transaction-icon.tsx index 5838bd32267..cd4576ea34e 100644 --- a/src/app/components/stacks-transaction-item/stacks-transaction-icon.tsx +++ b/src/app/components/stacks-transaction-item/stacks-transaction-icon.tsx @@ -1,10 +1,11 @@ -import { FiAlertOctagon, FiList } from 'react-icons/fi'; - -import { BoxProps, DynamicColorCircle } from '@stacks/ui'; +import { BoxProps } from 'leather-styles/jsx'; import { StacksTx } from '@shared/models/transactions/stacks-transaction.model'; -import { StxIcon } from '@app/components/icons/stx-icon'; +import { DynamicColorCircle } from '@app/ui/components/dynamic-color-circle'; +import { AlertOctagonIcon } from '@app/ui/components/icons/alert-octagon-icon'; +import { ListIcon } from '@app/ui/components/icons/list-icon'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; import { TransactionIconWrapper } from '../transaction/transaction-icon-wrapper'; import { TransactionTypeIcon } from '../transaction/transaction-type-icon'; @@ -15,35 +16,28 @@ interface TransactionIconProps extends BoxProps { export function StacksTransactionIcon({ transaction, ...rest }: TransactionIconProps) { switch (transaction.tx_type) { case 'coinbase': - return ; + return } transaction={transaction} {...rest} />; case 'smart_contract': return ( - + ); case 'contract_call': return ( ); case 'token_transfer': - return ; + return } transaction={transaction} {...rest} />; case 'poison_microblock': - return ; + return ( + } transaction={transaction} {...rest} /> + ); default: return null; } diff --git a/src/app/components/stacks-transaction-item/stacks-transaction-item.tsx b/src/app/components/stacks-transaction-item/stacks-transaction-item.tsx index 5235f4bfe84..01e314d22a3 100644 --- a/src/app/components/stacks-transaction-item/stacks-transaction-item.tsx +++ b/src/app/components/stacks-transaction-item/stacks-transaction-item.tsx @@ -1,8 +1,6 @@ import { createSearchParams, useLocation, useNavigate } from 'react-router-dom'; -import type { MempoolTransaction } from '@stacks/stacks-blockchain-api-types'; -import { BoxProps, Text, color } from '@stacks/ui'; -import { isPendingTx } from '@stacks/ui-utils'; +import { BoxProps, styled } from 'leather-styles/jsx'; import { StacksTx, TxTransferDetails } from '@shared/models/transactions/stacks-transaction.model'; import { RouteUrls } from '@shared/route-urls'; @@ -13,13 +11,13 @@ import { getTxCaption, getTxTitle, getTxValue, + isPendingTx, } from '@app/common/transactions/stacks/transaction.utils'; import { useWalletType } from '@app/common/use-wallet-type'; import { whenPageMode } from '@app/common/utils'; import { openIndexPageInNewTab } from '@app/common/utils/open-in-new-tab'; import { usePressable } from '@app/components/item-hover'; import { TransactionTitle } from '@app/components/transaction/transaction-title'; -import { Title } from '@app/components/typography'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useRawTxIdState } from '@app/store/transactions/raw.hooks'; @@ -52,7 +50,7 @@ export function StacksTransactionItem({ void analytics.track('view_transaction'); handleOpenTxLink({ blockchain: 'stacks', - txId: transaction?.tx_id || transferDetails?.link || '', + txid: transaction?.tx_id || transferDetails?.link || '', }); }; @@ -73,7 +71,7 @@ export function StacksTransactionItem({ }; const isOriginator = transaction?.sender_address === currentAccount?.address; - const isPending = transaction && isPendingTx(transaction as MempoolTransaction); + const isPending = transaction && isPendingTx(transaction); const caption = transaction ? getTxCaption(transaction) : transferDetails?.caption || ''; const txIcon = transaction ? ( @@ -93,11 +91,11 @@ export function StacksTransactionItem({ ); const txStatus = transaction && ; const txCaption = ( - + {caption} - + ); - const txValue = {value}; + const txValue = {value}; return ( } {isFailed && ( - + Failed - + )} diff --git a/src/app/components/text-input-field.tsx b/src/app/components/text-input-field.tsx index 9ac802f5ba8..c7232938c6e 100644 --- a/src/app/components/text-input-field.tsx +++ b/src/app/components/text-input-field.tsx @@ -1,14 +1,12 @@ import { Ref, useRef } from 'react'; -import { Box, Flex, FlexProps, Input, Text, color } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { useField } from 'formik'; -import { css } from 'leather-styles/css'; -import { HStack } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; +import { Box, Flex, FlexProps, HStack, styled } from 'leather-styles/jsx'; import { useShowFieldError } from '@app/common/form-utils'; import { capitalize } from '@app/common/utils'; +import { LeatherButton } from '@app/ui/components/button'; import { TextInputFieldError } from './field-error'; @@ -45,33 +43,28 @@ export function TextInputField({ const showError = useShowFieldError(name) || hasError; return ( - <> + {label && field.value ? ( - + {label} - + ) : null} {topInputOverlay ? {topInputOverlay} : null} {labelAction ? ( - e.preventDefault()} @@ -108,31 +92,33 @@ export function TextInputField({ if (ref.current !== null && ref.current === document.activeElement) ref.current.blur(); }} - type="button" + textStyle="label.02" + variant="text" zIndex={999} > {labelAction} - + ) : null} - { onBlur?.(); @@ -141,6 +127,6 @@ export function TextInputField({ /> - + ); } diff --git a/src/app/components/tooltip.tsx b/src/app/components/tooltip.tsx index 77a381c328b..1a5be3d9afa 100644 --- a/src/app/components/tooltip.tsx +++ b/src/app/components/tooltip.tsx @@ -1,8 +1,9 @@ import { memo, useMemo } from 'react'; -import { Box, BoxProps } from '@stacks/ui'; import Tippy, { TippyProps } from '@tippyjs/react'; +import { BoxProps, styled } from 'leather-styles/jsx'; +// #4506 TODO replace this with Radix tooltip interface TooltipProps extends TippyProps { hideOnClick?: boolean; label?: TippyProps['content']; @@ -12,13 +13,15 @@ export const Tooltip = memo( ({ children, hideOnClick, label, labelProps = {}, ...rest }: TooltipProps) => { const content = useMemo( () => ( - + {label} - + ), [labelProps, label] ); + if (!label) return <>{children}; + return ( {children} diff --git a/src/app/components/transaction-item/transaction-item.layout.tsx b/src/app/components/transaction-item/transaction-item.layout.tsx index 44463f8bb78..bb961b93108 100644 --- a/src/app/components/transaction-item/transaction-item.layout.tsx +++ b/src/app/components/transaction-item/transaction-item.layout.tsx @@ -1,15 +1,16 @@ -import { Box, Flex, Stack } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { ReactNode } from 'react'; + +import { Box, Flex, HStack } from 'leather-styles/jsx'; interface TransactionItemLayoutProps { openTxLink(): void; - txCaption: JSX.Element; - txTitle: JSX.Element; - txValue: JSX.Element; - txIcon?: JSX.Element; - txStatus?: JSX.Element; - belowCaptionEl?: JSX.Element; - children?: JSX.Element; + txCaption: ReactNode; + txTitle: ReactNode; + txValue: ReactNode; + txIcon?: ReactNode; + txStatus?: ReactNode; + belowCaptionEl?: ReactNode; + children?: ReactNode; } export function TransactionItemLayout({ openTxLink, @@ -24,25 +25,24 @@ export function TransactionItemLayout({ }: TransactionItemLayoutProps) { return ( - {txIcon && txIcon} - + {txTitle} {txValue} - + {txCaption} {txStatus && txStatus} {belowCaptionEl ? belowCaptionEl : null} - + - + {children} ); diff --git a/src/app/components/transaction/microblock-label.tsx b/src/app/components/transaction/microblock-label.tsx index 05db695165c..00aa8feac38 100644 --- a/src/app/components/transaction/microblock-label.tsx +++ b/src/app/components/transaction/microblock-label.tsx @@ -1,8 +1,7 @@ -import { FiInfo } from 'react-icons/fi'; - -import { Box, Flex, Stack, Text, color } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; import { Tooltip } from '@app/components/tooltip'; +import { InfoIcon } from '@app/ui/components/icons/info-icon'; const inMicroblockMessage = 'This transaction is currently in a microblock, which increases the chances of inclusion in the next anchor block.'; @@ -10,19 +9,13 @@ const inMicroblockMessage = export function MicroblockLabel() { return ( - + In microblock - + - - - + + + ); diff --git a/src/app/components/transaction/pending-label.tsx b/src/app/components/transaction/pending-label.tsx index cd46ced6e16..43c97e81f00 100644 --- a/src/app/components/transaction/pending-label.tsx +++ b/src/app/components/transaction/pending-label.tsx @@ -1,8 +1,7 @@ -import { FiInfo } from 'react-icons/fi'; - -import { Box, Flex, Stack, Text, color } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; import { Tooltip } from '@app/components/tooltip'; +import { InfoIcon } from '@app/ui/components/icons/info-icon'; const defaultPendingWaitingMessage = 'This transaction is waiting to be confirmed. Depending on network congestion, this may take anywhere from a few minutes, to a couple of hours.'; @@ -16,19 +15,13 @@ export function PendingLabel({ }: PendingLabelProps) { return ( - + Pending - + - - - + + + ); diff --git a/src/app/components/transaction/token-transfer-icon.tsx b/src/app/components/transaction/token-transfer-icon.tsx new file mode 100644 index 00000000000..7e12e5f7f5c --- /dev/null +++ b/src/app/components/transaction/token-transfer-icon.tsx @@ -0,0 +1,28 @@ +import { StacksTx } from '@shared/models/transactions/stacks-transaction.model'; + +import { useCurrentAccountStxAddressState } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ArrowDownIcon } from '@app/ui/components/icons/arrow-down-icon'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; +import { ZapIcon } from '@app/ui/components/icons/zap-icon'; + +import { getColorFromTx } from './transaction-type-icon'; + +export function TokenTransferIcon(props: { tx: StacksTx }) { + const { tx } = props; + const currentAccountStxAddress = useCurrentAccountStxAddressState(); + const isSent = tx.sender_address === currentAccountStxAddress; + + if ('is_unanchored' in tx && tx.is_unanchored) + return ( + + ); + + if (isSent) return ; + + return ; +} diff --git a/src/app/components/transaction/transaction-icon-wrapper.tsx b/src/app/components/transaction/transaction-icon-wrapper.tsx index 9e9c013c609..1a303a1541a 100644 --- a/src/app/components/transaction/transaction-icon-wrapper.tsx +++ b/src/app/components/transaction/transaction-icon-wrapper.tsx @@ -1,28 +1,30 @@ -import { Box, BoxProps, Circle, color } from '@stacks/ui'; +import { ReactNode } from 'react'; + +import { Circle, CircleProps } from 'leather-styles/jsx'; import { StacksTx } from '@shared/models/transactions/stacks-transaction.model'; import { TransactionTypeIcon } from './transaction-type-icon'; -interface TransactionIconWrapperProps extends BoxProps { - icon: React.FC; +interface TransactionIconWrapperProps extends CircleProps { + icon: ReactNode; transaction: StacksTx; } export function TransactionIconWrapper({ - icon: Icon, + icon, transaction, - ...rest + ...props }: TransactionIconWrapperProps) { return ( - + {icon} ); diff --git a/src/app/components/transaction/transaction-icon.tsx b/src/app/components/transaction/transaction-icon.tsx new file mode 100644 index 00000000000..38297ead18e --- /dev/null +++ b/src/app/components/transaction/transaction-icon.tsx @@ -0,0 +1,26 @@ +import { StacksTx } from '@shared/models/transactions/stacks-transaction.model'; + +import { CodeIcon } from '@app/ui/components/icons/code-icon'; +import { FunctionIcon } from '@app/ui/components/icons/function-icon'; +import { PlusIcon } from '@app/ui/components/icons/plus-icon'; + +import { TokenTransferIcon } from './token-transfer-icon'; + +export function TransactionIcon(props: { tx: StacksTx }) { + const { tx } = props; + + switch (tx.tx_type) { + case 'coinbase': + return ; + case 'smart_contract': + return ; + case 'token_transfer': + return ; + case 'contract_call': + return ; + case 'poison_microblock': + return null; + default: + return null; + } +} diff --git a/src/app/components/transaction/transaction-title.tsx b/src/app/components/transaction/transaction-title.tsx index d535beb1dc5..91481a3ea30 100644 --- a/src/app/components/transaction/transaction-title.tsx +++ b/src/app/components/transaction/transaction-title.tsx @@ -3,7 +3,7 @@ import { useRef, useState } from 'react'; import { useOnResizeListener } from '@app/common/hooks/use-on-resize-listener'; import { spamFilter } from '@app/common/utils/spam-filter'; import { Tooltip } from '@app/components/tooltip'; -import { Title } from '@app/components/typography'; +import { Title } from '@app/ui/components/typography/title'; interface TransactionTitleProps { title: string; diff --git a/src/app/components/transaction/transaction-type-icon-wrapper.tsx b/src/app/components/transaction/transaction-type-icon-wrapper.tsx index 0008a844819..660247fef1f 100644 --- a/src/app/components/transaction/transaction-type-icon-wrapper.tsx +++ b/src/app/components/transaction/transaction-type-icon-wrapper.tsx @@ -1,27 +1,26 @@ -import { Box, BoxProps, Circle, color } from '@stacks/ui'; +import { Circle, CircleProps } from 'leather-styles/jsx'; -interface TransactionTypeIconWrapperProps extends BoxProps { - icon: React.FC; - bg: any; +interface TransactionTypeIconWrapperProps extends CircleProps { + bg?: any; + icon: React.JSX.Element; } export function TransactionTypeIconWrapper({ bg, - icon: Icon, - ...rest + icon, + ...props }: TransactionTypeIconWrapperProps) { return ( - + {icon} ); } diff --git a/src/app/components/transaction/transaction-type-icon.tsx b/src/app/components/transaction/transaction-type-icon.tsx index 1a633af22d4..a4634d66d2a 100644 --- a/src/app/components/transaction/transaction-type-icon.tsx +++ b/src/app/components/transaction/transaction-type-icon.tsx @@ -1,76 +1,36 @@ -import { - FiArrowDown as IconArrowDown, - FiArrowUp as IconArrowUp, - FiCode as IconCode, - FiPlus as IconPlus, -} from 'react-icons/fi'; - -import { BoxProps, ColorsStringLiteral, color } from '@stacks/ui'; -import FunctionIcon from 'mdi-react/FunctionIcon'; - import { StacksTx, StacksTxStatus } from '@shared/models/transactions/stacks-transaction.model'; import { statusFromTx } from '@app/common/transactions/stacks/transaction.utils'; -import { MicroblockIcon } from '@app/components/icons/microblock'; -import { useCurrentAccountStxAddressState } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { TransactionIcon } from './transaction-icon'; import { TransactionTypeIconWrapper } from './transaction-type-icon-wrapper'; -type StatusColorMap = Record; +type StatusColorMap = Record; -const colorFromTx = (tx: StacksTx): ColorsStringLiteral => { +export function getColorFromTx(tx: StacksTx) { const colorMap: StatusColorMap = { - pending: 'feedback-alert', - success_microblock: 'brand', - success_anchor_block: 'brand', - failed: 'feedback-error', - }; - - return colorMap[statusFromTx(tx)] ?? 'feedback-error'; -}; - -function IconForTx(tx: StacksTx, currentAccountStxAddress: string | undefined) { - const isSent = tx.sender_address === currentAccountStxAddress; - - const tokenTransferIcon = (tx: StacksTx) => { - return 'is_unanchored' in tx && tx.is_unanchored - ? () => ( - - ) - : isSent - ? IconArrowUp - : IconArrowDown; + pending: 'warning.label', + success_microblock: 'stacks', + success_anchor_block: 'stacks', + failed: 'error.label', }; - const iconMap = { - coinbase: IconPlus, - smart_contract: IconCode, - token_transfer: tokenTransferIcon(tx), - contract_call: () => , - poison_microblock: null, - }; - return iconMap[tx.tx_type]; + return colorMap[statusFromTx(tx)] ?? 'error.label'; } -interface TransactionTypeIconProps extends BoxProps { +interface TransactionTypeIconProps { transaction: StacksTx; } -export function TransactionTypeIcon({ transaction, ...rest }: TransactionTypeIconProps) { - const currentAccountStxAddress = useCurrentAccountStxAddressState(); - const Icon = IconForTx(transaction, currentAccountStxAddress); - +export function TransactionTypeIcon({ transaction }: TransactionTypeIconProps) { if ( - ['coinbase', 'smart_contract', 'token_transfer', 'contract_call'].includes( - transaction.tx_type - ) && - Icon + ['coinbase', 'contract_call', 'smart_contract', 'token_transfer'].includes(transaction.tx_type) ) { - return ; + return ( + } + /> + ); } return null; } diff --git a/src/app/components/tx-asset-item.tsx b/src/app/components/tx-asset-item.tsx index 1ea9806c693..dfc6602366b 100644 --- a/src/app/components/tx-asset-item.tsx +++ b/src/app/components/tx-asset-item.tsx @@ -1,5 +1,4 @@ -import { Text } from '@stacks/ui'; -import { HStack, HstackProps } from 'leather-styles/jsx'; +import { HStack, HstackProps, styled } from 'leather-styles/jsx'; import { isValidUrl } from '@shared/utils/validate-url'; @@ -21,15 +20,11 @@ export function TxAssetItem(props: TxAssetItemProps) { gradientString={iconString} imageCanonicalUri={imageCanonicalUri} isStx={iconString === 'STX'} - size="32px" + size="32" /> - - {ticker} - + {ticker} - - {amount} - + {amount} ); } diff --git a/src/app/components/typography.tsx b/src/app/components/typography.tsx deleted file mode 100644 index b463762939c..00000000000 --- a/src/app/components/typography.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { Text as BaseText, BoxProps, color } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; -import { BoxProps as LeatherBoxProps, styled } from 'leather-styles/jsx'; - -const interMetrics = { - capHeight: 2048, - ascent: 2728, - descent: -680, - lineGap: 0, - unitsPerEm: 2816, -}; - -const c1 = { - fontMetrics: interMetrics, - fontSize: 14, -}; - -const c2 = { - fontMetrics: interMetrics, - fontSize: 12, -}; - -const c3 = { - fontMetrics: interMetrics, - fontSize: 10, -}; - -const captionStyles = (variant?: 'c1' | 'c2' | 'c3') => { - switch (variant) { - case 'c3': - return c3; - case 'c2': - return c2; - default: - return c1; - } -}; - -type Headings = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'span'; - -export const Title = forwardRefWithAs((props, ref) => ( - -)); - -export const Text = forwardRefWithAs((props, ref) => ( - -)); - -export function Body(props: BoxProps) { - return ; -} - -export const Caption = forwardRefWithAs<{ variant?: 'c1' | 'c2' | 'c3' } & BoxProps, 'span'>( - ({ variant, ...props }, ref) => ( - - ) -); - -export const LCaption = forwardRefWithAs(({ children, ...props }, ref) => ( - - {children} - -)); - -export function CaptionSeparatorDot(props: BoxProps) { - return ( - - • - - ); -} diff --git a/src/app/components/warning-label.tsx b/src/app/components/warning-label.tsx index cf9deb85543..86cd2f890ce 100644 --- a/src/app/components/warning-label.tsx +++ b/src/app/components/warning-label.tsx @@ -1,7 +1,8 @@ import { Box, BoxProps, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; -import { AlertIcon } from './icons/alert-icon'; +import { ErrorCircleIcon } from '@app/ui/components/icons/error-circle-icon'; + import { Flag } from './layout/flag'; interface WarningLabelProps extends BoxProps { @@ -9,16 +10,14 @@ interface WarningLabelProps extends BoxProps { } export function WarningLabel({ children, title, ...props }: WarningLabelProps) { return ( - + } + color="accent.notification-text" + img={} minHeight="48px" - px="base" - py="base-tight" + px="space.04" + py="space.03" width="100%" - color="accent.notification-text" > {title && ( diff --git a/src/app/features/activity-list/components/no-account-activity.tsx b/src/app/features/activity-list/components/no-account-activity.tsx index 4340b859eb4..fe2706444ca 100644 --- a/src/app/features/activity-list/components/no-account-activity.tsx +++ b/src/app/features/activity-list/components/no-account-activity.tsx @@ -1,7 +1,7 @@ import NoActivity from '@assets/images/no-activity.png'; import { Stack } from 'leather-styles/jsx'; -import { Caption } from '@app/components/typography'; +import { Caption } from '@app/ui/components/typography/caption'; export function NoAccountActivity() { return ( diff --git a/src/app/features/activity-list/components/pending-transaction-list/pending-transaction-list.layout.tsx b/src/app/features/activity-list/components/pending-transaction-list/pending-transaction-list.layout.tsx index 9e6dddf33ec..3d2fb787563 100644 --- a/src/app/features/activity-list/components/pending-transaction-list/pending-transaction-list.layout.tsx +++ b/src/app/features/activity-list/components/pending-transaction-list/pending-transaction-list.layout.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import { Stack, Text, color } from '@stacks/ui'; +import { Stack, styled } from 'leather-styles/jsx'; interface PendingTransactionListLayoutProps { children: ReactNode; @@ -8,10 +8,10 @@ interface PendingTransactionListLayoutProps { export function PendingTransactionListLayout({ children }: PendingTransactionListLayoutProps) { return ( <> - + Pending - - + + {children} diff --git a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-icon.tsx b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-icon.tsx index 75e61ea0c34..2c49fe0c55e 100644 --- a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-icon.tsx +++ b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-icon.tsx @@ -1,14 +1,15 @@ import { PayloadType, StacksTransaction, addressToString } from '@stacks/transactions'; -import { BoxProps, DynamicColorCircle } from '@stacks/ui'; +import { CircleProps } from 'leather-styles/jsx'; import { StacksTx } from '@shared/models/transactions/stacks-transaction.model'; import { getTxSenderAddress } from '@app/common/transactions/stacks/transaction.utils'; -import { StxIcon } from '@app/components/icons/stx-icon'; import { TransactionIconWrapper } from '@app/components/transaction/transaction-icon-wrapper'; import { TransactionTypeIcon } from '@app/components/transaction/transaction-type-icon'; +import { DynamicColorCircle } from '@app/ui/components/dynamic-color-circle'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; -interface SubmittedTransactionIconProps extends BoxProps { +interface SubmittedTransactionIconProps extends CircleProps { transaction: StacksTransaction; } export function SubmittedTransactionIcon({ transaction, ...rest }: SubmittedTransactionIconProps) { @@ -17,9 +18,7 @@ export function SubmittedTransactionIcon({ transaction, ...rest }: SubmittedTran return ( } transaction={ { tx_type: 'token_transfer', diff --git a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-item.tsx b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-item.tsx index 2c458e762de..55e1b950976 100644 --- a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-item.tsx +++ b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-item.tsx @@ -1,23 +1,22 @@ import { StacksTransaction } from '@stacks/transactions'; -import { Box, BoxProps, Stack, color } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { Box, HStack, Stack } from 'leather-styles/jsx'; import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; import { getTxSenderAddress } from '@app/common/transactions/stacks/transaction.utils'; import { usePressable } from '@app/components/item-hover'; import { Tooltip } from '@app/components/tooltip'; import { TransactionTitle } from '@app/components/transaction/transaction-title'; -import { Caption, Title } from '@app/components/typography'; -import { SubmittedTransactionIcon } from '@app/features/activity-list/components/submitted-transaction-list/submitted-transaction-icon'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Title } from '@app/ui/components/typography/title'; +import { SubmittedTransactionIcon } from './submitted-transaction-icon'; import { getSubmittedTransactionDetails } from './submitted-transaction-list.utils'; -interface SubmittedTransactionItemProps extends BoxProps { +interface SubmittedTransactionItemProps { transaction: StacksTransaction; txId: string; } -export function SubmittedTransactionItem(props: SubmittedTransactionItemProps) { - const { transaction, txId, ...rest } = props; +export function SubmittedTransactionItem({ transaction, txId }: SubmittedTransactionItemProps) { const [component, bind] = usePressable(true); const { handleOpenTxLink } = useExplorerLink(); @@ -34,46 +33,37 @@ export function SubmittedTransactionItem(props: SubmittedTransactionItemProps) { const { caption, title, value } = submittedTransactionDetails; return ( - - + handleOpenTxLink({ blockchain: 'stacks', suffix: `&submitted=true`, - txId, + txid: txId, }) } position="relative" - spacing="base-loose" + gap="space.04" zIndex={2} > - + - - {caption} + + {caption} - - Submitted - + Submitted - - {value && ( - - {value} - - )} - + {value && {value}} - + {component} ); diff --git a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-list.layout.tsx b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-list.layout.tsx index aba5251c108..6590616a3a3 100644 --- a/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-list.layout.tsx +++ b/src/app/features/activity-list/components/submitted-transaction-list/submitted-transaction-list.layout.tsx @@ -1,7 +1,7 @@ import { ReactNode, useMemo } from 'react'; import { deserializeTransaction } from '@stacks/transactions'; -import { Stack, Text, color } from '@stacks/ui'; +import { Stack, styled } from 'leather-styles/jsx'; import { SubmittedTransactionItem } from '@app/features/activity-list/components/submitted-transaction-list/submitted-transaction-item'; import { SubmittedTransaction } from '@app/store/submitted-transactions/submitted-transactions.slice'; @@ -19,10 +19,10 @@ interface SubmittedTransactionListLayoutProps { export function SubmittedTransactionListLayout({ children }: SubmittedTransactionListLayoutProps) { return ( <> - + Submitted - - + + {children} diff --git a/src/app/features/activity-list/components/transaction-list/stacks-transaction/ft-transfer-item.tsx b/src/app/features/activity-list/components/transaction-list/stacks-transaction/ft-transfer-item.tsx index 8e673148319..c34b4b6f97a 100644 --- a/src/app/features/activity-list/components/transaction-list/stacks-transaction/ft-transfer-item.tsx +++ b/src/app/features/activity-list/components/transaction-list/stacks-transaction/ft-transfer-item.tsx @@ -1,5 +1,3 @@ -import { FiArrowDown, FiArrowUp } from 'react-icons/fi'; - import type { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types'; import { logger } from '@shared/logger'; @@ -19,6 +17,8 @@ import { StacksTransactionItem } from '@app/components/stacks-transaction-item/s import { useGetFungibleTokenMetadataQuery } from '@app/query/stacks/tokens/fungible-tokens/fungible-token-metadata.query'; import { isFtAsset } from '@app/query/stacks/tokens/token-metadata.utils'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ArrowDownIcon } from '@app/ui/components/icons/arrow-down-icon'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; import { TxTransferIconWrapper } from './tx-transfer-icon-wrapper'; @@ -49,15 +49,14 @@ export function FtTransferItem({ ftTransfer, parentTx }: FtTransferItemProps) { assetMetadata.image_canonical_uri && assetMetadata.name && getImageCanonicalUri(assetMetadata.image_canonical_uri, assetMetadata.name); - const icon = isOriginator ? FiArrowUp : FiArrowDown; + const icon = isOriginator ? : ; const title = `${assetMetadata.name || 'Token'} Transfer`; const value = `${isOriginator ? '-' : ''}${displayAmount.toFormat()}`; const transferIcon = ftImageCanonicalUri ? ( {title} diff --git a/src/app/features/activity-list/components/transaction-list/stacks-transaction/stacks-transaction.tsx b/src/app/features/activity-list/components/transaction-list/stacks-transaction/stacks-transaction.tsx index 53c76c76618..9e4dbbfb23d 100644 --- a/src/app/features/activity-list/components/transaction-list/stacks-transaction/stacks-transaction.tsx +++ b/src/app/features/activity-list/components/transaction-list/stacks-transaction/stacks-transaction.tsx @@ -1,5 +1,5 @@ import { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types'; -import { BoxProps } from '@stacks/ui'; +import { BoxProps } from 'leather-styles/jsx'; import { StacksTransactionItem } from '@app/components/stacks-transaction-item/stacks-transaction-item'; import { TransactionTransfers } from '@app/features/activity-list/components/transaction-list/stacks-transaction/transaction-transfers'; diff --git a/src/app/features/activity-list/components/transaction-list/stacks-transaction/stx-transfer-item.tsx b/src/app/features/activity-list/components/transaction-list/stacks-transaction/stx-transfer-item.tsx index 0e88e197436..e8474dcf6a6 100644 --- a/src/app/features/activity-list/components/transaction-list/stacks-transaction/stx-transfer-item.tsx +++ b/src/app/features/activity-list/components/transaction-list/stacks-transaction/stx-transfer-item.tsx @@ -1,5 +1,3 @@ -import { FiArrowDown, FiArrowUp } from 'react-icons/fi'; - import type { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types'; import { @@ -11,6 +9,8 @@ import { stacksValue } from '@app/common/stacks-utils'; import { getTxCaption } from '@app/common/transactions/stacks/transaction.utils'; import { StacksTransactionItem } from '@app/components/stacks-transaction-item/stacks-transaction-item'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ArrowDownIcon } from '@app/ui/components/icons/arrow-down-icon'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; import { TxTransferIconWrapper } from './tx-transfer-icon-wrapper'; @@ -23,7 +23,7 @@ export function StxTransferItem({ stxTransfer, parentTx }: StxTransferItemProps) const isOriginator = stxTransfer.sender === currentAccount?.address; const caption = getTxCaption(parentTx.tx) ?? ''; - const icon = isOriginator ? FiArrowUp : FiArrowDown; + const icon = isOriginator ? : ; const title = 'Stacks Token Transfer'; const value = `${isOriginator ? '-' : ''}${stacksValue({ value: stxTransfer.amount, diff --git a/src/app/features/activity-list/components/transaction-list/stacks-transaction/transaction-transfers.tsx b/src/app/features/activity-list/components/transaction-list/stacks-transaction/transaction-transfers.tsx index fb98ba465a9..3903be1267c 100644 --- a/src/app/features/activity-list/components/transaction-list/stacks-transaction/transaction-transfers.tsx +++ b/src/app/features/activity-list/components/transaction-list/stacks-transaction/transaction-transfers.tsx @@ -1,21 +1,20 @@ import { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types'; -import { BoxProps } from '@stacks/ui'; import { FtTransferItem } from './ft-transfer-item'; import { StxTransferItem } from './stx-transfer-item'; -interface TransactionTransfersProps extends BoxProps { +interface TransactionTransfersProps { transaction: AddressTransactionWithTransfers; } -export function TransactionTransfers({ transaction, ...rest }: TransactionTransfersProps) { +export function TransactionTransfers({ transaction }: TransactionTransfersProps) { return ( <> {transaction.stx_transfers.map((stxTransfer, index) => ( - + ))} {transaction.ft_transfers ? transaction.ft_transfers.map((ftTransfer, index) => ( - + )) : null} diff --git a/src/app/features/activity-list/components/transaction-list/stacks-transaction/tx-transfer-icon-wrapper.tsx b/src/app/features/activity-list/components/transaction-list/stacks-transaction/tx-transfer-icon-wrapper.tsx index aaaa7ba62e3..34e8f316f48 100644 --- a/src/app/features/activity-list/components/transaction-list/stacks-transaction/tx-transfer-icon-wrapper.tsx +++ b/src/app/features/activity-list/components/transaction-list/stacks-transaction/tx-transfer-icon-wrapper.tsx @@ -1,16 +1,26 @@ -import { Box, Circle, color } from '@stacks/ui'; +import React from 'react'; + +import { Box } from 'leather-styles/jsx'; -import { StxIcon } from '@app/components/icons/stx-icon'; import { TransactionTypeIconWrapper } from '@app/components/transaction/transaction-type-icon-wrapper'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; interface TxTransferIconWrapperProps { - icon: React.FC; + icon: React.JSX.Element; } export function TxTransferIconWrapper({ icon }: TxTransferIconWrapperProps) { return ( - - - - + + + + ); } diff --git a/src/app/features/activity-list/components/transaction-list/transaction-list.layout.tsx b/src/app/features/activity-list/components/transaction-list/transaction-list.layout.tsx index b56bd54ef4d..eed16bebc44 100644 --- a/src/app/features/activity-list/components/transaction-list/transaction-list.layout.tsx +++ b/src/app/features/activity-list/components/transaction-list/transaction-list.layout.tsx @@ -1,13 +1,13 @@ import { ReactNode } from 'react'; -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; interface TransactionListLayoutProps { children: ReactNode; } export function TransactionListLayout({ children }: TransactionListLayoutProps) { return ( - + {children} ); diff --git a/src/app/features/activity-list/components/transaction-list/transaction-list.tsx b/src/app/features/activity-list/components/transaction-list/transaction-list.tsx index 997619e1e9e..66fd66605bd 100644 --- a/src/app/features/activity-list/components/transaction-list/transaction-list.tsx +++ b/src/app/features/activity-list/components/transaction-list/transaction-list.tsx @@ -1,6 +1,6 @@ import { useMemo } from 'react'; -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; import { useTransactionListRender } from './hooks/use-transaction-list-render'; import { TransactionListItem } from './transaction-list-item'; diff --git a/src/app/features/activity-list/components/transaction-list/transactions-by-date.layout.tsx b/src/app/features/activity-list/components/transaction-list/transactions-by-date.layout.tsx index f66ddbd1349..117d795d447 100644 --- a/src/app/features/activity-list/components/transaction-list/transactions-by-date.layout.tsx +++ b/src/app/features/activity-list/components/transaction-list/transactions-by-date.layout.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import { Box, Stack, Text, color } from '@stacks/ui'; +import { Box, Stack, styled } from 'leather-styles/jsx'; interface TransactionByDateLayoutProps { children: ReactNode; @@ -14,10 +14,10 @@ export function TransactionsByDateLayout({ }: TransactionByDateLayoutProps) { return ( - + {displayDate} - - + + {children} diff --git a/src/app/features/add-network/add-network.tsx b/src/app/features/add-network/add-network.tsx index 2cf653bce86..3353dd3b8f4 100644 --- a/src/app/features/add-network/add-network.tsx +++ b/src/app/features/add-network/add-network.tsx @@ -1,27 +1,29 @@ -import { useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; +import { SelectContent, SelectItem, SelectRoot, SelectTrigger } from '@radix-ui/themes'; import { ChainID } from '@stacks/transactions'; -import { Input, Stack } from '@stacks/ui'; import { NetworkSelectors } from '@tests/selectors/network.selectors'; -import { Formik } from 'formik'; -import { token } from 'leather-styles/tokens'; +import { Formik, useFormik } from 'formik'; +import { css } from 'leather-styles/css'; +import { Stack, styled } from 'leather-styles/jsx'; -import { DefaultNetworkConfigurations } from '@shared/constants'; +import { BitcoinNetworkModes, DefaultNetworkConfigurations } from '@shared/constants'; import { RouteUrls } from '@shared/route-urls'; import { isValidUrl } from '@shared/utils/validate-url'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { removeTrailingSlash } from '@app/common/url-join'; -import { LeatherButton } from '@app/components/button/button'; import { CenteredPageContainer } from '@app/components/centered-page-container'; import { ErrorLabel } from '@app/components/error-label'; import { Header } from '@app/components/header'; -import { Text } from '@app/components/typography'; import { useCurrentStacksNetworkState, useNetworksActions, } from '@app/store/networks/networks.hooks'; +import { LeatherButton } from '@app/ui/components/button'; +import { Input } from '@app/ui/components/input'; +import { Title } from '@app/ui/components/typography/title'; /** * The **peer** network ID. @@ -35,9 +37,15 @@ enum PeerNetworkID { interface AddNetworkFormValues { key: string; name: string; - url: string; + stacksUrl: string; + bitcoinUrl: string; } -const addNetworkFormValues: AddNetworkFormValues = { key: '', name: '', url: '' }; +const addNetworkFormValues: AddNetworkFormValues = { + key: '', + name: '', + stacksUrl: '', + bitcoinUrl: '', +}; export function AddNetwork() { const [loading, setLoading] = useState(false); @@ -45,19 +53,73 @@ export function AddNetwork() { const navigate = useNavigate(); const network = useCurrentStacksNetworkState(); const networksActions = useNetworksActions(); + const [bitcoinApi, setBitcoinApi] = useState('mainnet'); + + const formikProps = useFormik({ + initialValues: addNetworkFormValues, + onSubmit: () => {}, + }); + + const { setFieldValue } = formikProps; useRouteHeader(
navigate(RouteUrls.Home)} />); + const handleApiChange = (newValue: BitcoinNetworkModes) => { + setBitcoinApi(newValue); + }; + + const setStacksUrl = useCallback( + (value: string) => { + setFieldValue('stacksUrl', value); + }, + [setFieldValue] + ); + + const setBitcoinUrl = useCallback( + (value: string) => { + setFieldValue('bitcoinUrl', value); + }, + [setFieldValue] + ); + + useEffect(() => { + switch (bitcoinApi) { + case 'mainnet': + setStacksUrl('https://api.hiro.so'); + setBitcoinUrl('https://blockstream.info/api'); + break; + case 'testnet': + setStacksUrl('https://api.testnet.hiro.so'); + setBitcoinUrl('https://blockstream.info/testnet/api'); + break; + case 'signet': + setStacksUrl('https://api.testnet.hiro.so'); + setBitcoinUrl('https://mempool.space/signet/api'); + break; + case 'regtest': + setStacksUrl('https://api.testnet.hiro.so'); + setBitcoinUrl('https://mempool.space/testnet/api'); + break; + } + }, [bitcoinApi, setStacksUrl, setBitcoinUrl]); + return ( { - const { name, url, key } = values; - if (!isValidUrl(url)) { - setError('Enter a valid URL'); + onSubmit={async () => { + const { name, stacksUrl, bitcoinUrl, key } = formikProps.values; + + if (!isValidUrl(stacksUrl)) { + setError('Enter a valid Stacks API URL'); + return; + } + + if (!isValidUrl(bitcoinUrl)) { + setError('Enter a valid Bitcoin API URL'); return; } + if (!key) { setError('Enter a unique key'); return; @@ -66,66 +128,83 @@ export function AddNetwork() { setLoading(true); setError(''); + const stacksPath = removeTrailingSlash(new URL(formikProps.values.stacksUrl).href); + const bitcoinPath = removeTrailingSlash(new URL(formikProps.values.bitcoinUrl).href); + + try { + const bitcoinResponse = await network.fetchFn(`${bitcoinPath}/mempool/recent`); + if (!bitcoinResponse.ok) throw new Error('Unable to fetch mempool from bitcoin node'); + const bitcoinMempool = await bitcoinResponse.json(); + if (!Array.isArray(bitcoinMempool)) + throw new Error('Unable to fetch mempool from bitcoin node'); + } catch (error) { + setError('Unable to fetch mempool from bitcoin node'); + setLoading(false); + return; + } + + let stacksChainInfo: any; try { - const path = removeTrailingSlash(new URL(url).href); - const response = await network.fetchFn(`${path}/v2/info`); - const chainInfo = await response.json(); - if (!chainInfo) throw new Error('Unable to fetch info from node'); - - // Attention: - // For mainnet/testnet the v2/info response `.network_id` refers to the chain ID - // For subnets the v2/info response `.network_id` refers to the network ID and the chain ID (they are the same for subnets) - // The `.parent_network_id` refers to the actual peer network ID in both cases - const { network_id: chainId, parent_network_id: parentNetworkId } = chainInfo; - - const isSubnet = typeof chainInfo.l1_subnet_governing_contract === 'string'; - const isFirstLevelSubnet = - isSubnet && - (parentNetworkId === PeerNetworkID.Mainnet || - parentNetworkId === PeerNetworkID.Testnet); - - // Currently, only subnets of mainnet and testnet are supported in the wallet - if (isFirstLevelSubnet) { - const parentChainId = - parentNetworkId === PeerNetworkID.Mainnet ? ChainID.Mainnet : ChainID.Testnet; - networksActions.addNetwork({ - chainId: parentChainId, // Used for differentiating control flow in the wallet - subnetChainId: chainId, // Used for signing transactions (via the network object, not to be confused with the NetworkConfigurations) - id: key as DefaultNetworkConfigurations, - name, - url: path, - }); - navigate(RouteUrls.Home); - return; - } - - if (chainId === ChainID.Mainnet || chainId === ChainID.Testnet) { - networksActions.addNetwork({ - chainId, - id: key as DefaultNetworkConfigurations, - name, - url: path, - }); - navigate(RouteUrls.Home); - return; - } + const stacksResponse = await network.fetchFn(`${stacksPath}/v2/info`); + stacksChainInfo = await stacksResponse.json(); + if (!stacksChainInfo) throw new Error('Unable to fetch info from stacks node'); + } catch (error) { + setError('Unable to fetch info from stacks node'); + setLoading(false); + return; + } + + // Attention: + // For mainnet/testnet the v2/info response `.network_id` refers to the chain ID + // For subnets the v2/info response `.network_id` refers to the network ID and the chain ID (they are the same for subnets) + // The `.parent_network_id` refers to the actual peer network ID in both cases + const { network_id: chainId, parent_network_id: parentNetworkId } = stacksChainInfo; + const isSubnet = typeof stacksChainInfo.l1_subnet_governing_contract === 'string'; + const isFirstLevelSubnet = + isSubnet && + (parentNetworkId === PeerNetworkID.Mainnet || + parentNetworkId === PeerNetworkID.Testnet); + + // Currently, only subnets of mainnet and testnet are supported in the wallet + if (isFirstLevelSubnet) { + const parentChainId = + parentNetworkId === PeerNetworkID.Mainnet ? ChainID.Mainnet : ChainID.Testnet; + networksActions.addNetwork({ + id: key as DefaultNetworkConfigurations, + name: name, + chainId: parentChainId, // Used for differentiating control flow in the wallet + subnetChainId: chainId, // Used for signing transactions (via the network object, not to be confused with the NetworkConfigurations) + url: stacksPath, + bitcoinNetwork: bitcoinApi, + bitcoinUrl: bitcoinPath, + }); + navigate(RouteUrls.Home); + } else if (chainId === ChainID.Mainnet || chainId === ChainID.Testnet) { + networksActions.addNetwork({ + id: key as DefaultNetworkConfigurations, + name: name, + chainId: chainId, + url: stacksPath, + bitcoinNetwork: bitcoinApi, + bitcoinUrl: bitcoinPath, + }); + navigate(RouteUrls.Home); + } else { setError('Unable to determine chainID from node.'); - } catch (error) { - setError('Unable to fetch info from node.'); } setLoading(false); }} > - {({ handleSubmit, values, handleChange }) => ( + {({ handleSubmit }) => (
- + Use this form to add a new instance of the{' '} Stacks Blockchain API + {' '} + or{' '} + + Bitcoin Blockchain API . Make sure you review and trust the host before you add it. - + + Bitcoin API + + + + + Mainnet + + + Testnet + + + Signet + + + Regtest + + + + Stacks API URL + + Bitcoin API URL diff --git a/src/app/features/asset-list/asset-list.tsx b/src/app/features/asset-list/asset-list.tsx index 9726ffa7a63..2d9d24ebb74 100644 --- a/src/app/features/asset-list/asset-list.tsx +++ b/src/app/features/asset-list/asset-list.tsx @@ -3,18 +3,16 @@ import { Outlet } from 'react-router-dom'; import { HomePageSelectors } from '@tests/selectors/home.selectors'; import { Stack } from 'leather-styles/jsx'; -import { LEDGER_BITCOIN_ENABLED } from '@shared/environment'; - import { useBtcAssetBalance } from '@app/common/hooks/balance/btc/use-btc-balance'; import { useWalletType } from '@app/common/use-wallet-type'; import { BitcoinContractEntryPoint } from '@app/components/bitcoin-contract-entry-point/bitcoin-contract-entry-point'; import { Brc20TokensLoader } from '@app/components/brc20-tokens-loader'; import { CryptoCurrencyAssetItem } from '@app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item'; -import { BtcIcon } from '@app/components/icons/btc-icon'; -import { CurrentStacksAccountLoader } from '@app/components/stacks-account-loader'; +import { CurrentStacksAccountLoader } from '@app/components/loaders/stacks-account-loader'; import { useHasBitcoinLedgerKeychain } from '@app/store/accounts/blockchain/bitcoin/bitcoin.ledger'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; import { Collectibles } from '../collectibles/collectibles'; import { PendingBrc20TransferList } from '../pending-brc-20-transfers/pending-brc-20-transfers'; @@ -34,12 +32,6 @@ export function AssetsList() { return ( - {/* Temporary duplication during Ledger Bitcoin feature dev */} - {network.chain.bitcoin.network === 'testnet' && - whenWallet({ - software: , - ledger: null, - })} {whenWallet({ software: ( ), - ledger: LEDGER_BITCOIN_ENABLED ? ( + ledger: ( } /> - ) : null, + ), })} + {/* Temporary duplication during Ledger Bitcoin feature dev */} + {['testnet', 'regtest'].includes(network.chain.bitcoin.bitcoinNetwork) && + whenWallet({ + software: , + ledger: null, + })} + {whenWallet({ software: ( diff --git a/src/app/features/asset-list/components/bitcoin-fungible-tokens-asset-list.tsx b/src/app/features/asset-list/components/bitcoin-fungible-tokens-asset-list.tsx index ef409cd9d50..c8ce70ef4b9 100644 --- a/src/app/features/asset-list/components/bitcoin-fungible-tokens-asset-list.tsx +++ b/src/app/features/asset-list/components/bitcoin-fungible-tokens-asset-list.tsx @@ -1,4 +1,4 @@ -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { Brc20TokenAssetItem } from '@app/components/crypto-assets/bitcoin/brc20-token-asset-list/components/brc20-token-asset-item'; import { Brc20Token } from '@app/query/bitcoin/ordinals/brc20/brc20-tokens.query'; @@ -10,7 +10,7 @@ export function BitcoinFungibleTokenAssetList({ brc20Tokens }: BitcoinFungibleTo if (!brc20Tokens) return null; return ( - + {brc20Tokens.map(token => ( ))} diff --git a/src/app/features/asset-list/components/connect-ledger-asset-button.tsx b/src/app/features/asset-list/components/connect-ledger-asset-button.tsx index a0ddd5f1b2d..dae23f221fa 100644 --- a/src/app/features/asset-list/components/connect-ledger-asset-button.tsx +++ b/src/app/features/asset-list/components/connect-ledger-asset-button.tsx @@ -3,11 +3,12 @@ import { useNavigate } from 'react-router-dom'; import { styled } from 'leather-styles/jsx'; import { SupportedBlockchains } from '@shared/constants'; +import { RouteUrls } from '@shared/route-urls'; import { capitalize } from '@app/common/utils'; -import { LeatherButton } from '@app/components/button/button'; -import { LedgerIcon } from '@app/components/icons/ledger-icon'; import { immediatelyAttemptLedgerConnection } from '@app/features/ledger/hooks/use-when-reattempt-ledger-connection'; +import { LeatherButton } from '@app/ui/components/button'; +import { LedgerIcon } from '@app/ui/components/icons/ledger-icon'; interface ConnectLedgerAssetBtnProps { chain: SupportedBlockchains; @@ -19,7 +20,10 @@ export function ConnectLedgerAssetBtn({ chain }: ConnectLedgerAssetBtnProps) { const onClick = () => { navigate(`${chain}/connect-your-ledger`, { replace: true, - state: { [immediatelyAttemptLedgerConnection]: true }, + state: { + [immediatelyAttemptLedgerConnection]: true, + backgroundLocation: { pathname: RouteUrls.Home }, + }, }); }; return ( diff --git a/src/app/features/asset-list/components/stacks-balance-item.tsx b/src/app/features/asset-list/components/stacks-balance-item.tsx index 7f2e1604a6c..a827f31607e 100644 --- a/src/app/features/asset-list/components/stacks-balance-item.tsx +++ b/src/app/features/asset-list/components/stacks-balance-item.tsx @@ -1,12 +1,10 @@ -import { Text } from '@stacks/ui'; - import { useStxBalance } from '@app/common/hooks/balance/stx/use-stx-balance'; import { ftDecimals } from '@app/common/stacks-utils'; import { CryptoCurrencyAssetItem } from '@app/components/crypto-assets/crypto-currency-asset/crypto-currency-asset-item'; import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; -import { Caption } from '@app/components/typography'; import { useStacksFungibleTokenAssetBalancesAnchoredWithMetadata } from '@app/query/stacks/balance/stacks-ft-balances.hooks'; import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.models'; +import { Caption } from '@app/ui/components/typography/caption'; import { StacksFungibleTokenAssetList } from './stacks-fungible-token-asset-list'; @@ -22,7 +20,7 @@ export function StacksBalanceItem({ account }: StacksBalanceItemProps) { useStxBalance(); const stxAdditionalBalanceInfo = stxLockedBalance?.amount.isGreaterThan(0) ? ( - ({ftDecimals(stxLockedBalance.amount, stxLockedBalance.decimals || 0)} locked) + <>({ftDecimals(stxLockedBalance.amount, stxLockedBalance.decimals || 0)} locked) ) : undefined; const stxAdditionalUsdBalanceInfo = stxLockedBalance?.amount.isGreaterThan(0) ? ( diff --git a/src/app/features/asset-list/components/stacks-fungible-token-asset-list.tsx b/src/app/features/asset-list/components/stacks-fungible-token-asset-list.tsx index 7f39a2b5057..f5a9ff7cfcd 100644 --- a/src/app/features/asset-list/components/stacks-fungible-token-asset-list.tsx +++ b/src/app/features/asset-list/components/stacks-fungible-token-asset-list.tsx @@ -1,4 +1,4 @@ -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import type { StacksFungibleTokenAssetBalance } from '@shared/models/crypto-asset-balance.model'; @@ -9,7 +9,7 @@ interface StacksFungibleTokenAssetListProps { } export function StacksFungibleTokenAssetList({ assetBalances }: StacksFungibleTokenAssetListProps) { return ( - + {assetBalances.map(assetBalance => ( {hasAmount && ( - + {formatMoney(amount)} )} @@ -80,7 +80,7 @@ export function BitcoinChooseFee({ } feesList={feesList} /> - + diff --git a/src/app/features/bitcoin-choose-fee/components/choose-fee-subtitle.tsx b/src/app/features/bitcoin-choose-fee/components/choose-fee-subtitle.tsx index 83f1db18e15..3e8bf3937a0 100644 --- a/src/app/features/bitcoin-choose-fee/components/choose-fee-subtitle.tsx +++ b/src/app/features/bitcoin-choose-fee/components/choose-fee-subtitle.tsx @@ -10,7 +10,7 @@ export function ChooseFeeSubtitle({ isSendingMax }: { isSendingMax: boolean }) { ); return ( - + {subtitle} ); diff --git a/src/app/features/bitcoin-choose-fee/components/choose-fee-tabs.tsx b/src/app/features/bitcoin-choose-fee/components/choose-fee-tabs.tsx index 6e1854c6753..ff69e342bfd 100644 --- a/src/app/features/bitcoin-choose-fee/components/choose-fee-tabs.tsx +++ b/src/app/features/bitcoin-choose-fee/components/choose-fee-tabs.tsx @@ -1,7 +1,6 @@ import { Suspense, useState } from 'react'; -import { Box, Flex, SlideFade, Stack } from '@stacks/ui'; -import type { StackProps } from '@stacks/ui'; +import { Box, Flex, Stack, StackProps } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { LoadingSpinner } from '@app/components/loading-spinner'; @@ -25,7 +24,7 @@ export function ChooseFeeTabs(props: ChooseFeeTabsProps) { }; return ( - + - + {activeTab === 0 && ( - }> - - {styles => ( - - {feesList} - - )} - + }> + + {feesList} + )} {activeTab === 1 && ( }> - - {styles => ( - - {customFee} - - )} - + + {customFee} + )} diff --git a/src/app/features/bitcoin-choose-fee/components/insufficient-balance-error.tsx b/src/app/features/bitcoin-choose-fee/components/insufficient-balance-error.tsx index e4f3870285c..fd5078ebd97 100644 --- a/src/app/features/bitcoin-choose-fee/components/insufficient-balance-error.tsx +++ b/src/app/features/bitcoin-choose-fee/components/insufficient-balance-error.tsx @@ -1,11 +1,11 @@ -import { Box, BoxProps, Text, color } from '@stacks/ui'; +import { Box, BoxProps, styled } from 'leather-styles/jsx'; export function InsufficientBalanceError(props: BoxProps) { return ( - - + + Fee is too expensive for available bitcoin balance - + ); } diff --git a/src/app/features/collectibles/collectibles.tsx b/src/app/features/collectibles/collectibles.tsx index 47779bf9b40..d68749e0168 100644 --- a/src/app/features/collectibles/collectibles.tsx +++ b/src/app/features/collectibles/collectibles.tsx @@ -6,9 +6,9 @@ import { useQueryClient } from '@tanstack/react-query'; import { RouteUrls } from '@shared/route-urls'; import { useWalletType } from '@app/common/use-wallet-type'; -import { CurrentStacksAccountLoader } from '@app/components/stacks-account-loader'; +import { CurrentBitcoinAccountLoader } from '@app/components/loaders/bitcoin-account-loader'; +import { CurrentStacksAccountLoader } from '@app/components/loaders/stacks-account-loader'; import { useConfigNftMetadataEnabled } from '@app/query/common/remote-config/remote-config.query'; -import { useHasBitcoinLedgerKeychain } from '@app/store/accounts/blockchain/bitcoin/bitcoin.ledger'; import { AddCollectible } from './components/add-collectible'; import { Ordinals } from './components/bitcoin/ordinals'; @@ -25,7 +25,6 @@ export function Collectibles() { const queryClient = useQueryClient(); const isFetching = useIsFetchingCollectiblesRelatedQuery(); const [isLoadingMore, setIsLoadingMore] = useState(false); - const hasBitcoinKeychain = useHasBitcoinLedgerKeychain(); return ( void queryClient.refetchQueries({ type: 'active' })} > - {whenWallet({ - software: , - ledger: hasBitcoinKeychain ? : null, - })} + {() => } {isNftMetadataEnabled && ( @@ -53,20 +49,14 @@ export function Collectibles() { )} - {whenWallet({ - software: ( - <> - - - - ), - ledger: hasBitcoinKeychain ? ( + + {() => ( <> - ) : null, - })} + )} + ); } diff --git a/src/app/features/collectibles/components/_collectible-types/collectible-other.tsx b/src/app/features/collectibles/components/_collectible-types/collectible-other.tsx index a3d725f3458..0f6117e9226 100644 --- a/src/app/features/collectibles/components/_collectible-types/collectible-other.tsx +++ b/src/app/features/collectibles/components/_collectible-types/collectible-other.tsx @@ -1,4 +1,4 @@ -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; import { CollectibleItemLayout, CollectibleItemLayoutProps } from '../collectible-item.layout'; diff --git a/src/app/features/collectibles/components/_collectible-types/collectible-text.layout.tsx b/src/app/features/collectibles/components/_collectible-types/collectible-text.layout.tsx index 7a4173e032b..b17e0d3a356 100644 --- a/src/app/features/collectibles/components/_collectible-types/collectible-text.layout.tsx +++ b/src/app/features/collectibles/components/_collectible-types/collectible-text.layout.tsx @@ -1,5 +1,5 @@ -import { Box } from '@stacks/ui'; import { sanitize } from 'dompurify'; +import { Box } from 'leather-styles/jsx'; interface CollectibleTextLayoutProps { children: string; @@ -20,11 +20,9 @@ export function CollectibleTextLayout({ children }: CollectibleTextLayoutProps) color="white" height="100%" p="20px" - sx={{ - position: 'relative', - overflow: 'hidden', - textAlign: 'left', - }} + position="relative" + overflow="hidden" + textAlign="left" width="100%" >
{sanitize(children)}
diff --git a/src/app/features/collectibles/components/add-collectible.tsx b/src/app/features/collectibles/components/add-collectible.tsx index 948173ad42e..37629df52e1 100644 --- a/src/app/features/collectibles/components/add-collectible.tsx +++ b/src/app/features/collectibles/components/add-collectible.tsx @@ -1,28 +1,12 @@ import { useLocation, useNavigate } from 'react-router-dom'; -import { Box } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; - import { RouteUrls } from '@shared/route-urls'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { Plus } from '@app/components/icons/plus'; +import { PlusIcon } from '@app/ui/components/icons/plus-icon'; import { CollectibleItemLayout } from './collectible-item.layout'; -const backgroundProps = { - backgroundColor: token('colors.brown.1'), - border: '2px dashed #DCDDE2', - borderRadius: '16px', - _hover: { - cursor: 'pointer', - backgroundColor: '#F9F9FA', - }, - _active: { - backgroundColor: '#EFEFF2', - }, -}; - export function AddCollectible() { const navigate = useNavigate(); const analytics = useAnalytics(); @@ -30,7 +14,6 @@ export function AddCollectible() { return ( { void analytics.track('select_add_new_collectible'); navigate(`${RouteUrls.Home}${RouteUrls.ReceiveCollectible}`, { @@ -39,10 +22,11 @@ export function AddCollectible() { }, }); }} + showBorder subtitle="Collectible" title="Add new" > - + ); } diff --git a/src/app/features/collectibles/components/bitcoin/inscription-text.tsx b/src/app/features/collectibles/components/bitcoin/inscription-text.tsx index b3342a8dd9d..abacdc4984b 100644 --- a/src/app/features/collectibles/components/bitcoin/inscription-text.tsx +++ b/src/app/features/collectibles/components/bitcoin/inscription-text.tsx @@ -1,16 +1,9 @@ -import { OrdinalMinimalIcon } from '@app/components/icons/ordinal-minimal-icon'; +import { parseJson } from '@app/components/json'; import { useInscriptionTextContentQuery } from '@app/query/bitcoin/ordinals/inscription-text-content.query'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; import { CollectibleText } from '../_collectible-types/collectible-text'; -function processContent(content: string) { - try { - return JSON.stringify(JSON.parse(content), null, 2); - } catch (e) { - return content; - } -} - interface InscriptionTextProps { contentSrc: string; inscriptionNumber: number; @@ -29,11 +22,11 @@ export function InscriptionText({ return ( } + icon={} key={inscriptionNumber} onClickCallToAction={onClickCallToAction} onClickSend={onClickSend} - content={processContent(query.data)} + content={parseJson(query.data)} subtitle="Ordinal inscription" title={`# ${inscriptionNumber}`} /> diff --git a/src/app/features/collectibles/components/bitcoin/inscription.tsx b/src/app/features/collectibles/components/bitcoin/inscription.tsx index 079ce31291d..64d7259da73 100644 --- a/src/app/features/collectibles/components/bitcoin/inscription.tsx +++ b/src/app/features/collectibles/components/bitcoin/inscription.tsx @@ -4,9 +4,8 @@ import { Inscription as InscriptionType } from '@shared/models/inscription.model import { RouteUrls } from '@shared/route-urls'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { OrdinalIconFull } from '@app/components/icons/ordinal-icon-full'; -import { OrdinalMinimalIcon } from '@app/components/icons/ordinal-minimal-icon'; import { convertInscriptionToSupportedInscriptionType } from '@app/query/bitcoin/ordinals/inscription.hooks'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; import { CollectibleImage } from '../_collectible-types/collectible-image'; import { CollectibleOther } from '../_collectible-types/collectible-other'; @@ -30,7 +29,7 @@ export function Inscription({ rawInscription }: InscriptionProps) { case 'image': { return ( } + icon={} key={inscription.title} onClickCallToAction={() => openInNewTab(inscription.infoUrl)} onClickSend={() => openSendInscriptionModal()} @@ -59,7 +58,7 @@ export function Inscription({ rawInscription }: InscriptionProps) { subtitle="Ordinal inscription" title={`# ${inscription.number}`} > - + ); } diff --git a/src/app/features/collectibles/components/bitcoin/ordinals.tsx b/src/app/features/collectibles/components/bitcoin/ordinals.tsx index 5bae0628251..b2cd15655e3 100644 --- a/src/app/features/collectibles/components/bitcoin/ordinals.tsx +++ b/src/app/features/collectibles/components/bitcoin/ordinals.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { useInView } from 'react-intersection-observer'; -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useGetInscriptionsInfiniteQuery } from '@app/query/bitcoin/ordinals/inscriptions.query'; diff --git a/src/app/features/collectibles/components/bitcoin/stamp.tsx b/src/app/features/collectibles/components/bitcoin/stamp.tsx index cb768a2aed0..38ed35fd264 100644 --- a/src/app/features/collectibles/components/bitcoin/stamp.tsx +++ b/src/app/features/collectibles/components/bitcoin/stamp.tsx @@ -1,8 +1,6 @@ -import BitcoinStampImg from '@assets/images/bitcoin-stamp.png'; -import { Box } from '@stacks/ui'; - import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { Stamp as BitcoinStamp } from '@app/query/bitcoin/stamps/stamps-by-address.query'; +import { StampsIcon } from '@app/ui/components/icons/stamps-icon'; import { CollectibleImage } from '../_collectible-types/collectible-image'; @@ -13,11 +11,7 @@ export function Stamp(props: { bitcoinStamp: BitcoinStamp }) { return ( - - - } + icon={} key={bitcoinStamp.stamp} onClickCallToAction={() => openInNewTab(`${stampChainAssetUrl}${bitcoinStamp.stamp}`)} src={bitcoinStamp.stamp_url} diff --git a/src/app/features/collectibles/components/collectibes.layout.tsx b/src/app/features/collectibles/components/collectibes.layout.tsx index 63f6c4303d8..ccdae07f19e 100644 --- a/src/app/features/collectibles/components/collectibes.layout.tsx +++ b/src/app/features/collectibles/components/collectibes.layout.tsx @@ -1,9 +1,9 @@ -import { Spinner } from '@stacks/ui'; import { Flex, Grid, HStack, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; -import { RefreshIcon } from '@app/components/icons/refresh-icon'; import { LoadingSpinner } from '@app/components/loading-spinner'; +import { RefreshIcon } from '@app/ui/components/icons/refresh-icon'; +import { Spinner } from '@app/ui/components/spinner'; interface CollectiblesLayoutProps { title: string; @@ -13,8 +13,14 @@ interface CollectiblesLayoutProps { subHeader?: React.ReactNode; children: React.ReactNode; } -export function CollectiblesLayout(props: CollectiblesLayoutProps) { - const { title, isLoading, onRefresh, subHeader, isLoadingMore, children } = props; +export function CollectiblesLayout({ + title, + isLoading, + onRefresh, + subHeader, + isLoadingMore, + children, +}: CollectiblesLayoutProps) { return ( <> diff --git a/src/app/features/collectibles/components/collectible-hover.tsx b/src/app/features/collectibles/components/collectible-hover.tsx index fc410a40579..d749908879a 100644 --- a/src/app/features/collectibles/components/collectible-hover.tsx +++ b/src/app/features/collectibles/components/collectible-hover.tsx @@ -1,7 +1,6 @@ -import { Box, Flex, color } from '@stacks/ui'; +import { Box, styled } from 'leather-styles/jsx'; -import { figmaTheme } from '@app/common/utils/figma-theme'; -import { ArrowIcon } from '@app/components/icons/arrow-icon'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; interface CollectibleHoverProps { collectibleTypeIcon?: React.JSX.Element; @@ -15,7 +14,6 @@ export function CollectibleHover({ }: CollectibleHoverProps) { return ( - + {collectibleTypeIcon} {onClickCallToAction && ( - { e.stopPropagation(); onClickCallToAction(); }} - as="button" position="absolute" right="12px" top="12px" + type="button" width="30px" - height="30px" - backgroundColor={color('bg')} - borderRadius="50%" - justifyContent="center" - alignItems="center" - _hover={{ backgroundColor: figmaTheme.surfaceHovered }} - _focus={{ outline: `4px solid ${figmaTheme.borderFocused}` }} > - - + + )} ); diff --git a/src/app/features/collectibles/components/collectible-item.layout.tsx b/src/app/features/collectibles/components/collectible-item.layout.tsx index c1c00a076bc..636389aeece 100644 --- a/src/app/features/collectibles/components/collectible-item.layout.tsx +++ b/src/app/features/collectibles/components/collectible-item.layout.tsx @@ -1,118 +1,114 @@ import { ReactNode } from 'react'; -import { Box, Button, Stack, Text } from '@stacks/ui'; -import type { BoxProps } from '@stacks/ui'; +import { Box, Stack, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; import { useHover } from 'use-events'; -import { figmaTheme } from '@app/common/utils/figma-theme'; - import { CollectibleHover } from './collectible-hover'; export interface CollectibleItemLayoutProps { - backgroundElementProps?: BoxProps; children: ReactNode; hoverText?: string; onClickCallToAction?(): void; onClickLayout?(): void; onClickSend?(): void; collectibleTypeIcon?: React.JSX.Element; + showBorder?: boolean; subtitle: string; title: string; } export function CollectibleItemLayout({ - backgroundElementProps, children, onClickCallToAction, onClickSend, onClickLayout, collectibleTypeIcon, + showBorder, subtitle, title, }: CollectibleItemLayoutProps) { const [isHovered, bind] = useHover(); return ( - - - - - - {children} - + + + + + {children} - - - {title} - - - {subtitle} - - - - {onClickSend ? ( - - - - ) : ( - - )} + + + {title} + + + {subtitle} + + + {onClickSend ? ( + + { + e.stopPropagation(); + onClickSend(); + }} + px="space.03" + py="space.02" + textStyle="caption.01" + type="button" + > + Send + + + ) : ( + + )} ); } diff --git a/src/app/features/collectibles/components/image-unavailable.tsx b/src/app/features/collectibles/components/image-unavailable.tsx index e8222e37317..7997acece61 100644 --- a/src/app/features/collectibles/components/image-unavailable.tsx +++ b/src/app/features/collectibles/components/image-unavailable.tsx @@ -1,29 +1,21 @@ -import { Box, Flex } from '@stacks/ui'; -import { Text } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; -import { figmaTheme } from '@app/common/utils/figma-theme'; -import { EyeSlashIcon } from '@app/components/icons/eye-slash-icon'; +import { EyeSlashIcon } from '@app/ui/components/icons/eye-slash-icon'; export function ImageUnavailable() { return ( - - - - - Image currently - - - unavailable - + + Image currently + unavailable ); } diff --git a/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx b/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx index fdf0d77938f..1b63b01a779 100644 --- a/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx +++ b/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx @@ -1,23 +1,15 @@ import StacksNftBns from '@assets/images/stacks-nft-bns.png'; -import { figmaTheme } from '@app/common/utils/figma-theme'; -import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; import { CollectibleItemLayout } from '../collectible-item.layout'; -const backgroundProps = { - backgroundColor: figmaTheme.surfaceSecondary, - border: 'transparent', - borderRadius: '16px', -}; - export function StacksBnsName(props: { bnsName: string }) { const { bnsName } = props; return ( } + collectibleTypeIcon={} subtitle="Bitcoin Naming System" title={bnsName} > diff --git a/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx b/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx index 77e3f08e6d9..10000db4ecb 100644 --- a/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx +++ b/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx @@ -2,17 +2,11 @@ import { Metadata as StacksNftMetadata } from '@hirosystems/token-metadata-api-c import { isValidUrl } from '@shared/utils/validate-url'; -import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; +import { StxIcon } from '@app/ui/components/icons/stx-icon'; import { CollectibleImage } from '../_collectible-types/collectible-image'; import { ImageUnavailable } from '../image-unavailable'; -const backgroundProps = { - backgroundColor: 'transparent', - border: 'transparent', - borderRadius: '16px', -}; - interface StacksNonFungibleTokensProps { metadata: StacksNftMetadata; } @@ -24,8 +18,7 @@ export function StacksNonFungibleTokens({ metadata }: StacksNonFungibleTokensPro return ( } + icon={} src={metadata.cached_image ?? ''} subtitle="Stacks NFT" title={metadata.name ?? ''} diff --git a/src/app/features/collectibles/components/taproot-balance-displayer.tsx b/src/app/features/collectibles/components/taproot-balance-displayer.tsx index 5f6125fe568..f42caa1882c 100644 --- a/src/app/features/collectibles/components/taproot-balance-displayer.tsx +++ b/src/app/features/collectibles/components/taproot-balance-displayer.tsx @@ -1,7 +1,7 @@ import { formatMoney } from '@app/common/money/format-money'; import { Tooltip } from '@app/components/tooltip'; -import { Caption } from '@app/components/typography'; import { useCurrentTaprootAccountBalance } from '@app/query/bitcoin/balance/btc-taproot-balance.hooks'; +import { LeatherButton } from '@app/ui/components/button'; const taprootSpendNotSupportedYetMsg = ` Total amount of BTC in your Taproot account addresses. Click to @@ -16,13 +16,13 @@ export function TaprootBalanceDisplayer({ onSelectRetrieveBalance }: TaprootBala if (balance.amount.isLessThanOrEqualTo(0)) return null; return ( - onSelectRetrieveBalance()} - _hover={{ textDecoration: 'underline' }} + textStyle="caption.02" + variant="text" > {formatMoney(balance)} - + ); } diff --git a/src/app/features/container/container.layout.tsx b/src/app/features/container/container.layout.tsx index 3b9c94dfe6e..a3c5e99e9b8 100644 --- a/src/app/features/container/container.layout.tsx +++ b/src/app/features/container/container.layout.tsx @@ -1,4 +1,4 @@ -import { Flex } from '@stacks/ui'; +import { Flex } from 'leather-styles/jsx'; interface ContainerLayoutProps { children: React.JSX.Element | React.JSX.Element[]; diff --git a/src/app/features/container/container.tsx b/src/app/features/container/container.tsx index 10dcb48e05f..76d8367fcaf 100644 --- a/src/app/features/container/container.tsx +++ b/src/app/features/container/container.tsx @@ -25,9 +25,7 @@ export function Container() { useOnWalletLock(() => closeWindow()); useOnSignOut(() => closeWindow()); - useRestoreFormState(); - useInitalizeAnalytics(); useEffect(() => void analytics.page('view', `${pathname}`), [analytics, pathname]); diff --git a/src/app/features/current-account/current-account-avatar.tsx b/src/app/features/current-account/current-account-avatar.tsx index 4f488802989..39296fac380 100644 --- a/src/app/features/current-account/current-account-avatar.tsx +++ b/src/app/features/current-account/current-account-avatar.tsx @@ -1,25 +1,27 @@ import { memo } from 'react'; -import { BoxProps } from '@stacks/ui'; +import { CircleProps } from 'leather-styles/jsx'; import { useCurrentAccountDisplayName } from '@app/common/hooks/account/use-account-names'; import { useDrawers } from '@app/common/hooks/use-drawers'; -import { AccountAvatar } from '@app/components/account/account-avatar/account-avatar'; -import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { AccountAvatar } from '@app/components/account/account-avatar'; +import { useCurrentAccountIndex } from '@app/store/accounts/account'; +import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.models'; -export const CurrentAccountAvatar = memo((props: BoxProps) => { - const currentAccount = useCurrentStacksAccount(); +export const CurrentAccountAvatar = memo((props: CircleProps) => { + const accountIndex = useCurrentAccountIndex(); + const accounts = useStacksAccounts(); + const currentAccount = accounts[accountIndex] as StacksAccount | undefined; const name = useCurrentAccountDisplayName(); const { setIsShowingSwitchAccountsState } = useDrawers(); if (!currentAccount) return null; return ( setIsShowingSwitchAccountsState(true)} - cursor="pointer" + index={currentAccount.index} name={name} + onClick={() => setIsShowingSwitchAccountsState(true)} publicKey={currentAccount.stxPublicKey} - index={currentAccount.index} - flexShrink={0} {...props} /> ); diff --git a/src/app/features/current-account/current-account-name.tsx b/src/app/features/current-account/current-account-name.tsx index 19dd33e5333..a3c4781b9ef 100644 --- a/src/app/features/current-account/current-account-name.tsx +++ b/src/app/features/current-account/current-account-name.tsx @@ -1,6 +1,5 @@ import { Suspense, memo } from 'react'; -import { memoWithAs } from '@stacks/ui-core'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { Box, BoxProps, styled } from 'leather-styles/jsx'; @@ -35,12 +34,12 @@ const AccountNameSuspense = memo((props: BoxProps) => { ); }); -export const CurrentAccountName = memoWithAs((props: BoxProps) => { +export function CurrentAccountName() { const defaultName = useCurrentAccountDisplayName(); - const fallback = {defaultName}; + const fallback = {defaultName}; return ( - + ); -}); +} diff --git a/src/app/features/current-account/popup-header.tsx b/src/app/features/current-account/popup-header.tsx index f470a2f00cb..10c25516195 100644 --- a/src/app/features/current-account/popup-header.tsx +++ b/src/app/features/current-account/popup-header.tsx @@ -1,7 +1,6 @@ import { Suspense } from 'react'; -import { Box, Stack, color } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { Box, HStack, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; import { BtcBalance } from '@app/components/balance-btc'; @@ -19,7 +18,7 @@ interface PopupHeaderLayoutProps { } function PopupHeaderLayout({ children }: PopupHeaderLayoutProps) { return ( - + {children} ); @@ -45,14 +44,17 @@ function PopupHeaderSuspense({ displayAddresssBalanceOf = 'stx' }: PopupHeaderPr } > - - + + + + + {account && displayAddresssBalanceOf === 'stx' && ( )} {isBitcoinEnabled && displayAddresssBalanceOf === 'all' && } - + diff --git a/src/app/features/edit-nonce-drawer/components/edit-nonce-field.tsx b/src/app/features/edit-nonce-drawer/components/edit-nonce-field.tsx index 6e0618b9895..ee8825535f0 100644 --- a/src/app/features/edit-nonce-drawer/components/edit-nonce-field.tsx +++ b/src/app/features/edit-nonce-drawer/components/edit-nonce-field.tsx @@ -1,10 +1,10 @@ import { FormEvent, memo } from 'react'; -import { Input } from '@stacks/ui'; import { useField } from 'formik'; import { Stack, StackProps } from 'leather-styles/jsx'; import { ErrorLabel } from '@app/components/error-label'; +import { Input } from '@app/ui/components/input'; interface EditNonceFieldProps extends StackProps { onBlur(): void; @@ -16,17 +16,12 @@ export const EditNonceField = memo((props: EditNonceFieldProps) => { return ( ) => { await helpers.setValue(evt.currentTarget.value); }} placeholder="Enter a custom nonce" - type="number" value={field.value} - width="100%" /> {meta.error && {meta.error}} diff --git a/src/app/features/edit-nonce-drawer/components/edit-nonce-form.tsx b/src/app/features/edit-nonce-drawer/components/edit-nonce-form.tsx index 37a5d5b7532..4453550a8a5 100644 --- a/src/app/features/edit-nonce-drawer/components/edit-nonce-form.tsx +++ b/src/app/features/edit-nonce-drawer/components/edit-nonce-form.tsx @@ -1,6 +1,6 @@ import { HStack } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import { EditNonceField } from './edit-nonce-field'; diff --git a/src/app/features/edit-nonce-drawer/edit-nonce-drawer.tsx b/src/app/features/edit-nonce-drawer/edit-nonce-drawer.tsx index c702ec0a371..7f7fa233268 100644 --- a/src/app/features/edit-nonce-drawer/edit-nonce-drawer.tsx +++ b/src/app/features/edit-nonce-drawer/edit-nonce-drawer.tsx @@ -8,8 +8,8 @@ import { StacksSendFormValues, StacksTransactionFormValues } from '@shared/model import { useOnMount } from '@app/common/hooks/use-on-mount'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { LeatherButton } from '@app/components/button/button'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; +import { LeatherButton } from '@app/ui/components/button'; import { EditNonceForm } from './components/edit-nonce-form'; @@ -60,7 +60,7 @@ export function EditNonceDrawer() { return ( - + diff --git a/src/app/features/errors/app-error-boundary.tsx b/src/app/features/errors/app-error-boundary.tsx index 6c2bda0953b..f13964586c5 100644 --- a/src/app/features/errors/app-error-boundary.tsx +++ b/src/app/features/errors/app-error-boundary.tsx @@ -1,13 +1,14 @@ -import { Box, Button, CodeBlock, Stack, color } from '@stacks/ui'; +import { Box, Stack, styled } from 'leather-styles/jsx'; import { Prism } from '@app/common/clarity-prism'; import { HasChildren } from '@app/common/has-children'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { Header } from '@app/components/header'; -import { Title } from '@app/components/typography'; import { ErrorBoundary, FallbackProps, useErrorHandler } from '@app/features/errors/error-boundary'; import { openGithubIssue } from '@app/features/errors/utils'; import { useErrorStackTraceState } from '@app/store/ui/ui.hooks'; +import { CodeBlock } from '@app/ui/components/codeblock'; +import { Title } from '@app/ui/components/typography/title'; function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) { const [value] = useErrorStackTraceState(); @@ -15,34 +16,33 @@ function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) { useRouteHeader(
); return ( - - Something went wrong + + Something went wrong {value && ( )} - - - + ); diff --git a/src/app/features/errors/requesting-tab-closed-error-msg.tsx b/src/app/features/errors/requesting-tab-closed-error-msg.tsx index b59e40b09d8..75dca4c32d3 100644 --- a/src/app/features/errors/requesting-tab-closed-error-msg.tsx +++ b/src/app/features/errors/requesting-tab-closed-error-msg.tsx @@ -14,7 +14,7 @@ export function RequestingTabClosedWarningMessage() { if (!hasTabClosed) return null; return ( - + The window making this request closed, but you can still broadcast the transaction ); diff --git a/src/app/features/high-fee-drawer/components/high-fee-confirmation.tsx b/src/app/features/high-fee-drawer/components/high-fee-confirmation.tsx index 5198dc8571b..64eac1cefa9 100644 --- a/src/app/features/high-fee-drawer/components/high-fee-confirmation.tsx +++ b/src/app/features/high-fee-drawer/components/high-fee-confirmation.tsx @@ -1,5 +1,5 @@ -import { Button, Stack } from '@stacks/ui'; import { useFormikContext } from 'formik'; +import { HStack, Stack } from 'leather-styles/jsx'; import { BitcoinSendFormValues, @@ -9,40 +9,39 @@ import { import { useDrawers } from '@app/common/hooks/use-drawers'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { Link } from '@app/components/link'; -import { Caption, Title } from '@app/components/typography'; +import { LeatherButton } from '@app/ui/components/button'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Title } from '@app/ui/components/typography/title'; -export function HighFeeConfirmation(props: { learnMoreUrl: string }) { - const { learnMoreUrl } = props; +export function HighFeeConfirmation({ learnMoreUrl }: { learnMoreUrl: string }) { const { handleSubmit, values } = useFormikContext< BitcoinSendFormValues | StacksSendFormValues | StacksTransactionFormValues >(); const { setIsShowingHighFeeConfirmation } = useDrawers(); return ( - - + <Stack px="space.05" gap="space.05" pb="space.06"> + <Title> Are you sure you want to pay {values.fee} {values.feeCurrency} in fees for this transaction? This action cannot be undone and the fees won't be returned, even if the transaction fails.{' '} - openInNewTab(learnMoreUrl)}> + openInNewTab(learnMoreUrl)} variant="link"> Learn more - + - - - - + + ); } diff --git a/src/app/features/high-fee-drawer/high-fee-drawer.tsx b/src/app/features/high-fee-drawer/high-fee-drawer.tsx index dc212dfc01e..1ef354d0c28 100644 --- a/src/app/features/high-fee-drawer/high-fee-drawer.tsx +++ b/src/app/features/high-fee-drawer/high-fee-drawer.tsx @@ -1,10 +1,8 @@ import { useEffect } from 'react'; -import { FiAlertTriangle } from 'react-icons/fi'; - -import { Box, color } from '@stacks/ui'; import { useDrawers } from '@app/common/hooks/use-drawers'; import { ControlledDrawer } from '@app/components/drawer/controlled-drawer'; +import { ErrorIcon } from '@app/ui/components/icons/error-icon'; import { HighFeeConfirmation } from './components/high-fee-confirmation'; @@ -20,7 +18,7 @@ export function HighFeeDrawer(props: { learnMoreUrl: string }) { return ( } + icon={} isShowing={isShowingHighFeeConfirmation} onClose={() => setIsShowingHighFeeConfirmation(false)} > diff --git a/src/app/features/hiro-messages/components/in-app-message-item.tsx b/src/app/features/hiro-messages/components/in-app-message-item.tsx index 6d69f58e116..679e7ff7542 100644 --- a/src/app/features/hiro-messages/components/in-app-message-item.tsx +++ b/src/app/features/hiro-messages/components/in-app-message-item.tsx @@ -1,8 +1,7 @@ -import { FiX } from 'react-icons/fi'; - -import { Box, Flex, Text } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; import { HiroMessage } from '@app/query/common/remote-config/remote-config.query'; +import { CloseIcon } from '@app/ui/components/icons/close-icon'; interface HiroMessageItemProps extends HiroMessage { onDismiss(id: string): void; @@ -19,48 +18,46 @@ export function HiroMessageItem(props: HiroMessageItemProps) { alignItems={[null, null, 'center']} justifyContent="center" position="relative" - p="base" + p="space.04" > {dismissible && ( - onDismiss(id)} > - - + + )} {img && ( - + )} {title && ( - + {title} - + )} - {text} - + {learnMoreUrl && ( - {learnMoreText ? learnMoreText : 'Learn more ↗'} - + )} diff --git a/src/app/features/hiro-messages/in-app-messages.tsx b/src/app/features/hiro-messages/in-app-messages.tsx index bd6cab55e0c..cfe01105711 100644 --- a/src/app/features/hiro-messages/in-app-messages.tsx +++ b/src/app/features/hiro-messages/in-app-messages.tsx @@ -1,6 +1,6 @@ -import { Flex, FlexProps } from '@stacks/ui'; +import { Flex, FlexProps } from 'leather-styles/jsx'; -import { useRemoteHiroMessages } from '@app/query/common/remote-config/remote-config.query'; +import { useRemoteLeatherMessages } from '@app/query/common/remote-config/remote-config.query'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; import { useDismissMessage } from '@app/store/settings/settings.actions'; import { useDismissedMessageIds } from '@app/store/settings/settings.selectors'; @@ -8,7 +8,7 @@ import { useDismissedMessageIds } from '@app/store/settings/settings.selectors'; import { HiroMessageItem } from './components/in-app-message-item'; export function InAppMessages(props: FlexProps) { - const messages = useRemoteHiroMessages(); + const messages = useRemoteLeatherMessages(); const { mode } = useCurrentNetworkState(); const dismissMessage = useDismissMessage(); @@ -25,7 +25,7 @@ export function InAppMessages(props: FlexProps) { } return ( - + dismissMessage(messageId)} {...firstMessage} /> ); diff --git a/src/app/features/increase-fee-drawer/components/fee-multiplier-button.tsx b/src/app/features/increase-fee-drawer/components/fee-multiplier-button.tsx index 2d5a14f2e55..30fdf431f79 100644 --- a/src/app/features/increase-fee-drawer/components/fee-multiplier-button.tsx +++ b/src/app/features/increase-fee-drawer/components/fee-multiplier-button.tsx @@ -1,22 +1,24 @@ -import { Button, ButtonProps } from '@stacks/ui'; +import { HTMLStyledProps, styled } from 'leather-styles/jsx'; -interface FeeMultiplierButtonProps extends ButtonProps { +interface FeeMultiplierButtonProps extends HTMLStyledProps<'button'> { multiplier: number; } - -export function FeeMultiplierButton(props: FeeMultiplierButtonProps): React.JSX.Element { +export function FeeMultiplierButton(props: FeeMultiplierButtonProps) { const { multiplier, ...rest } = props; return ( - + ); } diff --git a/src/app/features/increase-fee-drawer/components/fee-multiplier.tsx b/src/app/features/increase-fee-drawer/components/fee-multiplier.tsx index 89bc5f35a5a..26511870f62 100644 --- a/src/app/features/increase-fee-drawer/components/fee-multiplier.tsx +++ b/src/app/features/increase-fee-drawer/components/fee-multiplier.tsx @@ -1,19 +1,19 @@ -import { Stack, StackProps } from '@stacks/ui'; +import { HStack, HstackProps } from 'leather-styles/jsx'; import { FeeMultiplierButton } from './fee-multiplier-button'; const multipliers = [2, 5, 10]; -interface FeeMultiplierProps extends StackProps { +interface FeeMultiplierProps extends HstackProps { onSelectMultiplier(multiplier: number): void; showReset?: boolean; } -export function FeeMultiplier(props: FeeMultiplierProps): React.JSX.Element { +export function FeeMultiplier(props: FeeMultiplierProps) { const { onSelectMultiplier, showReset, ...rest } = props; return ( - + {showReset && ( ))} - + ); } diff --git a/src/app/features/increase-fee-drawer/components/increase-btc-fee-form.tsx b/src/app/features/increase-fee-drawer/components/increase-btc-fee-form.tsx index 87d12ba23d5..c9520a69f7b 100644 --- a/src/app/features/increase-fee-drawer/components/increase-btc-fee-form.tsx +++ b/src/app/features/increase-fee-drawer/components/increase-btc-fee-form.tsx @@ -1,7 +1,7 @@ import { useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; import { Formik } from 'formik'; +import { Stack } from 'leather-styles/jsx'; import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; import { RouteUrls } from '@shared/route-urls'; @@ -14,8 +14,8 @@ import { BitcoinCustomFeeFiat } from '@app/components/bitcoin-custom-fee/bitcoin import { BitcoinTransactionItem } from '@app/components/bitcoin-transaction-item/bitcoin-transaction-item'; import { LoadingSpinner } from '@app/components/loading-spinner'; import { TextInputField } from '@app/components/text-input-field'; -import { Caption } from '@app/components/typography'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; import { useBtcIncreaseFee } from '../hooks/use-btc-increase-fee'; import { IncreaseFeeActions } from './increase-fee-actions'; @@ -25,7 +25,6 @@ const feeInputLabel = 'sats/vB'; interface IncreaseBtcFeeFormProps { btcTx: BitcoinTx; } - export function IncreaseBtcFeeForm({ btcTx }: IncreaseBtcFeeFormProps) { const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); const navigate = useNavigate(); @@ -39,6 +38,7 @@ export function IncreaseBtcFeeForm({ btcTx }: IncreaseBtcFeeFormProps) { if (isBroadcasting) { return ; } + const initialFeeRate = `${(btcTx.fee / sizeInfo.txVBytes).toFixed(0)}`; return ( - + {btcTx && } - - + + Balance: {balance}} - { - navigate(RouteUrls.Home); - }} - /> + navigate(RouteUrls.Home)} /> ); diff --git a/src/app/features/increase-fee-drawer/components/increase-fee-actions.tsx b/src/app/features/increase-fee-drawer/components/increase-fee-actions.tsx index f675db3f3b8..a9808fa90d0 100644 --- a/src/app/features/increase-fee-drawer/components/increase-fee-actions.tsx +++ b/src/app/features/increase-fee-drawer/components/increase-fee-actions.tsx @@ -3,7 +3,7 @@ import { Flex } from 'leather-styles/jsx'; import { LoadingKeys, useLoading } from '@app/common/hooks/use-loading'; import { useWalletType } from '@app/common/use-wallet-type'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface IncreaseFeeActionsProps { isDisabled: boolean; @@ -28,7 +28,7 @@ export function IncreaseFeeActions(props: IncreaseFeeActionsProps) { flex="1" onClick={handleSubmit as any} aria-busy={isLoading} - borderRadius="10px" + borderRadius="sm" aria-disabled={isDisabled} > {actionText} diff --git a/src/app/features/increase-fee-drawer/components/increase-fee-field.tsx b/src/app/features/increase-fee-drawer/components/increase-fee-field.tsx index 7378f27ef58..cca9531c0f9 100644 --- a/src/app/features/increase-fee-drawer/components/increase-fee-field.tsx +++ b/src/app/features/increase-fee-drawer/components/increase-fee-field.tsx @@ -1,7 +1,7 @@ import { useCallback, useMemo, useState } from 'react'; -import { Input, InputGroup, Stack, Text } from '@stacks/ui'; import { useField } from 'formik'; +import { Flex, Stack, styled } from 'leather-styles/jsx'; import { microStxToStx, stxToMicroStx } from '@app/common/money/unit-conversion'; import { ErrorLabel } from '@app/components/error-label'; @@ -23,20 +23,19 @@ export function IncreaseFeeField(props: IncreaseFeeFieldProps): React.JSX.Elemen }, [currentFee, modified, field.value]); const onSelectMultiplier = useCallback( - (multiplier: number) => { + async (multiplier: number) => { if (!currentFee) return; setModified(multiplier !== 1); - helpers.setValue(microStxToStx(currentFee * multiplier)); + await helpers.setValue(microStxToStx(currentFee * multiplier)); }, [currentFee, helpers] ); return ( <> - + - - - + + Fee - - + - + {meta.error && {meta.error}} diff --git a/src/app/features/increase-fee-drawer/components/increase-stx-fee-form.tsx b/src/app/features/increase-fee-drawer/components/increase-stx-fee-form.tsx index 0233ee3fc0e..e7620a13e18 100644 --- a/src/app/features/increase-fee-drawer/components/increase-stx-fee-form.tsx +++ b/src/app/features/increase-fee-drawer/components/increase-stx-fee-form.tsx @@ -2,9 +2,9 @@ import { useCallback, useEffect } from 'react'; import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; import BigNumber from 'bignumber.js'; import { Formik } from 'formik'; +import { Stack } from 'leather-styles/jsx'; import * as yup from 'yup'; import { RouteUrls } from '@shared/route-urls'; @@ -18,12 +18,12 @@ import { safelyFormatHexTxid } from '@app/common/utils/safe-handle-txid'; import { stxFeeValidator } from '@app/common/validation/forms/fee-validators'; import { LoadingSpinner } from '@app/components/loading-spinner'; import { StacksTransactionItem } from '@app/components/stacks-transaction-item/stacks-transaction-item'; -import { Caption } from '@app/components/typography'; import { useLedgerNavigate } from '@app/features/ledger/hooks/use-ledger-navigate'; import { useCurrentStacksAccountAnchoredBalances } from '@app/query/stacks/balance/stx-balance.hooks'; import { useSubmittedTransactionsActions } from '@app/store/submitted-transactions/submitted-transactions.hooks'; import { useReplaceByFeeSoftwareWalletSubmitCallBack } from '@app/store/transactions/fees.hooks'; import { useRawDeserializedTxState, useRawTxIdState } from '@app/store/transactions/raw.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; import { useSelectedTx } from '../hooks/use-selected-tx'; import { IncreaseFeeActions } from './increase-fee-actions'; @@ -58,12 +58,12 @@ export function IncreaseStxFeeForm() { const txId = tx.tx_id || safelyFormatHexTxid(rawTx.txid()); await refreshAccountData(); submittedTransactionsActions.transactionReplacedByFee(txId); - whenWallet({ + await whenWallet({ software: async () => { await replaceByFee(rawTx); }, ledger: () => { - ledgerNavigate.toConnectAndSignTransactionStep(rawTx); + ledgerNavigate.toConnectAndSignStacksTransactionStep(rawTx); }, })(); }, @@ -92,9 +92,9 @@ export function IncreaseStxFeeForm() { validationSchema={validationSchema} > {props => ( - + {tx && } - + {balances?.stx.unlockedStx.amount && ( diff --git a/src/app/features/increase-fee-drawer/hooks/use-btc-increase-fee.ts b/src/app/features/increase-fee-drawer/hooks/use-btc-increase-fee.ts index 35503b74b3b..7f2e0081880 100644 --- a/src/app/features/increase-fee-drawer/hooks/use-btc-increase-fee.ts +++ b/src/app/features/increase-fee-drawer/hooks/use-btc-increase-fee.ts @@ -21,6 +21,7 @@ import { useBitcoinFeesList } from '@app/components/bitcoin-fees-list/use-bitcoi import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; import { useBitcoinScureLibNetworkConfig } from '@app/store/accounts/blockchain/bitcoin/bitcoin-keychain'; +import { useSignBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; export function useBtcIncreaseFee(btcTx: BitcoinTx) { @@ -28,12 +29,10 @@ export function useBtcIncreaseFee(btcTx: BitcoinTx) { const networkMode = useBitcoinScureLibNetworkConfig(); const analytics = useAnalytics(); - const { - address: currentBitcoinAddress, - sign, - publicKey, - } = useCurrentAccountNativeSegwitIndexZeroSigner(); + const { address: currentBitcoinAddress, publicKey } = + useCurrentAccountNativeSegwitIndexZeroSigner(); const { data: utxos = [], refetch } = useCurrentNativeSegwitUtxos(); + const signTransaction = useSignBitcoinTx(); const { broadcastTx, isBroadcasting } = useBitcoinBroadcastTransaction(); const recipient = getRecipientAddressFromOutput(btcTx.vout, currentBitcoinAddress) || ''; const sizeInfo = getSizeInfo({ @@ -51,7 +50,7 @@ export function useBtcIncreaseFee(btcTx: BitcoinTx) { utxos, }); - function generateTx(payload: { feeRate: string; tx: BitcoinTx }) { + function generateUnsignedTx(payload: { feeRate: string; tx: BitcoinTx }) { const newTx = new btc.Transaction(); const { vin, vout, fee: prevFee } = payload.tx; const p2wpkh = btc.p2wpkh(publicKey, networkMode); @@ -89,15 +88,14 @@ export function useBtcIncreaseFee(btcTx: BitcoinTx) { newTx.addOutputAddress(recipient, BigInt(output.value), networkMode); }); - sign(newTx); - newTx.finalize(); - - return { hex: newTx.hex }; + return newTx; } - async function initiateTransaction(tx: string) { + async function initiateTransaction(unsignedTx: btc.Transaction) { + const tx = await signTransaction(unsignedTx.toPSBT()); + tx.finalize(); await broadcastTx({ - tx, + tx: tx.hex, async onSuccess(txid) { navigate(RouteUrls.IncreaseFeeSent); void analytics.track('increase_fee_transaction', { @@ -114,8 +112,8 @@ export function useBtcIncreaseFee(btcTx: BitcoinTx) { async function onSubmit(values: { feeRate: string }) { try { - const { hex } = generateTx({ feeRate: values.feeRate, tx: btcTx }); - await initiateTransaction(hex); + const tx = generateUnsignedTx({ feeRate: values.feeRate, tx: btcTx }); + await initiateTransaction(tx); } catch (e) { onError(e); } @@ -161,7 +159,7 @@ export function useBtcIncreaseFee(btcTx: BitcoinTx) { }); return { - generateTx, + generateTx: generateUnsignedTx, initiateTransaction, isBroadcasting, sizeInfo, diff --git a/src/app/features/increase-fee-drawer/increase-btc-fee-drawer.tsx b/src/app/features/increase-fee-drawer/increase-btc-fee-drawer.tsx index 3a9f0cf429a..16ade832348 100644 --- a/src/app/features/increase-fee-drawer/increase-btc-fee-drawer.tsx +++ b/src/app/features/increase-fee-drawer/increase-btc-fee-drawer.tsx @@ -1,17 +1,16 @@ import { useLocation, useNavigate } from 'react-router-dom'; -import get from 'lodash.get'; - import { BitcoinTx } from '@shared/models/transactions/bitcoin-transaction.model'; import { RouteUrls } from '@shared/route-urls'; +import { useLocationStateWithCache } from '@app/common/hooks/use-location-state'; + import { IncreaseBtcFeeForm } from './components/increase-btc-fee-form'; import { IncreaseFeeDrawer } from './increase-fee-drawer'; function useIncreaseBtcFeeDrawerState() { - const location = useLocation(); return { - tx: get(location.state, 'btcTx') as BitcoinTx, + tx: useLocationStateWithCache('btcTx') as BitcoinTx, }; } @@ -24,13 +23,13 @@ export function IncreaseBtcFeeDrawer() { navigate(RouteUrls.Home); }; + if (!tx) return null; + return ( - tx && ( - } - onClose={onClose} - isShowing={location.pathname === RouteUrls.IncreaseBtcFee} - /> - ) + } + onClose={onClose} + isShowing={location.pathname === RouteUrls.IncreaseBtcFee} + /> ); } diff --git a/src/app/features/increase-fee-drawer/increase-fee-drawer.tsx b/src/app/features/increase-fee-drawer/increase-fee-drawer.tsx index 9d1a9a4dc30..08496aca9c2 100644 --- a/src/app/features/increase-fee-drawer/increase-fee-drawer.tsx +++ b/src/app/features/increase-fee-drawer/increase-fee-drawer.tsx @@ -1,25 +1,25 @@ import { Suspense } from 'react'; import { Outlet } from 'react-router-dom'; -import { Flex, Spinner, Stack } from '@stacks/ui'; +import { Flex, Stack } from 'leather-styles/jsx'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; -import { Caption } from '@app/components/typography'; +import { Spinner } from '@app/ui/components/spinner'; +import { Caption } from '@app/ui/components/typography/caption'; interface IncreaseFeeDrawerProps { feeForm: React.JSX.Element; onClose: () => void; isShowing: boolean; } - export function IncreaseFeeDrawer({ feeForm, onClose, isShowing }: IncreaseFeeDrawerProps) { return ( <> - + + } diff --git a/src/app/features/increase-fee-drawer/increase-fee-sent-drawer.tsx b/src/app/features/increase-fee-drawer/increase-fee-sent-drawer.tsx index aa82df47754..8dda7dcb213 100644 --- a/src/app/features/increase-fee-drawer/increase-fee-sent-drawer.tsx +++ b/src/app/features/increase-fee-drawer/increase-fee-sent-drawer.tsx @@ -1,11 +1,11 @@ -import { FiCheck } from 'react-icons/fi'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; -import { Box, Flex } from '@stacks/ui'; +import { Flex } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; export function IncreaseFeeSentDrawer() { const location = useLocation(); @@ -15,8 +15,8 @@ export function IncreaseFeeSentDrawer() { return ( <> navigate(RouteUrls.Home)} title="Confirmed"> - - + + diff --git a/src/app/features/leather-intro-dialog/leather-intro-steps.tsx b/src/app/features/leather-intro-dialog/leather-intro-steps.tsx index 7657796474d..73651ffc890 100644 --- a/src/app/features/leather-intro-dialog/leather-intro-steps.tsx +++ b/src/app/features/leather-intro-dialog/leather-intro-steps.tsx @@ -8,7 +8,7 @@ import { Box, Flex, Stack, styled } from 'leather-styles/jsx'; import { HasChildren } from '@app/common/has-children'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import { confettiConfig } from './confetti-config'; import { useLeatherIntroDialogContext } from './leather-intro-dialog'; diff --git a/src/app/features/ledger/animations/plugged-in-cable-bright.lottie.json b/src/app/features/ledger/animations/plugged-in-cable-bright.lottie.json index 92d4a05c47f..c575ac91f1f 100644 --- a/src/app/features/ledger/animations/plugged-in-cable-bright.lottie.json +++ b/src/app/features/ledger/animations/plugged-in-cable-bright.lottie.json @@ -1 +1 @@ -{"v":"5.12.1","fr":30,"ip":0,"op":195,"w":878,"h":480,"nm":"plugging-in-cable-bright.lottie","ddd":0,"assets":[{"id":"comp_0","nm":"LedgerGesture_HoldCTA_Bright","fr":30,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"LedgerGesture_PreholdDot","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[375.603,215.175,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.01,0.01,0.333],"y":[0.534,0.534,0]},"t":0,"s":[30,30,100]},{"t":30,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.254],[4.254,0],[0,-4.254],[-4.254,0]],"o":[[0,-4.254],[-4.254,0],[0,4.254],[4.254,0]],"v":[[383.306,215.175],[375.603,207.472],[367.9,215.175],[375.603,222.878]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 5","sr":1,"ks":{"o":{"a":0,"k":4,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"LedgerGesture_PreHold_Glow5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[4]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 4","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"LedgerGesture_PreHold_Glow4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[10]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 3","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LedgerGesture_PreHold_Glow3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[20]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 2","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"LedgerGesture_PreHold_Glow2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[40]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"LedgerGesture_PreHold_Glow1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[70]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"LedgerGesture_PreHold 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":45,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"LedgerGesture_PreHold","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0}]},{"id":"comp_1","nm":"LedgerUI_StacksDot","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"LedgerUI_StacksDot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"LedgerUI_StacksDot_Glow","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LedgerUI_StacksDot_Glow 2","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"LedgerUI_StacksDot_Glow 3","sr":1,"ks":{"o":{"a":0,"k":13,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"LedgerUI_StacksDot_Glow 4","sr":1,"ks":{"o":{"a":0,"k":5,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"LedgerUI_StacksDot_Glow 5","sr":1,"ks":{"o":{"a":0,"k":2,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Ledger_LogoIn","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"LedgerLogo 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":0,"s":[124.25]},{"t":10,"s":[203.05]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1381.3,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1373.215,-375.985],[1373.215,-373.629],[1387.028,-373.629],[1387.028,-365.36],[1389.384,-365.36],[1389.384,-375.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1373.215,-340.921],[1373.215,-338.566],[1389.384,-338.566],[1389.384,-349.19],[1387.028,-349.19],[1387.028,-340.921]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":-70,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[50]},{"t":9,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":4,"s":[144.113]},{"t":14,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1296.09,-365.36],[1293.734,-365.36],[1293.734,-349.191],[1304.36,-349.191],[1304.36,-351.316],[1296.09,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":61,"st":-66,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"E","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[50]},{"t":7,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":4,"s":[143.113]},{"t":14,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1309.718,-356.259],[1316.833,-356.259],[1316.833,-358.384],[1309.718,-358.384],[1309.718,-363.235],[1317.525,-363.235],[1317.525,-365.36],[1307.362,-365.36],[1307.362,-349.191],[1317.872,-349.191],[1317.872,-351.316],[1309.718,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":59,"st":-68,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[50]},{"t":6,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":3,"s":[135.213]},{"t":13,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.735],[4.343,0],[0,0],[0,0]],"o":[[4.412,0],[0,-4.804],[0,0],[0,0],[0,0]],"v":[[1325.91,-349.19],[1331.962,-357.275],[1325.864,-365.359],[1320.874,-365.359],[1320.874,-349.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-3.234],[0,0],[2.379,0],[0,0]],"o":[[0,0],[2.379,0],[0,0],[0,3.234],[0,0],[0,0]],"v":[[1323.185,-363.235],[1325.703,-363.235],[1329.375,-359.4],[1329.375,-355.15],[1325.703,-351.316],[1323.185,-351.316]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":58,"st":-69,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"G","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[50]},{"t":6,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":3,"s":[136.713]},{"t":13,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.148,0],[0,0],[0,3.211],[0,0],[-2.148,0],[0,0],[-0.023,-2.171],[0,0],[3.188,0],[0.97,-0.924],[0,-3.234],[-1.432,-1.432],[-1.317,0],[-0.646,1.201],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,2.333],[0,0],[-2.148,0],[0,0],[0,-3.234],[0,0],[2.102,0],[0,0],[-0.231,-3.188],[-1.547,0],[-1.455,1.363],[0,3.118],[0.97,0.947],[1.386,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1343.557,-355.404],[1343.557,-354.296],[1340.554,-351.2],[1340.046,-351.2],[1336.858,-355.104],[1336.858,-359.447],[1340.092,-363.351],[1340.554,-363.351],[1343.348,-360.394],[1345.889,-360.394],[1340.346,-365.591],[1336.535,-364.182],[1334.271,-357.275],[1336.396,-350.415],[1340.023,-348.96],[1343.325,-350.715],[1343.649,-350.715],[1343.649,-349.191],[1345.774,-349.191],[1345.774,-357.529],[1339.514,-357.529],[1339.514,-355.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":58,"st":-69,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"E","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":2,"s":[134.213]},{"t":12,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1351.295,-356.259],[1358.41,-356.259],[1358.41,-358.384],[1351.295,-358.384],[1351.295,-363.235],[1359.103,-363.235],[1359.103,-365.36],[1348.939,-365.36],[1348.939,-349.191],[1359.449,-349.191],[1359.449,-351.316],[1351.295,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":57,"st":-70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"R","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[50]},{"t":4,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":1,"s":[134.213]},{"t":11,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.871],[0.878,0.855],[1.917,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-1.848],[0,0],[0,0],[0,0],[1.848,0.277]],"o":[[1.686,-0.439],[0,-1.178],[-1.109,-1.063],[0,0],[0,0],[0,0],[0,0],[0,0],[1.778,0],[0,0],[0,0],[0,0],[0,-2.541],[0,0]],"v":[[1370.744,-356.79],[1373.608,-360.67],[1372.268,-363.766],[1367.764,-365.36],[1362.567,-365.36],[1362.567,-349.191],[1364.877,-349.191],[1364.877,-355.635],[1368.342,-355.635],[1370.836,-353.048],[1370.836,-349.19],[1373.192,-349.19],[1373.192,-352.678],[1370.744,-356.466]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-1.64],[0,0],[1.825,0]],"o":[[0,0],[0,0],[1.802,0],[0,0],[0,1.686],[0,0]],"v":[[1364.877,-357.76],[1364.877,-363.234],[1368.573,-363.234],[1371.021,-360.994],[1371.021,-360.024],[1368.573,-357.76]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":56,"st":-71,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LedgerLogo","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[155.213,75.475,0],"ix":2,"l":2},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1277.542,-375.985],[1277.542,-365.36],[1279.898,-365.36],[1279.898,-373.629],[1293.711,-373.629],[1293.711,-375.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1277.542,-349.19],[1277.542,-338.565],[1293.711,-338.565],[1293.711,-340.921],[1279.898,-340.921],[1279.898,-349.19]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":-70,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Winks_Top","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[169.011,268.683,0],"ix":2,"l":2},"a":{"a":0,"k":[1109.011,-433.317,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1116.697,-301.471],[1111.323,-291.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1100.197,-311.221],[1074.323,-284.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1109.197,-409.221],[1093.323,-429.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1109.197,-409.221],[1093.323,-429.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":75,"s":[0]},{"t":95,"s":[100]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short_Gray","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1124.699,-417.136],[1109.197,-457.412]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Long","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1124.699,-417.136],[1109.197,-457.412]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":2.662,"ix":1},"e":{"a":0,"k":98.059,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":75,"s":[0]},{"t":95,"s":[100]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"LongGray","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":90,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"LedgerGesture_HoldCTA","parent":16,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[666.043,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":100,"op":121,"st":100,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"LedgerGesture_HoldCTA","parent":16,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[404.043,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":100,"op":121,"st":100,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ledger_Btn2","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[665.447,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[665.447,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-10.507,-13.837],[13.837,-10.507],[10.507,13.837],[-13.837,10.507]],"o":[[10.507,13.837],[-13.837,10.507],[-10.507,-13.837],[13.837,-10.507]],"v":[[690.502,-375.274],[684.471,-331.195],[640.392,-337.226],[646.424,-381.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ledger_Cover","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.937],"y":[0.245]},"o":{"x":[0.737],"y":[0]},"t":9,"s":[37.3]},{"i":{"x":[0.303],"y":[0.761]},"o":{"x":[0.623],"y":[0.209]},"t":29.322,"s":[77.596]},{"i":{"x":[0.267],"y":[1]},"o":{"x":[0.064],"y":[0.968]},"t":30.774,"s":[179.998]},{"i":{"x":[0.267],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[217.3]},{"i":{"x":[0.936],"y":[0.032]},"o":{"x":[0.733],"y":[0]},"t":131,"s":[217.3]},{"i":{"x":[0.377],"y":[0.901]},"o":{"x":[0.697],"y":[0.239]},"t":141.322,"s":[179.998]},{"i":{"x":[0.263],"y":[1]},"o":{"x":[0.063],"y":[0.755]},"t":141.968,"s":[77.596]},{"t":161,"s":[37.3]}],"ix":10},"p":{"a":0,"k":[665.447,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[665.447,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[25.531,-19.386],[0,0],[5.021,6.613],[0,0],[-6.613,5.021],[0,0],[-19.386,-25.531],[0,0]],"o":[[0,0],[-6.613,5.021],[0,0],[-5.021,-6.613],[0,0],[25.531,-19.386],[0,0],[19.386,25.531]],"v":[[699.889,-309.518],[452.975,-122.04],[431.908,-124.923],[379.891,-193.431],[382.774,-214.498],[629.688,-401.976],[711.017,-390.848],[711.017,-390.848]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"LedgerUI_StacksDot","parent":14,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[298,101,0],"ix":2,"l":2},"a":{"a":0,"k":[25,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":50,"h":50,"ip":100,"op":270,"st":100,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"LedgerUI_StacksLogo 2","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[50]},{"t":156,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.051,-1.075,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.43,-0.639],[0,0],[0,0],[0,0],[-0.408,0],[0,0],[-0.228,-0.339],[0,0],[0,0],[0,0],[-0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.771,0],[0,0],[0,0],[0,0],[0.228,-0.339],[0,0],[0.408,0],[0,0],[0,0],[0,0],[-0.43,-0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[492.425,220.258],[498.913,220.258],[499.711,221.757],[493.342,231.228],[496.213,231.228],[503.227,220.799],[504.244,220.258],[505.357,220.258],[506.374,220.799],[513.387,231.228],[516.259,231.228],[509.889,221.757],[510.688,220.258],[511.929,220.258],[520.357,220.258],[520.357,217.876],[511.929,217.876],[505.193,217.876],[504.408,217.876],[492.425,217.876],[489.245,217.876],[489.245,220.258]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.43,0.639],[0,0],[0,0],[0,0],[0.408,0],[0,0],[0.228,0.339],[0,0],[0,0],[0,0],[0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.771,0],[0,0],[0,0],[0,0],[-0.228,0.339],[0,0],[-0.408,0],[0,0],[0,0],[0,0],[0.43,0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[517.176,210.092],[510.689,210.092],[509.89,208.593],[516.259,199.122],[513.388,199.122],[506.375,209.55],[505.357,210.092],[504.245,210.092],[503.227,209.55],[496.214,199.122],[493.343,199.122],[499.712,208.593],[498.913,210.092],[497.673,210.092],[489.245,210.092],[489.245,212.474],[497.673,212.474],[504.408,212.474],[505.194,212.474],[517.176,212.474],[520.357,212.474],[520.357,210.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":156,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"LedgerUI_StacksLogo","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[50]},{"t":156,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.051,-1.075,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.43,-0.639],[0,0],[0,0],[0,0],[-0.408,0],[0,0],[-0.228,-0.339],[0,0],[0,0],[0,0],[-0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.771,0],[0,0],[0,0],[0,0],[0.228,-0.339],[0,0],[0.408,0],[0,0],[0,0],[0,0],[-0.43,-0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[492.425,220.258],[498.913,220.258],[499.711,221.757],[493.342,231.228],[496.213,231.228],[503.227,220.799],[504.244,220.258],[505.357,220.258],[506.374,220.799],[513.387,231.228],[516.259,231.228],[509.889,221.757],[510.688,220.258],[511.929,220.258],[520.357,220.258],[520.357,217.876],[511.929,217.876],[505.193,217.876],[504.408,217.876],[492.425,217.876],[489.245,217.876],[489.245,220.258]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.43,0.639],[0,0],[0,0],[0,0],[0.408,0],[0,0],[0.228,0.339],[0,0],[0,0],[0,0],[0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.771,0],[0,0],[0,0],[0,0],[-0.228,0.339],[0,0],[-0.408,0],[0,0],[0,0],[0,0],[0.43,0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[517.176,210.092],[510.689,210.092],[509.89,208.593],[516.259,199.122],[513.388,199.122],[506.375,209.55],[505.357,210.092],[504.245,210.092],[503.227,209.55],[496.214,199.122],[493.343,199.122],[499.712,208.593],[498.913,210.092],[497.673,210.092],[489.245,210.092],[489.245,212.474],[497.673,212.474],[504.408,212.474],[505.194,212.474],[517.176,212.474],[520.357,212.474],[520.357,210.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":100,"op":155,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"LedgerUI_Arrow","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[236.072,74.925,0],"ix":2,"l":2},"a":{"a":0,"k":[462.822,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[465.254,223.653],[467.672,223.653],[467.672,221.235],[465.254,221.235]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[462.86,221.26],[465.279,221.26],[465.279,218.841],[462.86,218.841]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[460.416,218.816],[462.835,218.816],[462.835,216.397],[460.416,216.397]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[457.972,216.371],[460.39,216.371],[460.39,213.953],[457.972,213.953]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[460.39,213.953],[462.809,213.953],[462.809,211.534],[460.39,211.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[465.228,209.115],[467.647,209.115],[467.647,206.696],[465.228,206.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[462.809,211.534],[465.228,211.534],[465.228,209.115],[462.809,209.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Ledger_ScreenMATTE","parent":16,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":531.543,"ix":3},"y":{"a":0,"k":-356.247,"ix":4}},"a":{"a":0,"k":[531.543,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,6.222],[0,0],[-6.222,0],[0,0]],"o":[[0,0],[-6.222,0],[0,0],[0,-6.222],[0,0],[0,0]],"v":[[636.163,-309.973],[473.301,-309.973],[462.034,-321.24],[462.034,-391.26],[473.301,-402.527],[636.163,-402.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.086274512112,0.098039217293,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"Ledger_LogoIn","parent":15,"tt":1,"tp":13,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":532.043,"ix":3},"y":{"a":0,"k":-356.247,"ix":4}},"a":{"a":0,"k":[150,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":300,"h":150,"ip":74,"op":163,"st":74,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Ledger_Btn1","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[404.346,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[404.346,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.374],[17.374,0],[0,17.374],[-17.374,0]],"o":[[0,17.374],[-17.374,0],[0,-17.374],[17.374,0]],"v":[[435.804,-356.25],[404.346,-324.791],[372.887,-356.25],[404.346,-387.709]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Ledger_Body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.18],"y":[0.807]},"o":{"x":[0.738],"y":[0]},"t":20,"s":[310]},{"i":{"x":[0.582],"y":[0.817]},"o":{"x":[0.434],"y":[0.517]},"t":40,"s":[381]},{"i":{"x":[0.787],"y":[1.784]},"o":{"x":[0.47],"y":[1.258]},"t":50,"s":[388]},{"i":{"x":[0.969],"y":[0.363]},"o":{"x":[0.791],"y":[0.078]},"t":64,"s":[389.599]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.003],"y":[0.652]},"t":70,"s":[364]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[359.5]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.531],"y":[0]},"t":145,"s":[359.5]},{"t":165,"s":[310]}],"ix":3},"y":{"a":0,"k":360,"ix":4}},"a":{"a":0,"k":[531.543,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,6.222],[0,0],[-6.222,0],[0,0]],"o":[[0,0],[-6.222,0],[0,0],[0,-6.222],[0,0],[0,0]],"v":[[636.163,-309.973],[473.301,-309.973],[462.034,-321.24],[462.034,-391.26],[473.301,-402.527],[636.163,-402.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.086274512112,0.098039217293,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.304,0],[0,0],[0,8.304],[0,0],[-8.304,0],[0,0],[0,-8.304],[0,0]],"o":[[0,0],[-8.304,0],[0,0],[0,-8.304],[0,0],[8.304,0],[0,0],[0,8.304]],"v":[[708.06,-298.703],[355.027,-298.703],[339.991,-313.738],[339.991,-398.756],[355.027,-413.792],[708.06,-413.792],[723.095,-398.756],[723.095,-313.738]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[564.348,-283],"ix":5},"e":{"a":0,"k":[410.548,-633.876],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"USBCableMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[147.531,360.865,0],"ix":2,"l":2},"a":{"a":0,"k":[-162.469,-2.135,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[296.062,154.27],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":155,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.231372997165,0.850979983807,0.823529005051,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-162.469,-2.135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"USBCable","tt":1,"tp":17,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.153],"y":[0.914]},"o":{"x":[0.738],"y":[0]},"t":20,"s":[-136.456]},{"i":{"x":[0.624],"y":[0.818]},"o":{"x":[0.384],"y":[0.389]},"t":40,"s":[63.544]},{"i":{"x":[0.97],"y":[0.475]},"o":{"x":[0.879],"y":[0.459]},"t":50,"s":[73.544]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[92.044]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[93.544]},{"i":{"x":[0.27],"y":[0.867]},"o":{"x":[0.531],"y":[0]},"t":142,"s":[93.544]},{"t":162,"s":[-128.456]}],"ix":3},"y":{"a":0,"k":361.753,"ix":4}},"a":{"a":0,"k":[219.544,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.741,-374.299],[229.741,-364.047],[232.014,-364.047],[232.014,-372.026],[245.341,-372.026],[245.341,-374.299]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.741,-348.447],[229.741,-338.195],[245.341,-338.195],[245.341,-340.469],[232.014,-340.469],[232.014,-348.447]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[247.637,-364.047],[245.364,-364.047],[245.364,-348.447],[255.615,-348.447],[255.615,-350.498],[247.637,-350.498]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[255.623,-374.299],[255.623,-372.026],[268.95,-372.026],[268.95,-364.047],[271.223,-364.047],[271.223,-374.299]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[255.623,-340.469],[255.623,-338.196],[271.223,-338.196],[271.223,-348.447],[268.95,-348.447],[268.95,-340.469]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,12.612],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[200.753,-331.4],[212.924,-363.416],[212.924,-331.345]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[317.883,-334.326],[288.04,-334.326],[288.04,-378.169],[317.883,-378.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[323.348,-379],"ix":5},"e":{"a":0,"k":[253.818,-299.083],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 4","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[2.035,-0.031],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.472,0],[0,0],[0,6.472],[0,0],[-6.472,0],[0,0],[0,-6.472],[0,0]],"o":[[0,0],[-6.472,0],[0,0],[0,-6.472],[0,0],[6.472,0],[0,0],[0,6.472]],"v":[[276.321,-318.689],[224.643,-318.689],[212.924,-330.408],[212.924,-382.086],[224.643,-393.805],[276.321,-393.805],[288.04,-382.086],[288.04,-330.408]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[208.348,-372],"ix":5},"e":{"a":0,"k":[292.62,-341.327],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-13.723],[-5.614,0],[0,0],[0,0]],"o":[[-5.614,0],[0,13.723],[0,0],[0,0],[0,0]],"v":[[195.466,-381.094],[185.301,-356.247],[195.466,-331.4],[245.16,-331.4],[245.16,-381.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[186.348,-369],"ix":5},"e":{"a":0,"k":[250.228,-345.749],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.523,0.592],[0,0.724],[0,0],[-1.576,0],[0,0]],"o":[[0,0],[-0.852,0],[-0.444,-0.503],[0,0],[0,-1.576],[0,0],[0,0]],"v":[[195.203,-349.786],[33.308,-349.822],[31.168,-350.788],[30.454,-352.675],[30.454,-359.49],[33.308,-362.343],[195.203,-362.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":30,"ip":0,"op":195,"w":878,"h":480,"nm":"plugging-in-cable-bright.lottie","ddd":0,"assets":[{"id":"comp_0","nm":"LedgerGesture_HoldCTA_Bright","fr":30,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"LedgerGesture_PreholdDot","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[375.603,215.175,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.01,0.01,0.333],"y":[0.534,0.534,0]},"t":0,"s":[30,30,100]},{"t":30,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.254],[4.254,0],[0,-4.254],[-4.254,0]],"o":[[0,-4.254],[-4.254,0],[0,4.254],[4.254,0]],"v":[[383.306,215.175],[375.603,207.472],[367.9,215.175],[375.603,222.878]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 5","sr":1,"ks":{"o":{"a":0,"k":4,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"LedgerGesture_PreHold_Glow5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[4]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 4","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"LedgerGesture_PreHold_Glow4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[10]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 3","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LedgerGesture_PreHold_Glow3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[20]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis 2","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"LedgerGesture_PreHold_Glow2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[40]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"LedgerGesture_PreHold_Glow1Bis","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"LedgerGesture_PreHold_Glow1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[70]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"LedgerGesture_PreHold 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":45,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":25,"s":[30,30]},{"t":45,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":25,"op":30,"st":-75,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"LedgerGesture_PreHold","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":15,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.75,74.75,0],"ix":2,"l":2},"a":{"a":0,"k":[637.724,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.462,-9.629],[9.629,-14.462],[14.462,9.629],[-9.629,14.462]],"o":[[14.462,9.629],[-9.629,14.462],[-14.462,-9.629],[9.629,-14.462]],"v":[[655.16,188.99],[663.909,232.611],[620.289,241.36],[611.539,197.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[638.992,215.406],"ix":2},"a":{"a":0,"k":[637.742,215.156],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.015,0.015],"y":[0.726,0.726]},"t":-5,"s":[30,30]},{"t":15,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":30,"st":-105,"ct":1,"bm":0}]},{"id":"comp_1","nm":"LedgerUI_StacksDot","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"LedgerUI_StacksDot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"LedgerUI_StacksDot_Glow","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LedgerUI_StacksDot_Glow 2","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"LedgerUI_StacksDot_Glow 3","sr":1,"ks":{"o":{"a":0,"k":13,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"LedgerUI_StacksDot_Glow 4","sr":1,"ks":{"o":{"a":0,"k":5,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"LedgerUI_StacksDot_Glow 5","sr":1,"ks":{"o":{"a":0,"k":2,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25,25,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,242.634,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.34,0.34,0.667],"y":[1,1,1]},"o":{"x":[0.667,0.667,0.333],"y":[0,0,0]},"t":60,"s":[20,20,100]},{"t":90,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.609,0],[0,3.609],[-3.609,0],[0,-3.609]],"o":[[-3.609,0],[0,-3.609],[3.609,0],[0,3.609]],"v":[[504.801,249.168],[498.267,242.634],[504.801,236.1],[511.335,242.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.580392181873,0.51372551918,0.96862745285,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.501960813999,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170,"st":-100,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Ledger_LogoIn","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"LedgerLogo 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":0,"s":[124.25]},{"t":10,"s":[203.05]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1381.3,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1373.215,-375.985],[1373.215,-373.629],[1387.028,-373.629],[1387.028,-365.36],[1389.384,-365.36],[1389.384,-375.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1373.215,-340.921],[1373.215,-338.566],[1389.384,-338.566],[1389.384,-349.19],[1387.028,-349.19],[1387.028,-340.921]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":-70,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[50]},{"t":9,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":4,"s":[144.113]},{"t":14,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1296.09,-365.36],[1293.734,-365.36],[1293.734,-349.191],[1304.36,-349.191],[1304.36,-351.316],[1296.09,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":61,"st":-66,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"E","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[50]},{"t":7,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":4,"s":[143.113]},{"t":14,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1309.718,-356.259],[1316.833,-356.259],[1316.833,-358.384],[1309.718,-358.384],[1309.718,-363.235],[1317.525,-363.235],[1317.525,-365.36],[1307.362,-365.36],[1307.362,-349.191],[1317.872,-349.191],[1317.872,-351.316],[1309.718,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":59,"st":-68,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[50]},{"t":6,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":3,"s":[135.213]},{"t":13,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.735],[4.343,0],[0,0],[0,0]],"o":[[4.412,0],[0,-4.804],[0,0],[0,0],[0,0]],"v":[[1325.91,-349.19],[1331.962,-357.275],[1325.864,-365.359],[1320.874,-365.359],[1320.874,-349.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-3.234],[0,0],[2.379,0],[0,0]],"o":[[0,0],[2.379,0],[0,0],[0,3.234],[0,0],[0,0]],"v":[[1323.185,-363.235],[1325.703,-363.235],[1329.375,-359.4],[1329.375,-355.15],[1325.703,-351.316],[1323.185,-351.316]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":58,"st":-69,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"G","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[50]},{"t":6,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":3,"s":[136.713]},{"t":13,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.148,0],[0,0],[0,3.211],[0,0],[-2.148,0],[0,0],[-0.023,-2.171],[0,0],[3.188,0],[0.97,-0.924],[0,-3.234],[-1.432,-1.432],[-1.317,0],[-0.646,1.201],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,2.333],[0,0],[-2.148,0],[0,0],[0,-3.234],[0,0],[2.102,0],[0,0],[-0.231,-3.188],[-1.547,0],[-1.455,1.363],[0,3.118],[0.97,0.947],[1.386,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1343.557,-355.404],[1343.557,-354.296],[1340.554,-351.2],[1340.046,-351.2],[1336.858,-355.104],[1336.858,-359.447],[1340.092,-363.351],[1340.554,-363.351],[1343.348,-360.394],[1345.889,-360.394],[1340.346,-365.591],[1336.535,-364.182],[1334.271,-357.275],[1336.396,-350.415],[1340.023,-348.96],[1343.325,-350.715],[1343.649,-350.715],[1343.649,-349.191],[1345.774,-349.191],[1345.774,-357.529],[1339.514,-357.529],[1339.514,-355.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":58,"st":-69,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"E","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":2,"s":[134.213]},{"t":12,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1351.295,-356.259],[1358.41,-356.259],[1358.41,-358.384],[1351.295,-358.384],[1351.295,-363.235],[1359.103,-363.235],[1359.103,-365.36],[1348.939,-365.36],[1348.939,-349.191],[1359.449,-349.191],[1359.449,-351.316],[1351.295,-351.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":57,"st":-70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"R","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[50]},{"t":4,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.159],"y":[1]},"o":{"x":[0.058],"y":[0.842]},"t":1,"s":[134.213]},{"t":11,"s":[155.213]}],"ix":3},"y":{"a":0,"k":75.475,"ix":4}},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.871],[0.878,0.855],[1.917,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-1.848],[0,0],[0,0],[0,0],[1.848,0.277]],"o":[[1.686,-0.439],[0,-1.178],[-1.109,-1.063],[0,0],[0,0],[0,0],[0,0],[0,0],[1.778,0],[0,0],[0,0],[0,0],[0,-2.541],[0,0]],"v":[[1370.744,-356.79],[1373.608,-360.67],[1372.268,-363.766],[1367.764,-365.36],[1362.567,-365.36],[1362.567,-349.191],[1364.877,-349.191],[1364.877,-355.635],[1368.342,-355.635],[1370.836,-353.048],[1370.836,-349.19],[1373.192,-349.19],[1373.192,-352.678],[1370.744,-356.466]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-1.64],[0,0],[1.825,0]],"o":[[0,0],[0,0],[1.802,0],[0,0],[0,1.686],[0,0]],"v":[[1364.877,-357.76],[1364.877,-363.234],[1368.573,-363.234],[1371.021,-360.994],[1371.021,-360.024],[1368.573,-357.76]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":56,"st":-71,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LedgerLogo","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[50]},{"t":5,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[155.213,75.475,0],"ix":2,"l":2},"a":{"a":0,"k":[1333.463,-357.275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1277.542,-375.985],[1277.542,-365.36],[1279.898,-365.36],[1279.898,-373.629],[1293.711,-373.629],[1293.711,-375.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1277.542,-349.19],[1277.542,-338.565],[1293.711,-338.565],[1293.711,-340.921],[1279.898,-340.921],[1279.898,-349.19]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":-70,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Winks_Top","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[169.011,268.683,0],"ix":2,"l":2},"a":{"a":0,"k":[1109.011,-433.317,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1116.697,-301.471],[1111.323,-291.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1100.197,-311.221],[1074.323,-284.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1109.197,-409.221],[1093.323,-429.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1109.197,-409.221],[1093.323,-429.189]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":75,"s":[0]},{"t":95,"s":[100]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Short_Gray","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1124.699,-417.136],[1109.197,-457.412]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":72,"s":[0]},{"t":82,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.374],"y":[1]},"o":{"x":[0.06],"y":[0.781]},"t":70,"s":[55]},{"t":75,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Long","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1124.699,-417.136],[1109.197,-457.412]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":2.662,"ix":1},"e":{"a":0,"k":98.059,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.416],"y":[0]},"t":75,"s":[0]},{"t":95,"s":[100]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"LongGray","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":90,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"LedgerGesture_HoldCTA","parent":16,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[666.043,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":100,"op":121,"st":100,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"LedgerGesture_HoldCTA","parent":16,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[404.043,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":100,"op":121,"st":100,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ledger_Btn2","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[665.447,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[665.447,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-10.507,-13.837],[13.837,-10.507],[10.507,13.837],[-13.837,10.507]],"o":[[10.507,13.837],[-13.837,10.507],[-10.507,-13.837],[13.837,-10.507]],"v":[[690.502,-375.274],[684.471,-331.195],[640.392,-337.226],[646.424,-381.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ledger_Cover","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.937],"y":[0.245]},"o":{"x":[0.737],"y":[0]},"t":9,"s":[37.3]},{"i":{"x":[0.303],"y":[0.761]},"o":{"x":[0.623],"y":[0.209]},"t":29.322,"s":[77.596]},{"i":{"x":[0.267],"y":[1]},"o":{"x":[0.064],"y":[0.968]},"t":30.774,"s":[179.998]},{"i":{"x":[0.267],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[217.3]},{"i":{"x":[0.936],"y":[0.032]},"o":{"x":[0.733],"y":[0]},"t":131,"s":[217.3]},{"i":{"x":[0.377],"y":[0.901]},"o":{"x":[0.697],"y":[0.239]},"t":141.322,"s":[179.998]},{"i":{"x":[0.263],"y":[1]},"o":{"x":[0.063],"y":[0.755]},"t":141.968,"s":[77.596]},{"t":161,"s":[37.3]}],"ix":10},"p":{"a":0,"k":[665.447,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[665.447,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[25.531,-19.386],[0,0],[5.021,6.613],[0,0],[-6.613,5.021],[0,0],[-19.386,-25.531],[0,0]],"o":[[0,0],[-6.613,5.021],[0,0],[-5.021,-6.613],[0,0],[25.531,-19.386],[0,0],[19.386,25.531]],"v":[[699.889,-309.518],[452.975,-122.04],[431.908,-124.923],[379.891,-193.431],[382.774,-214.498],[629.688,-401.976],[711.017,-390.848],[711.017,-390.848]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"LedgerUI_StacksDot","parent":14,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[298,101,0],"ix":2,"l":2},"a":{"a":0,"k":[25,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":50,"h":50,"ip":100,"op":270,"st":100,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"LedgerUI_StacksLogo 2","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[50]},{"t":156,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.051,-1.075,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.43,-0.639],[0,0],[0,0],[0,0],[-0.408,0],[0,0],[-0.228,-0.339],[0,0],[0,0],[0,0],[-0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.771,0],[0,0],[0,0],[0,0],[0.228,-0.339],[0,0],[0.408,0],[0,0],[0,0],[0,0],[-0.43,-0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[492.425,220.258],[498.913,220.258],[499.711,221.757],[493.342,231.228],[496.213,231.228],[503.227,220.799],[504.244,220.258],[505.357,220.258],[506.374,220.799],[513.387,231.228],[516.259,231.228],[509.889,221.757],[510.688,220.258],[511.929,220.258],[520.357,220.258],[520.357,217.876],[511.929,217.876],[505.193,217.876],[504.408,217.876],[492.425,217.876],[489.245,217.876],[489.245,220.258]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.43,0.639],[0,0],[0,0],[0,0],[0.408,0],[0,0],[0.228,0.339],[0,0],[0,0],[0,0],[0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.771,0],[0,0],[0,0],[0,0],[-0.228,0.339],[0,0],[-0.408,0],[0,0],[0,0],[0,0],[0.43,0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[517.176,210.092],[510.689,210.092],[509.89,208.593],[516.259,199.122],[513.388,199.122],[506.375,209.55],[505.357,210.092],[504.245,210.092],[503.227,209.55],[496.214,199.122],[493.343,199.122],[499.712,208.593],[498.913,210.092],[497.673,210.092],[489.245,210.092],[489.245,212.474],[497.673,212.474],[504.408,212.474],[505.194,212.474],[517.176,212.474],[520.357,212.474],[520.357,210.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":156,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"LedgerUI_StacksLogo","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[50]},{"t":156,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.051,-1.075,0],"ix":2,"l":2},"a":{"a":0,"k":[504.801,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.43,-0.639],[0,0],[0,0],[0,0],[-0.408,0],[0,0],[-0.228,-0.339],[0,0],[0,0],[0,0],[-0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.771,0],[0,0],[0,0],[0,0],[0.228,-0.339],[0,0],[0.408,0],[0,0],[0,0],[0,0],[-0.43,-0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[492.425,220.258],[498.913,220.258],[499.711,221.757],[493.342,231.228],[496.213,231.228],[503.227,220.799],[504.244,220.258],[505.357,220.258],[506.374,220.799],[513.387,231.228],[516.259,231.228],[509.889,221.757],[510.688,220.258],[511.929,220.258],[520.357,220.258],[520.357,217.876],[511.929,217.876],[505.193,217.876],[504.408,217.876],[492.425,217.876],[489.245,217.876],[489.245,220.258]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.43,0.639],[0,0],[0,0],[0,0],[0.408,0],[0,0],[0.228,0.339],[0,0],[0,0],[0,0],[0.771,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.771,0],[0,0],[0,0],[0,0],[-0.228,0.339],[0,0],[-0.408,0],[0,0],[0,0],[0,0],[0.43,0.639],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[517.176,210.092],[510.689,210.092],[509.89,208.593],[516.259,199.122],[513.388,199.122],[506.375,209.55],[505.357,210.092],[504.245,210.092],[503.227,209.55],[496.214,199.122],[493.343,199.122],[499.712,208.593],[498.913,210.092],[497.673,210.092],[489.245,210.092],[489.245,212.474],[497.673,212.474],[504.408,212.474],[505.194,212.474],[517.176,212.474],[520.357,212.474],[520.357,210.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.835294127464,0.86274510622,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":100,"op":155,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"LedgerUI_Arrow","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[236.072,74.925,0],"ix":2,"l":2},"a":{"a":0,"k":[462.822,215.175,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[465.254,223.653],[467.672,223.653],[467.672,221.235],[465.254,221.235]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[462.86,221.26],[465.279,221.26],[465.279,218.841],[462.86,218.841]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[460.416,218.816],[462.835,218.816],[462.835,216.397],[460.416,216.397]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[457.972,216.371],[460.39,216.371],[460.39,213.953],[457.972,213.953]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[460.39,213.953],[462.809,213.953],[462.809,211.534],[460.39,211.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[465.228,209.115],[467.647,209.115],[467.647,206.696],[465.228,206.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[462.809,211.534],[465.228,211.534],[465.228,209.115],[462.809,209.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333361149,0.564705908298,0.584313750267,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Ledger_ScreenMATTE","parent":16,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":531.543,"ix":3},"y":{"a":0,"k":-356.247,"ix":4}},"a":{"a":0,"k":[531.543,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,6.222],[0,0],[-6.222,0],[0,0]],"o":[[0,0],[-6.222,0],[0,0],[0,-6.222],[0,0],[0,0]],"v":[[636.163,-309.973],[473.301,-309.973],[462.034,-321.24],[462.034,-391.26],[473.301,-402.527],[636.163,-402.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.086274512112,0.098039217293,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"Ledger_LogoIn","parent":15,"tt":1,"tp":13,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":532.043,"ix":3},"y":{"a":0,"k":-356.247,"ix":4}},"a":{"a":0,"k":[150,75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":300,"h":150,"ip":74,"op":163,"st":74,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Ledger_Btn1","parent":16,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[404.346,-356.247,0],"ix":2,"l":2},"a":{"a":0,"k":[404.346,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.374],[17.374,0],[0,17.374],[-17.374,0]],"o":[[0,17.374],[-17.374,0],[0,-17.374],[17.374,0]],"v":[[435.804,-356.25],[404.346,-324.791],[372.887,-356.25],[404.346,-387.709]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Ledger_Body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.18],"y":[0.807]},"o":{"x":[0.738],"y":[0]},"t":20,"s":[310]},{"i":{"x":[0.582],"y":[0.817]},"o":{"x":[0.434],"y":[0.517]},"t":40,"s":[381]},{"i":{"x":[0.787],"y":[1.784]},"o":{"x":[0.47],"y":[1.258]},"t":50,"s":[388]},{"i":{"x":[0.969],"y":[0.363]},"o":{"x":[0.791],"y":[0.078]},"t":64,"s":[389.599]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.003],"y":[0.652]},"t":70,"s":[364]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[359.5]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.531],"y":[0]},"t":145,"s":[359.5]},{"t":165,"s":[310]}],"ix":3},"y":{"a":0,"k":360,"ix":4}},"a":{"a":0,"k":[531.543,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,6.222],[0,0],[-6.222,0],[0,0]],"o":[[0,0],[-6.222,0],[0,0],[0,-6.222],[0,0],[0,0]],"v":[[636.163,-309.973],[473.301,-309.973],[462.034,-321.24],[462.034,-391.26],[473.301,-402.527],[636.163,-402.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.086274512112,0.098039217293,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.304,0],[0,0],[0,8.304],[0,0],[-8.304,0],[0,0],[0,-8.304],[0,0]],"o":[[0,0],[-8.304,0],[0,0],[0,-8.304],[0,0],[8.304,0],[0,0],[0,8.304]],"v":[[708.06,-298.703],[355.027,-298.703],[339.991,-313.738],[339.991,-398.756],[355.027,-413.792],[708.06,-413.792],[723.095,-398.756],[723.095,-313.738]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[564.348,-283],"ix":5},"e":{"a":0,"k":[410.548,-633.876],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"USBCableMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[147.531,360.865,0],"ix":2,"l":2},"a":{"a":0,"k":[-162.469,-2.135,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[296.062,154.27],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":155,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.231372997165,0.850979983807,0.823529005051,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-162.469,-2.135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"USBCable","tt":1,"tp":17,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.153],"y":[0.914]},"o":{"x":[0.738],"y":[0]},"t":20,"s":[-136.456]},{"i":{"x":[0.624],"y":[0.818]},"o":{"x":[0.384],"y":[0.389]},"t":40,"s":[63.544]},{"i":{"x":[0.97],"y":[0.475]},"o":{"x":[0.879],"y":[0.459]},"t":50,"s":[73.544]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[92.044]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[93.544]},{"i":{"x":[0.27],"y":[0.867]},"o":{"x":[0.531],"y":[0]},"t":142,"s":[93.544]},{"t":162,"s":[-128.456]}],"ix":3},"y":{"a":0,"k":361.753,"ix":4}},"a":{"a":0,"k":[219.544,-356.247,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.741,-374.299],[229.741,-364.047],[232.014,-364.047],[232.014,-372.026],[245.341,-372.026],[245.341,-374.299]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.741,-348.447],[229.741,-338.195],[245.341,-338.195],[245.341,-340.469],[232.014,-340.469],[232.014,-348.447]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[247.637,-364.047],[245.364,-364.047],[245.364,-348.447],[255.615,-348.447],[255.615,-350.498],[247.637,-350.498]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[255.623,-374.299],[255.623,-372.026],[268.95,-372.026],[268.95,-364.047],[271.223,-364.047],[271.223,-374.299]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[255.623,-340.469],[255.623,-338.196],[271.223,-338.196],[271.223,-348.447],[268.95,-348.447],[268.95,-340.469]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,12.612],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[200.753,-331.4],[212.924,-363.416],[212.924,-331.345]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[317.883,-334.326],[288.04,-334.326],[288.04,-378.169],[317.883,-378.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[323.348,-379],"ix":5},"e":{"a":0,"k":[253.818,-299.083],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 4","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[2.035,-0.031],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.472,0],[0,0],[0,6.472],[0,0],[-6.472,0],[0,0],[0,-6.472],[0,0]],"o":[[0,0],[-6.472,0],[0,0],[0,-6.472],[0,0],[6.472,0],[0,0],[0,6.472]],"v":[[276.321,-318.689],[224.643,-318.689],[212.924,-330.408],[212.924,-382.086],[224.643,-393.805],[276.321,-393.805],[288.04,-382.086],[288.04,-330.408]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[208.348,-372],"ix":5},"e":{"a":0,"k":[292.62,-341.327],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-13.723],[-5.614,0],[0,0],[0,0]],"o":[[-5.614,0],[0,13.723],[0,0],[0,0],[0,0]],"v":[[195.466,-381.094],[185.301,-356.247],[195.466,-331.4],[245.16,-331.4],[245.16,-381.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1],"ix":9}},"s":{"a":0,"k":[186.348,-369],"ix":5},"e":{"a":0,"k":[250.228,-345.749],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.523,0.592],[0,0.724],[0,0],[-1.576,0],[0,0]],"o":[[0,0],[-0.852,0],[-0.444,-0.503],[0,0],[0,-1.576],[0,0],[0,0]],"v":[[195.203,-349.786],[33.308,-349.822],[31.168,-350.788],[30.454,-352.675],[30.454,-359.49],[33.308,-362.343],[195.203,-362.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":195,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/src/app/features/ledger/animations/plugging-in-cable.lottie.tsx b/src/app/features/ledger/animations/plugging-in-cable.lottie.tsx index 6266d38f8ea..59604db514a 100644 --- a/src/app/features/ledger/animations/plugging-in-cable.lottie.tsx +++ b/src/app/features/ledger/animations/plugging-in-cable.lottie.tsx @@ -1,6 +1,6 @@ import LottieRaw, { Options } from 'react-lottie'; -import { Box, BoxProps } from '@stacks/ui'; +import { Box, BoxProps } from 'leather-styles/jsx'; import { useThemeSwitcher } from '@app/common/theme-provider'; @@ -24,7 +24,7 @@ export default function PluggingInLedgerCableAnimation(props: BoxProps) { const invertStyle = theme === 'light' ? {} : { filter: 'invert()' }; return ( - + diff --git a/src/app/features/ledger/components/device-approval-status.tsx b/src/app/features/ledger/components/device-approval-status.tsx index 0df18aff422..a82efc09e20 100644 --- a/src/app/features/ledger/components/device-approval-status.tsx +++ b/src/app/features/ledger/components/device-approval-status.tsx @@ -6,9 +6,7 @@ interface DeviceOperationApprovalStatusProps { } export function DeviceOperationApprovalStatus({ status }: DeviceOperationApprovalStatusProps) { if (status === 'awaiting-approval') - return ( - Waiting for your approval - ); + return Waiting for your approval; - return Approved; + return Approved; } diff --git a/src/app/features/ledger/components/ledger-inline-warnings.tsx b/src/app/features/ledger/components/ledger-inline-warnings.tsx index a2413614b68..67064687bbe 100644 --- a/src/app/features/ledger/components/ledger-inline-warnings.tsx +++ b/src/app/features/ledger/components/ledger-inline-warnings.tsx @@ -1,17 +1,50 @@ -import { Text } from '@stacks/ui'; +import { styled } from 'leather-styles/jsx'; import { SupportedBlockchains } from '@shared/constants'; -import { Capitalize } from '@app/components/text/capitalize'; import { WarningLabel } from '@app/components/warning-label'; +import { Capitalize } from '@app/ui/utils/capitalize'; import { isStacksLedgerAppClosed } from '../utils/stacks-ledger-utils'; -interface CommonLedgerInlineWarningsProps { +interface RequiresChainProp { chain: SupportedBlockchains; +} + +interface CommonLedgerInlineWarningsProps extends RequiresChainProp { latestDeviceResponse: any | null; outdatedLedgerAppWarning?: boolean; } + +function OutdatedLedgerAppWarning({ chain }: RequiresChainProp) { + return ( + + Latest version of {chain} app required + + Update on Ledger Live to continue + + + ); +} + +function LedgerDeviceLockedWarning({ chain }: RequiresChainProp) { + return ( + + Your Ledger is locked. Unlock it and open the {''} + {chain} + {''} app to continue. + + ); +} + +function LedgerAppClosedWarning({ chain }: RequiresChainProp) { + return ( + + The {chain} app appears to be closed on Ledger. Open it to continue. + + ); +} + export function CommonLedgerDeviceInlineWarnings({ chain, latestDeviceResponse, @@ -20,29 +53,10 @@ export function CommonLedgerDeviceInlineWarnings({ if (!latestDeviceResponse) return null; if (outdatedLedgerAppWarning) { - return ( - - Latest version of {chain} app required - - Update on Ledger Live to continue - - - ); + return ; } - if (latestDeviceResponse.deviceLocked) - return ( - - Your Ledger is locked. Unlock it and open the {''} - {chain} - {''} app to continue. - - ); + if (latestDeviceResponse.deviceLocked) return ; if (isStacksLedgerAppClosed(latestDeviceResponse)) - return ( - - The {chain} app appears to be closed on Ledger. Open it to - continue. - - ); + return ; return null; } diff --git a/src/app/features/ledger/components/ledger-screen-detail.tsx b/src/app/features/ledger/components/ledger-screen-detail.tsx index e113c777635..a89bb0e86c6 100644 --- a/src/app/features/ledger/components/ledger-screen-detail.tsx +++ b/src/app/features/ledger/components/ledger-screen-detail.tsx @@ -1,9 +1,9 @@ -import { FiInfo } from 'react-icons/fi'; - -import { Box, Flex, Text, color } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; +import { token } from 'leather-styles/tokens'; import { Tooltip } from '@app/components/tooltip'; -import { Caption } from '@app/components/typography'; +import { InfoIcon } from '@app/ui/components/icons/info-icon'; +import { Caption } from '@app/ui/components/typography/caption'; interface LedgerScreenDetailProps { children: React.ReactNode; @@ -14,18 +14,17 @@ export function LedgerScreenDetail(props: LedgerScreenDetailProps) { const { children, title, tooltipLabel } = props; return ( - + {tooltipLabel ? ( - + {title} - @@ -33,10 +32,10 @@ export function LedgerScreenDetail(props: LedgerScreenDetailProps) { <>{title} )} - - + + {children} - + ); diff --git a/src/app/features/ledger/components/ledger-title.tsx b/src/app/features/ledger/components/ledger-title.tsx index 5edb3635c3b..f692b28bd99 100644 --- a/src/app/features/ledger/components/ledger-title.tsx +++ b/src/app/features/ledger/components/ledger-title.tsx @@ -2,7 +2,7 @@ import { BoxProps, styled } from 'leather-styles/jsx'; import { SupportedBlockchains } from '@shared/constants'; -import { Capitalize } from '@app/components/text/capitalize'; +import { Capitalize } from '@app/ui/utils/capitalize'; export function LedgerTitle(props: BoxProps) { const { children, ...rest } = props; diff --git a/src/app/features/ledger/components/looking-for-ledger-label.tsx b/src/app/features/ledger/components/looking-for-ledger-label.tsx index e463f43b615..e83415d89b3 100644 --- a/src/app/features/ledger/components/looking-for-ledger-label.tsx +++ b/src/app/features/ledger/components/looking-for-ledger-label.tsx @@ -1,6 +1,7 @@ -import { Flex, FlexProps, Spinner, color } from '@stacks/ui'; +import { Flex, FlexProps } from 'leather-styles/jsx'; -import { Caption } from '@app/components/typography'; +import { Spinner } from '@app/ui/components/spinner'; +import { Caption } from '@app/ui/components/typography/caption'; interface LookingForLedgerLabelProps extends FlexProps { children: React.ReactNode; @@ -8,8 +9,8 @@ interface LookingForLedgerLabelProps extends FlexProps { export function LookingForLedgerLabel({ children, ...props }: LookingForLedgerLabelProps) { return ( - - {children} + + {children} ); } diff --git a/src/app/features/ledger/components/success-label.tsx b/src/app/features/ledger/components/success-label.tsx index 7f833672feb..28d5679a95e 100644 --- a/src/app/features/ledger/components/success-label.tsx +++ b/src/app/features/ledger/components/success-label.tsx @@ -1,17 +1,16 @@ -import { FiCheck } from 'react-icons/fi'; +import { Flex, FlexProps } from 'leather-styles/jsx'; -import { Flex, FlexProps, color } from '@stacks/ui'; - -import { Caption } from '@app/components/typography'; +import { AnimatedTickIcon } from '@app/ui/components/icons/animated-tick-icon'; +import { Caption } from '@app/ui/components/typography/caption'; interface LedgerSuccessLabelProps extends FlexProps { children: React.ReactNode; } export function LedgerSuccessLabel({ children, ...props }: LedgerSuccessLabelProps) { return ( - - - + + + {children} diff --git a/src/app/features/ledger/flows/bitcoin-tx-signing/bitcoin-tx-signing-event-listeners.ts b/src/app/features/ledger/flows/bitcoin-tx-signing/bitcoin-tx-signing-event-listeners.ts new file mode 100644 index 00000000000..0c93a3e0fc1 --- /dev/null +++ b/src/app/features/ledger/flows/bitcoin-tx-signing/bitcoin-tx-signing-event-listeners.ts @@ -0,0 +1,25 @@ +import * as btc from '@scure/btc-signer'; + +import { GlobalAppEvents, appEvents } from '@app/common/publish-subscribe'; + +export async function listenForBitcoinTxLedgerSigning(psbt: string): Promise { + return new Promise((resolve, reject) => { + function txSignedHandler(msg: GlobalAppEvents['ledgerBitcoinTxSigned']) { + if (msg.unsignedPsbt === psbt) { + appEvents.unsubscribe('ledgerBitcoinTxSigned', txSignedHandler); + appEvents.unsubscribe('ledgerBitcoinTxSigningCancelled', signingAbortedHandler); + resolve(msg.signedPsbt); + } + } + appEvents.subscribe('ledgerBitcoinTxSigned', txSignedHandler); + + function signingAbortedHandler(msg: GlobalAppEvents['ledgerBitcoinTxSigningCancelled']) { + if (msg.unsignedPsbt === psbt) { + appEvents.unsubscribe('ledgerBitcoinTxSigningCancelled', signingAbortedHandler); + appEvents.unsubscribe('ledgerBitcoinTxSigned', txSignedHandler); + reject(new Error('User cancelled the signing operation')); + } + } + appEvents.subscribe('ledgerBitcoinTxSigningCancelled', signingAbortedHandler); + }); +} diff --git a/src/app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container.tsx b/src/app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container.tsx new file mode 100644 index 00000000000..7c49cbfcfee --- /dev/null +++ b/src/app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container.tsx @@ -0,0 +1,127 @@ +import { useEffect, useState } from 'react'; +import { Outlet, Route, useLocation } from 'react-router-dom'; + +import * as btc from '@scure/btc-signer'; +import { hexToBytes } from '@stacks/common'; +import get from 'lodash.get'; + +import { logger } from '@shared/logger'; +import { RouteUrls } from '@shared/route-urls'; + +import { useLocationState, useLocationStateWithCache } from '@app/common/hooks/use-location-state'; +import { useScrollLock } from '@app/common/hooks/use-scroll-lock'; +import { appEvents } from '@app/common/publish-subscribe'; +import { delay } from '@app/common/utils'; +import { BaseDrawer } from '@app/components/drawer/base-drawer'; +import { + LedgerTxSigningContext, + LedgerTxSigningProvider, +} from '@app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context'; +import { useActionCancellableByUser } from '@app/features/ledger/utils/stacks-ledger-utils'; +import { useSignLedgerBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; + +import { ledgerSignTxRoutes } from '../../generic-flows/tx-signing/ledger-sign-tx-route-generator'; +import { useLedgerAnalytics } from '../../hooks/use-ledger-analytics.hook'; +import { useLedgerNavigate } from '../../hooks/use-ledger-navigate'; +import { connectLedgerBitcoinApp, getBitcoinAppVersion } from '../../utils/bitcoin-ledger-utils'; +import { useLedgerResponseState } from '../../utils/generic-ledger-utils'; +import { ApproveSignLedgerBitcoinTx } from './steps/approve-bitcoin-sign-ledger-tx'; + +export const ledgerBitcoinTxSigningRoutes = ledgerSignTxRoutes({ + component: , + customRoutes: ( + } /> + ), +}); + +function LedgerSignBitcoinTxContainer() { + const location = useLocation(); + const ledgerNavigate = useLedgerNavigate(); + const ledgerAnalytics = useLedgerAnalytics(); + useScrollLock(true); + + const canUserCancelAction = useActionCancellableByUser(); + const [unsignedTransactionRaw, setUnsignedTransactionRaw] = useState(null); + const [unsignedTransaction, setUnsignedTransaction] = useState(null); + const signLedger = useSignLedgerBitcoinTx(); + + const inputsToSign = useLocationStateWithCache('inputsToSign'); + const allowUserToGoBack = useLocationState('goBack'); + + useEffect(() => { + const tx = get(location.state, 'tx'); + if (tx) { + setUnsignedTransactionRaw(tx); + setUnsignedTransaction(btc.Transaction.fromPSBT(hexToBytes(tx))); + } + }, [location.state]); + + useEffect(() => () => setUnsignedTransaction(null), []); + + const [latestDeviceResponse, setLatestDeviceResponse] = useLedgerResponseState(); + + const [awaitingDeviceConnection, setAwaitingDeviceConnection] = useState(false); + + const signTransaction = async () => { + setAwaitingDeviceConnection(true); + const bitcoinApp = await connectLedgerBitcoinApp(); + + try { + const versionInfo = await getBitcoinAppVersion(bitcoinApp); + + ledgerAnalytics.trackDeviceVersionInfo(versionInfo); + setAwaitingDeviceConnection(false); + + setLatestDeviceResponse(versionInfo as any); + } catch (e) {} + + ledgerNavigate.toDeviceBusyStep('Verifying public key on Ledger…'); + + ledgerNavigate.toConnectionSuccessStep('bitcoin'); + await delay(1200); + if (!unsignedTransaction) throw new Error('No unsigned tx'); + + ledgerNavigate.toAwaitingDeviceOperation({ hasApprovedOperation: false }); + + try { + const btcTx = await signLedger(bitcoinApp, unsignedTransaction.toPSBT(), inputsToSign); + + if (!btcTx || !unsignedTransactionRaw) throw new Error('No tx returned'); + ledgerNavigate.toAwaitingDeviceOperation({ hasApprovedOperation: true }); + await delay(1200); + appEvents.publish('ledgerBitcoinTxSigned', { + signedPsbt: btcTx, + unsignedPsbt: unsignedTransactionRaw, + }); + } catch (e) { + logger.error('Unable to sign tx with ledger', e); + ledgerAnalytics.transactionSignedOnLedgerRejected(); + ledgerNavigate.toOperationRejectedStep(); + } finally { + void bitcoinApp.transport.close(); + } + }; + + const ledgerContextValue: LedgerTxSigningContext = { + chain: 'bitcoin', + transaction: unsignedTransaction, + signTransaction, + latestDeviceResponse, + awaitingDeviceConnection, + }; + + return ( + + + + + + ); +} diff --git a/src/app/features/ledger/flows/bitcoin-tx-signing/steps/approve-bitcoin-sign-ledger-tx.tsx b/src/app/features/ledger/flows/bitcoin-tx-signing/steps/approve-bitcoin-sign-ledger-tx.tsx new file mode 100644 index 00000000000..0c6c9991395 --- /dev/null +++ b/src/app/features/ledger/flows/bitcoin-tx-signing/steps/approve-bitcoin-sign-ledger-tx.tsx @@ -0,0 +1,33 @@ +import * as btc from '@scure/btc-signer'; + +import { getPsbtTxInputs, getPsbtTxOutputs } from '@shared/crypto/bitcoin/bitcoin.utils'; + +import { useLedgerTxSigningContext } from '@app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context'; +import { ApproveLedgerOperationLayout } from '@app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout'; +import { useHasApprovedOperation } from '@app/features/ledger/hooks/use-has-approved-transaction'; + +export function ApproveSignLedgerBitcoinTx() { + const hasApprovedOperation = useHasApprovedOperation(); + + const context = useLedgerTxSigningContext(); + + if (context.chain !== 'bitcoin') return null; + + return ( + [ + `Input ${i + 1}`, + input.witnessUtxo?.amount?.toString() + ' sats', + ]), + ...getPsbtTxOutputs(context.transaction as unknown as btc.Transaction).map( + (output, i) => [`Output ${i + 1}`, output.amount?.toString() + ' sats'] + ), + ] as [string, string][] + } + status={hasApprovedOperation ? 'approved' : 'awaiting-approval'} + /> + ); +} diff --git a/src/app/features/ledger/flows/jwt-signing/ledger-sign-jwt-container.tsx b/src/app/features/ledger/flows/jwt-signing/ledger-sign-jwt-container.tsx index 189d771657b..fe10c58391c 100644 --- a/src/app/features/ledger/flows/jwt-signing/ledger-sign-jwt-container.tsx +++ b/src/app/features/ledger/flows/jwt-signing/ledger-sign-jwt-container.tsx @@ -8,6 +8,7 @@ import get from 'lodash.get'; import { finalizeAuthResponse } from '@shared/actions/finalize-auth-response'; import { logger } from '@shared/logger'; +import { useGetLegacyAuthBitcoinAddresses } from '@app/common/authentication/use-legacy-auth-bitcoin-addresses'; import { useOnboardingState } from '@app/common/hooks/auth/use-onboarding-state'; import { useDefaultRequestParams } from '@app/common/hooks/use-default-request-search-params'; import { useKeyActions } from '@app/common/hooks/use-key-actions'; @@ -42,6 +43,8 @@ export function LedgerSignJwtContainer() { const activeAccount = useCurrentStacksAccount(); const accounts = useStacksAccounts(); + const getBitcoinAddressesLegacyFormat = useGetLegacyAuthBitcoinAddresses(); + const keyActions = useKeyActions(); const canUserCancelAction = useActionCancellableByUser(); const { decodedAuthRequest, authRequest } = useOnboardingState(); @@ -106,6 +109,14 @@ export function LedgerSignJwtContainer() { return; } + // TODO: #4566 Low-grade code. This is to be removed when deprecating legacy APIs + let legacyAddressObj = {}; + try { + legacyAddressObj = getBitcoinAddressesLegacyFormat(accountIndex); + } catch (e) { + logger.error('Error while generating bitcoin addresses to return', e); + } + try { ledgerNavigate.toConnectionSuccessStep('stacks'); await delay(1000); @@ -117,6 +128,7 @@ export function LedgerSignJwtContainer() { testnet: getAddressFromPublicKey(account.stxPublicKey, TransactionVersion.Testnet), mainnet: getAddressFromPublicKey(account.stxPublicKey, TransactionVersion.Mainnet), }, + ...legacyAddressObj, }, }); @@ -135,6 +147,7 @@ export function LedgerSignJwtContainer() { const authResponse = addSignatureToAuthResponseJwt(authResponsePayload, resp.signatureDER); await delay(600); keyActions.switchAccount(accountIndex); + finalizeAuthResponse({ decodedAuthRequest, authRequest, @@ -142,10 +155,10 @@ export function LedgerSignJwtContainer() { requestingOrigin: origin, tabId, }); - - await stacks.transport.close(); } catch (e) { ledgerNavigate.toDeviceDisconnectStep(); + } finally { + await stacks.transport.close(); } }; diff --git a/src/app/features/ledger/flows/jwt-signing/steps/sign-jwt-hash.tsx b/src/app/features/ledger/flows/jwt-signing/steps/sign-jwt-hash.tsx index cd8d09fafe4..01bdacc6c0a 100644 --- a/src/app/features/ledger/flows/jwt-signing/steps/sign-jwt-hash.tsx +++ b/src/app/features/ledger/flows/jwt-signing/steps/sign-jwt-hash.tsx @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import { Box, Flex, color } from '@stacks/ui'; +import { Box, Flex } from 'leather-styles/jsx'; import { DeviceOperationApprovalStatus } from '@app/features/ledger/components/device-approval-status'; import { LedgerScreenDetail } from '@app/features/ledger/components/ledger-screen-detail'; @@ -16,22 +16,22 @@ export function SignJwtHash() { return ( - + - + Approve the JWT hash on your device , + customRoutes: ( + } /> + ), +}); + +function LedgerSignStacksTxContainer() { const location = useLocation(); const navigate = useNavigate(); const ledgerNavigate = useLedgerNavigate(); @@ -100,7 +109,7 @@ export function LedgerSignStacksTxContainer() { ledgerNavigate.toAwaitingDeviceOperation({ hasApprovedOperation: false }); - const resp = await signLedgerTransaction(stacksApp)( + const resp = await signLedgerStacksTransaction(stacksApp)( Buffer.from(unsignedTx, 'hex'), account.index ); @@ -126,7 +135,7 @@ export function LedgerSignStacksTxContainer() { await delay(1000); - const signedTx = signTransactionWithSignature(unsignedTx, resp.signatureVRS); + const signedTx = signStacksTransactionWithSignature(unsignedTx, resp.signatureVRS); ledgerAnalytics.transactionSignedOnLedgerSuccessfully(); try { @@ -153,6 +162,7 @@ export function LedgerSignStacksTxContainer() { } const ledgerContextValue: LedgerTxSigningContext = { + chain: 'stacks', transaction: unsignedTx ? deserializeTransaction(unsignedTx) : null, signTransaction, latestDeviceResponse, diff --git a/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.context.ts b/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.context.ts deleted file mode 100644 index 53a9679a6d1..00000000000 --- a/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.context.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createContext } from 'react'; - -import { StacksTransaction } from '@stacks/transactions'; - -import { noop } from '@shared/utils'; - -import { createWaitableAction } from '@app/common/utils/create-waitable-action'; - -import { BaseLedgerOperationContext } from '../../utils/generic-ledger-utils'; - -export function createWaitForUserToSeeWarningScreen() { - return createWaitableAction<'ignored-warning' | 'cancelled-operation'>(); -} - -export interface LedgerTxSigningContext extends BaseLedgerOperationContext { - transaction: StacksTransaction | null; - signTransaction(): Promise | void; - hasUserSkippedBuggyAppWarning: ReturnType; -} - -export const ledgerTxSigningContext = createContext({ - transaction: null, - latestDeviceResponse: null, - awaitingDeviceConnection: false, - signTransaction: noop, - hasUserSkippedBuggyAppWarning: createWaitForUserToSeeWarningScreen(), -}); - -export const LedgerTxSigningProvider = ledgerTxSigningContext.Provider; diff --git a/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes.tsx b/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes.tsx deleted file mode 100644 index 06fe7fac087..00000000000 --- a/src/app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Route } from 'react-router-dom'; - -import { RouteUrls } from '@shared/route-urls'; - -import { - ConnectLedgerError, - ConnectLedgerSuccessLayout, - DeviceBusy, - LedgerDeviceInvalidPayload, - LedgerDisconnected, - LedgerPublicKeyMismatch, - OperationRejected, - UnsupportedBrowserLayout, -} from '../../generic-steps'; -import { LedgerBroadcastError } from '../../generic-steps/broadcast-error/broadcast-error'; -import { LedgerSignStacksTxContainer } from './ledger-sign-tx-container'; -import { ApproveSignLedgerTx } from './steps/approve-sign-ledger-tx'; -import { ConnectLedgerSignTx } from './steps/connect-ledger-sign-tx'; -import { ContractPrincipalBugWarning } from './steps/contract-principal-bug-warning'; - -export const ledgerStacksTxSigningRoutes = ( - }> - } /> - } /> - } /> - } /> - } - /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - -); diff --git a/src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-ledger-tx.tsx b/src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-stacks-ledger-tx.tsx similarity index 87% rename from src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-ledger-tx.tsx rename to src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-stacks-ledger-tx.tsx index 42056ac0408..43408489337 100644 --- a/src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-ledger-tx.tsx +++ b/src/app/features/ledger/flows/stacks-tx-signing/steps/approve-sign-stacks-ledger-tx.tsx @@ -1,11 +1,11 @@ -import { useContext, useMemo } from 'react'; +import { useMemo } from 'react'; import { PayloadType, cvToString } from '@stacks/transactions'; import { BigNumber } from 'bignumber.js'; import { microStxToStx } from '@app/common/money/unit-conversion'; import { isSip10Transfer } from '@app/common/transactions/stacks/is-sip-10-transfer'; -import { ledgerTxSigningContext } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.context'; +import { useLedgerTxSigningContext } from '@app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context'; import { ApproveLedgerOperationLayout } from '@app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout'; import { useHasApprovedOperation } from '@app/features/ledger/hooks/use-has-approved-transaction'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; @@ -21,13 +21,13 @@ function formatTooltipLabel(amount: bigint) { return `The amount is displayed in microstacks (µSTX) and is equal to ${stxFromMicroStx} STX`; } -export function ApproveSignLedgerTx() { - const { transaction } = useContext(ledgerTxSigningContext); +export function ApproveSignLedgerStacksTx() { + const { transaction, chain } = useLedgerTxSigningContext(); const currentAccount = useCurrentStacksAccount(); const hasApprovedOperation = useHasApprovedOperation(); const transactionDetails: [string, string, string?][] = useMemo(() => { - if (!transaction) return []; + if (!transaction || chain !== 'stacks') return []; if (transaction.payload.payloadType === PayloadType.TokenTransfer) { return [ @@ -62,7 +62,7 @@ export function ApproveSignLedgerTx() { .map((value, index) => [`Argument ${index + 0}`, value]); return []; - }, [currentAccount, transaction]); + }, [chain, currentAccount?.address, transaction]); return ( - + - Stacks Ledger app is outdated - + Stacks Ledger app is outdated + Some transactions are not compatible with outdated app versions. Update your app in{' '} Ledger Live {' '} and try again. - - - - - + + ); } diff --git a/src/app/features/ledger/generic-flows/request-keys/steps/add-more-keys.tsx b/src/app/features/ledger/generic-flows/request-keys/steps/add-more-keys.tsx index 9ad4e49daf7..0e286d51536 100644 --- a/src/app/features/ledger/generic-flows/request-keys/steps/add-more-keys.tsx +++ b/src/app/features/ledger/generic-flows/request-keys/steps/add-more-keys.tsx @@ -2,11 +2,11 @@ import { useNavigate } from 'react-router-dom'; import { Stack } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { Capitalize } from '@app/components/text/capitalize'; -import { Caption } from '@app/components/typography'; import { LedgerTitle } from '@app/features/ledger/components/ledger-title'; import { LedgerWrapper } from '@app/features/ledger/components/ledger-wrapper'; +import { LeatherButton } from '@app/ui/components/button'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Capitalize } from '@app/ui/utils/capitalize'; import { useLedgerRequestKeysContext } from '../ledger-request-keys.context'; diff --git a/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx-route-generator.tsx b/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx-route-generator.tsx new file mode 100644 index 00000000000..14a0213e03a --- /dev/null +++ b/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx-route-generator.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { RouteUrls } from '@shared/route-urls'; + +import { ContractPrincipalBugWarning } from '../../flows/stacks-tx-signing/steps/contract-principal-bug-warning'; +import { + ConnectLedgerError, + ConnectLedgerSuccess, + DeviceBusy, + LedgerDeviceInvalidPayload, + LedgerDisconnected, + LedgerPublicKeyMismatch, + OperationRejected, + UnsupportedBrowserLayout, +} from '../../generic-steps'; +import { LedgerBroadcastError } from '../../generic-steps/broadcast-error/broadcast-error'; +import { ConnectLedgerSignTx } from './steps/connect-ledger-sign-tx'; + +interface LedgerSignTxRoutesProps { + component: React.ReactNode; + customRoutes: React.ReactNode; +} +export function ledgerSignTxRoutes({ component, customRoutes }: LedgerSignTxRoutesProps) { + return ( + + {customRoutes} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ); +} diff --git a/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context.ts b/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context.ts new file mode 100644 index 00000000000..cf2d76c919c --- /dev/null +++ b/src/app/features/ledger/generic-flows/tx-signing/ledger-sign-tx.context.ts @@ -0,0 +1,42 @@ +import { createContext, useContext } from 'react'; + +import * as btc from '@scure/btc-signer'; +import { StacksTransaction } from '@stacks/transactions'; + +import { SupportedBlockchains } from '@shared/constants'; + +import { createWaitableAction } from '@app/common/utils/create-waitable-action'; + +import { BaseLedgerOperationContext } from '../../utils/generic-ledger-utils'; + +export function createWaitForUserToSeeWarningScreen() { + return createWaitableAction<'ignored-warning' | 'cancelled-operation'>(); +} + +interface BaseLedgerTxSigningContext extends BaseLedgerOperationContext { + chain: SupportedBlockchains; + signTransaction(): Promise | void; +} + +interface BitcoinLedgerSigningContext extends BaseLedgerTxSigningContext { + chain: 'bitcoin'; + transaction: btc.Transaction | null; +} + +interface StacksLedgerSigningContext extends BaseLedgerTxSigningContext { + chain: 'stacks'; + transaction: StacksTransaction | null; + hasUserSkippedBuggyAppWarning: ReturnType; +} + +export type LedgerTxSigningContext = BitcoinLedgerSigningContext | StacksLedgerSigningContext; + +const ledgerTxSigningContext = createContext(null); + +export function useLedgerTxSigningContext() { + const context = useContext(ledgerTxSigningContext); + if (!context) throw new Error('ledgerTxSigningContext is undefined'); + return context; +} + +export const LedgerTxSigningProvider = ledgerTxSigningContext.Provider; diff --git a/src/app/features/ledger/flows/stacks-tx-signing/steps/connect-ledger-sign-tx.tsx b/src/app/features/ledger/generic-flows/tx-signing/steps/connect-ledger-sign-tx.tsx similarity index 67% rename from src/app/features/ledger/flows/stacks-tx-signing/steps/connect-ledger-sign-tx.tsx rename to src/app/features/ledger/generic-flows/tx-signing/steps/connect-ledger-sign-tx.tsx index 47d298cda7f..992eab6b7f2 100644 --- a/src/app/features/ledger/flows/stacks-tx-signing/steps/connect-ledger-sign-tx.tsx +++ b/src/app/features/ledger/generic-flows/tx-signing/steps/connect-ledger-sign-tx.tsx @@ -1,23 +1,22 @@ -import { useContext } from 'react'; - import { CommonLedgerDeviceInlineWarnings } from '@app/features/ledger/components/ledger-inline-warnings'; -import { ledgerTxSigningContext } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.context'; -import { ConnectLedger } from '@app/features/ledger/generic-steps/connect-device/connect-ledger'; +import { ConnectLedger } from '@app/features/ledger/generic-steps'; import { useWhenReattemptingLedgerConnection } from '@app/features/ledger/hooks/use-when-reattempt-ledger-connection'; +import { useLedgerTxSigningContext } from '../ledger-sign-tx.context'; + export function ConnectLedgerSignTx() { - const { signTransaction, latestDeviceResponse, awaitingDeviceConnection } = - useContext(ledgerTxSigningContext); + const { chain, signTransaction, latestDeviceResponse, awaitingDeviceConnection } = + useLedgerTxSigningContext(); useWhenReattemptingLedgerConnection(() => signTransaction()); return ( } diff --git a/src/app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout.tsx b/src/app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout.tsx index c9416befd58..847d69cfba9 100644 --- a/src/app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout.tsx +++ b/src/app/features/ledger/generic-steps/approve-ledger-operation/approve-ledger-operation.layout.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, color } from '@stacks/ui'; +import { Box, Flex } from 'leather-styles/jsx'; import { DividerSeparator } from '@app/components/layout/divider-separator'; import { SignLedgerTransaction } from '@app/features/ledger/illustrations/ledger-illu-sign-ledger-transaction'; @@ -17,23 +17,23 @@ export function ApproveLedgerOperationLayout(props: ApproveLedgerOperationLayout const { description, details, status } = props; return ( - + - + {description} - + {details.map(([title, value, tooltipLabel]) => ( {value} diff --git a/src/app/features/ledger/generic-steps/broadcast-error/broadcast-error.layout.tsx b/src/app/features/ledger/generic-steps/broadcast-error/broadcast-error.layout.tsx index 04d745ab1c3..b5262a07652 100644 --- a/src/app/features/ledger/generic-steps/broadcast-error/broadcast-error.layout.tsx +++ b/src/app/features/ledger/generic-steps/broadcast-error/broadcast-error.layout.tsx @@ -1,7 +1,7 @@ import BroadcastError from '@assets/images/unhappy-face-ui.png'; -import { Box, Button, Flex } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; -import { Body } from '@app/components/typography'; +import { LeatherButton } from '@app/ui/components/button'; import { LedgerTitle } from '../../components/ledger-title'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -15,19 +15,19 @@ export function LedgerBroadcastErrorLayout(props: LedgerBroadcastErrorLayoutProp return ( - + - + Transaction Broadcast Error - + Your transaction failed to broadcast {error && <>because of the error: {error}} - - - + ); diff --git a/src/app/features/ledger/generic-steps/connect-device/connect-ledger-error.layout.tsx b/src/app/features/ledger/generic-steps/connect-device/connect-ledger-error.layout.tsx index 8f9ba8bb680..b2bf3df5ece 100644 --- a/src/app/features/ledger/generic-steps/connect-device/connect-ledger-error.layout.tsx +++ b/src/app/features/ledger/generic-steps/connect-device/connect-ledger-error.layout.tsx @@ -1,14 +1,13 @@ -import { FiCircle } from 'react-icons/fi'; - import { Box, Flex, Stack, styled } from 'leather-styles/jsx'; import { capitalize } from '@app/common/utils'; -import { LeatherButton } from '@app/components/button/button'; import { ErrorLabel } from '@app/components/error-label'; import { ExternalLink } from '@app/components/external-link'; -import { LCaption } from '@app/components/typography'; import { WarningLabel } from '@app/components/warning-label'; import { ConnectLedgerErr } from '@app/features/ledger/illustrations/ledger-illu-connect-ledger-error'; +import { LeatherButton } from '@app/ui/components/button'; +import { CircleIcon } from '@app/ui/components/icons/circle-icon'; +import { Caption } from '@app/ui/components/typography/caption'; import { LedgerTitle } from '../../components/ledger-title'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -22,8 +21,8 @@ function PossibleReasonUnableToConnect(props: PossibleReasonUnableToConnectProps return ( - - + + {text} @@ -41,18 +40,18 @@ export function ConnectLedgerErrorLayout(props: ConnectLedgerErrorLayoutProps) { return ( - + We're unable to connect to your Ledger device {warningText ? ( - + {warningText} ) : ( - Unable to connect + Unable to connect )} - + Try again - + If the problem persists, check our{' '} Support Page - + ); } diff --git a/src/app/features/ledger/generic-steps/connect-device/connect-ledger-success.layout.tsx b/src/app/features/ledger/generic-steps/connect-device/connect-ledger-success.layout.tsx index e3df1a0473a..2014ef1391f 100644 --- a/src/app/features/ledger/generic-steps/connect-device/connect-ledger-success.layout.tsx +++ b/src/app/features/ledger/generic-steps/connect-device/connect-ledger-success.layout.tsx @@ -13,8 +13,8 @@ export function ConnectLedgerSuccessLayout({ chain }: ConnectLedgerSuccessLayout return ( - - Connected! + + Connected! ); } diff --git a/src/app/features/ledger/generic-steps/connect-device/connect-ledger.tsx b/src/app/features/ledger/generic-steps/connect-device/connect-ledger.tsx index 005bf4588b2..01b7ac3ce8e 100644 --- a/src/app/features/ledger/generic-steps/connect-device/connect-ledger.tsx +++ b/src/app/features/ledger/generic-steps/connect-device/connect-ledger.tsx @@ -3,13 +3,12 @@ import { Suspense, lazy, useMemo } from 'react'; import { Box, HStack, Stack, styled } from 'leather-styles/jsx'; import { SupportedBlockchains } from '@shared/constants'; -import { LEDGER_BITCOIN_ENABLED } from '@shared/environment'; -import { LeatherButton } from '@app/components/button/button'; import { ExternalLink } from '@app/components/external-link'; -import { BtcLedgerIcon } from '@app/components/icons/btc-ledger-icon'; -import { StxLedgerIcon } from '@app/components/icons/stx-ledger-icon'; import { Divider } from '@app/components/layout/divider'; +import { LeatherButton } from '@app/ui/components/button'; +import { BtcLedgerIcon } from '@app/ui/components/icons/btc-ledger-icon'; +import { StxLedgerIcon } from '@app/ui/components/icons/stx-ledger-icon'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -39,9 +38,6 @@ export function ConnectLedger(props: ConnectLedgerProps) { } = props; const showBitcoinConnectButton = useMemo(() => { - if (!LEDGER_BITCOIN_ENABLED) { - return false; - } return chain === 'bitcoin' || !!connectBitcoin; }, [chain, connectBitcoin]); @@ -49,14 +45,16 @@ export function ConnectLedger(props: ConnectLedgerProps) { return chain === 'stacks' || !!connectStacks; }, [chain, connectStacks]); - const instructions = useMemo( - () => [ + const instructions = useMemo(() => { + const showBothBtns = showBitcoinConnectButton && showStacksConnectButton; + return [ '1. Connect & unlock your Ledger', - `2. Open${showBitcoinConnectButton ? ' Bitcoin or' : ''} Stacks app`, + `2. Open${showBitcoinConnectButton ? ' Bitcoin' : ''} ${showBothBtns ? 'or' : ''} ${ + showStacksConnectButton ? 'Stacks' : '' + } app`, '3. Click the button below', - ], - [showBitcoinConnectButton] - ); + ]; + }, [showBitcoinConnectButton, showStacksConnectButton]); return ( @@ -106,7 +104,7 @@ export function ConnectLedger(props: ConnectLedgerProps) { {warning && ( - + {warning} )} diff --git a/src/app/features/ledger/generic-steps/device-busy/device-busy.layout.tsx b/src/app/features/ledger/generic-steps/device-busy/device-busy.layout.tsx index 617c5f6150b..a6319cde01d 100644 --- a/src/app/features/ledger/generic-steps/device-busy/device-busy.layout.tsx +++ b/src/app/features/ledger/generic-steps/device-busy/device-busy.layout.tsx @@ -12,7 +12,7 @@ export function DeviceBusyLayout(props: DeviceBusyLayoutProps) { return ( - {activityDescription} + {activityDescription} ); } diff --git a/src/app/features/ledger/generic-steps/index.ts b/src/app/features/ledger/generic-steps/index.ts index cbfcf24e831..3d152302384 100644 --- a/src/app/features/ledger/generic-steps/index.ts +++ b/src/app/features/ledger/generic-steps/index.ts @@ -1,7 +1,6 @@ export * from './approve-ledger-operation/approve-ledger-operation.layout'; export * from './connect-device/connect-ledger-error'; export * from './connect-device/connect-ledger-error.layout'; -export * from './connect-device/connect-ledger-success.layout'; export * from './connect-device/connect-ledger-success'; export * from './connect-device/connect-ledger'; export * from './device-busy/device-busy'; diff --git a/src/app/features/ledger/generic-steps/invalid-payload/device-invalid-payload.layout.tsx b/src/app/features/ledger/generic-steps/invalid-payload/device-invalid-payload.layout.tsx index f5364b83bca..fe0196a48e6 100644 --- a/src/app/features/ledger/generic-steps/invalid-payload/device-invalid-payload.layout.tsx +++ b/src/app/features/ledger/generic-steps/invalid-payload/device-invalid-payload.layout.tsx @@ -1,8 +1,7 @@ -import { Box, Flex, Text, color } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { Title } from '@app/components/typography'; import { ConnectLedgerErr } from '@app/features/ledger/illustrations/ledger-illu-connect-ledger-error'; +import { LeatherButton } from '@app/ui/components/button'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -17,12 +16,14 @@ export function LedgerDeviceInvalidPayloadLayout({ - Data Invalid - + + Data Invalid + + Your Ledger device has rejected the payload stating it is invalid - - - + + + Close diff --git a/src/app/features/ledger/generic-steps/ledger-disconnected/ledger-disconnected.layout.tsx b/src/app/features/ledger/generic-steps/ledger-disconnected/ledger-disconnected.layout.tsx index 40964ef924c..ac47112a36b 100644 --- a/src/app/features/ledger/generic-steps/ledger-disconnected/ledger-disconnected.layout.tsx +++ b/src/app/features/ledger/generic-steps/ledger-disconnected/ledger-disconnected.layout.tsx @@ -1,6 +1,6 @@ import { Box, HStack } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import { LedgerTitle } from '../../components/ledger-title'; import { LedgerWrapper } from '../../components/ledger-wrapper'; diff --git a/src/app/features/ledger/generic-steps/operation-rejected/operation-rejected.layout.tsx b/src/app/features/ledger/generic-steps/operation-rejected/operation-rejected.layout.tsx index 7cea1b46927..2b10bd335be 100644 --- a/src/app/features/ledger/generic-steps/operation-rejected/operation-rejected.layout.tsx +++ b/src/app/features/ledger/generic-steps/operation-rejected/operation-rejected.layout.tsx @@ -1,7 +1,7 @@ import { Box } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; import { LedgerTxRejected } from '@app/features/ledger/illustrations/ledger-illu-transaction-rejected'; +import { LeatherButton } from '@app/ui/components/button'; import { LedgerTitle } from '../../components/ledger-title'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -20,7 +20,7 @@ export function LedgerOperationRejectedLayout({ {description} - + Close diff --git a/src/app/features/ledger/generic-steps/public-key-mismatch/public-key-mismatch.layout.tsx b/src/app/features/ledger/generic-steps/public-key-mismatch/public-key-mismatch.layout.tsx index 6f916755254..a55d7f12865 100644 --- a/src/app/features/ledger/generic-steps/public-key-mismatch/public-key-mismatch.layout.tsx +++ b/src/app/features/ledger/generic-steps/public-key-mismatch/public-key-mismatch.layout.tsx @@ -1,7 +1,7 @@ -import { Box, Button, Flex, Text, color } from '@stacks/ui'; +import { Box, Flex, styled } from 'leather-styles/jsx'; -import { Title } from '@app/components/typography'; import { ConnectLedgerErr } from '@app/features/ledger/illustrations/ledger-illu-connect-ledger-error'; +import { LeatherButton } from '@app/ui/components/button'; import { LedgerWrapper } from '../../components/ledger-wrapper'; @@ -15,15 +15,17 @@ export function PublicKeyMismatchLayout({ onClose, onTryAgain }: PublicKeyMismat - Public key does not match - + + Public key does not match + + Ensure you're using the same Ledger you used when setting up Leather - - - - + + Try again ); diff --git a/src/app/features/ledger/hooks/use-ledger-analytics.hook.ts b/src/app/features/ledger/hooks/use-ledger-analytics.hook.ts index 5943c8a5e19..fd50a12e94a 100644 --- a/src/app/features/ledger/hooks/use-ledger-analytics.hook.ts +++ b/src/app/features/ledger/hooks/use-ledger-analytics.hook.ts @@ -2,13 +2,11 @@ import { useMemo } from 'react'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { getStacksAppVersion } from '../utils/stacks-ledger-utils'; - export function useLedgerAnalytics() { const analytics = useAnalytics(); return useMemo( () => ({ - trackDeviceVersionInfo(info: Awaited>) { + trackDeviceVersionInfo(info: object) { void analytics.track('ledger_app_version_info', info); }, transactionSignedOnLedgerSuccessfully() { diff --git a/src/app/features/ledger/hooks/use-ledger-navigate.ts b/src/app/features/ledger/hooks/use-ledger-navigate.ts index 44f74da7709..605e27f6ff8 100644 --- a/src/app/features/ledger/hooks/use-ledger-navigate.ts +++ b/src/app/features/ledger/hooks/use-ledger-navigate.ts @@ -22,7 +22,7 @@ export function useLedgerNavigate() { }); }, - toConnectAndSignTransactionStep(transaction: StacksTransaction) { + toConnectAndSignStacksTransactionStep(transaction: StacksTransaction) { return navigate(RouteUrls.ConnectLedger, { replace: true, relative: 'path', @@ -30,6 +30,14 @@ export function useLedgerNavigate() { }); }, + toConnectAndSignBitcoinTransactionStep(psbt: Uint8Array, inputsToSign?: number[]) { + return navigate(RouteUrls.ConnectLedger, { + replace: true, + relative: 'route', + state: { tx: bytesToHex(psbt), inputsToSign }, + }); + }, + toConnectAndSignUtf8MessageStep(message: string) { return navigate(RouteUrls.ConnectLedger, { replace: true, diff --git a/src/app/features/ledger/illustrations/ledger-illu-success.tsx b/src/app/features/ledger/illustrations/ledger-illu-success.tsx index 68582eb0628..c36f966bb88 100644 --- a/src/app/features/ledger/illustrations/ledger-illu-success.tsx +++ b/src/app/features/ledger/illustrations/ledger-illu-success.tsx @@ -7,7 +7,7 @@ export function ConnectLedgerSuccess() { fill="none" xmlns="http://www.w3.org/2000/svg" > - + - + psbt.updateInput(index, { partialSig: [signature] })); +} + +export function addTaprootInputSignaturesToPsbt( + psbt: Psbt, + signatures: [number, PartialSignature][] +) { + signatures.forEach(([index, signature]) => + psbt.updateInput(index, { tapKeySig: signature.signature }) + ); +} diff --git a/src/app/features/ledger/utils/generic-ledger-utils.ts b/src/app/features/ledger/utils/generic-ledger-utils.ts index deb70b0a119..6643b3a2fa5 100644 --- a/src/app/features/ledger/utils/generic-ledger-utils.ts +++ b/src/app/features/ledger/utils/generic-ledger-utils.ts @@ -1,10 +1,9 @@ import { useState } from 'react'; -import { safeAwait } from '@stacks/ui'; - import { delay } from '@app/common/utils'; +import { safeAwait } from '@app/common/utils/safe-await'; -import { LedgerTxSigningContext } from '../flows/stacks-tx-signing/ledger-sign-tx.context'; +import { LedgerTxSigningContext } from '../generic-flows/tx-signing/ledger-sign-tx.context'; import { getStacksAppVersion } from './stacks-ledger-utils'; export interface BaseLedgerOperationContext { diff --git a/src/app/features/ledger/utils/stacks-ledger-utils.ts b/src/app/features/ledger/utils/stacks-ledger-utils.ts index 4ddf2a9af8c..b4b50cef1be 100644 --- a/src/app/features/ledger/utils/stacks-ledger-utils.ts +++ b/src/app/features/ledger/utils/stacks-ledger-utils.ts @@ -54,22 +54,22 @@ export const prepareLedgerDeviceStacksAppConnection = prepareLedgerDeviceForAppF // Casting type here as factory function reads it was a double Promise ) as (args: PrepareLedgerDeviceConnectionArgs) => Promise; -export function signLedgerTransaction(app: StacksApp) { +export function signLedgerStacksTransaction(app: StacksApp) { return async (payload: Buffer, accountIndex: number) => app.sign(stxDerivationWithAccount.replace('{account}', accountIndex.toString()), payload); } -export function signLedgerUtf8Message(app: StacksApp) { +export function signLedgerStacksUtf8Message(app: StacksApp) { return async (payload: string, accountIndex: number): Promise => app.sign_msg(getStxDerivationPath(accountIndex), payload); } -export function signLedgerStructuredMessage(app: StacksApp) { +export function signLedgerStacksStructuredMessage(app: StacksApp) { return async (domain: string, payload: string, accountIndex: number): Promise => app.sign_structured_msg(getStxDerivationPath(accountIndex), domain, payload); } -export function signTransactionWithSignature(transaction: string, signatureVRS: Buffer) { +export function signStacksTransactionWithSignature(transaction: string, signatureVRS: Buffer) { const deserialzedTx = deserializeTransaction(transaction); const spendingCondition = createMessageSignature(signatureVRS.toString('hex')); (deserialzedTx.auth.spendingCondition as SingleSigSpendingCondition).signature = diff --git a/src/app/features/message-signer/hash-drawer.tsx b/src/app/features/message-signer/hash-drawer.tsx index 2eeabe42fc9..33eb5ba7d62 100644 --- a/src/app/features/message-signer/hash-drawer.tsx +++ b/src/app/features/message-signer/hash-drawer.tsx @@ -1,11 +1,9 @@ import { useState } from 'react'; -import { Flex } from '@stacks/ui'; import { Box, styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; -import { ChevronDownIcon } from '@app/components/icons/chevron-down-icon'; -import { ChevronUpIcon } from '@app/components/icons/chevron-up-icon'; +import { ChevronDownIcon } from '@app/ui/components/icons/chevron-down-icon'; +import { ChevronUpIcon } from '@app/ui/components/icons/chevron-up-icon'; interface ShowHashButtonProps { expanded: boolean; @@ -24,30 +22,30 @@ export function HashDrawer(props: HashDrawerProps) { const [displayHash, setDisplayHash] = useState(hash); return ( - { setDisplayHash(showHash ? '' : hash); setShowHash(!showHash); }} + type="button" + width="100%" > {showHash ? 'Hide hash' : 'Show hash'} - + - + {message.split(/\r?\n/).map(line => ( diff --git a/src/app/features/message-signer/message-signing-header.tsx b/src/app/features/message-signer/message-signing-header.tsx index 09c91f0e4df..570a71f8ced 100644 --- a/src/app/features/message-signer/message-signing-header.tsx +++ b/src/app/features/message-signer/message-signing-header.tsx @@ -32,7 +32,7 @@ export function MessageSigningHeader({ Sign message {caption && ( - } pl="tight"> + } pl="space.02"> {caption} {additionalText} diff --git a/src/app/features/message-signer/stacks-sign-message-action.tsx b/src/app/features/message-signer/stacks-sign-message-action.tsx index 034bf320af7..57012272e54 100644 --- a/src/app/features/message-signer/stacks-sign-message-action.tsx +++ b/src/app/features/message-signer/stacks-sign-message-action.tsx @@ -1,7 +1,7 @@ import { HStack } from 'leather-styles/jsx'; import { useWalletType } from '@app/common/use-wallet-type'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface StacksSignMessageActionsProps { onSignMessage(): void; diff --git a/src/app/features/pending-brc-20-transfers/pending-brc-20-transfers.tsx b/src/app/features/pending-brc-20-transfers/pending-brc-20-transfers.tsx index 7fc899ed8f7..89c75481eb9 100644 --- a/src/app/features/pending-brc-20-transfers/pending-brc-20-transfers.tsx +++ b/src/app/features/pending-brc-20-transfers/pending-brc-20-transfers.tsx @@ -1,6 +1,6 @@ import { useNavigate } from 'react-router-dom'; -import { Box, Flex, Stack, Text } from '@stacks/ui'; +import { Box, Flex, HStack, Stack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { noop } from '@shared/utils'; @@ -11,7 +11,6 @@ import { Flag } from '@app/components/layout/flag'; import { StatusPending } from '@app/components/status-pending'; import { StatusReady } from '@app/components/status-ready'; import { Tooltip } from '@app/components/tooltip'; -import { Caption } from '@app/components/typography'; import { useNativeSegwitBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; import { useCheckOrderStatuses } from '@app/query/bitcoin/ordinals/brc20/use-check-order-status'; import { fetchInscripionById } from '@app/query/bitcoin/ordinals/inscription-by-id.query'; @@ -23,6 +22,7 @@ import { PendingBrc20Transfer, usePendingBrc20Transfers, } from '@app/store/ordinals/ordinals.slice'; +import { Caption } from '@app/ui/components/typography/caption'; function StatusIcon({ status }: { status: OrdinalsbotInscriptionStatus }) { switch (status) { @@ -45,17 +45,17 @@ function StatusLabel({ status }: { status: OrdinalsbotInscriptionStatus }) { case 'paid': return ( - Creating transfer inscription… + <>Creating transfer inscription… ); case 'waiting-for-indexer': return ( - Receiving transfer inscription… + <>Receiving transfer inscription… ); case 'ready': - return Ready to transfer; + return <>Ready to transfer; default: return null; } @@ -71,11 +71,11 @@ export function PendingBrc20TransferList() { if (!transferOrders.length) return null; return ( - + Pending BRC-20 transfers - + {transferOrders.map(order => ( ))} @@ -100,7 +100,7 @@ function PendingBrcTransfer({ order }: PendingBrcTransferProps) { return ( - + <> {order.amount} {order.tick} - - + + - + } > - + {component} ); diff --git a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-list/components/psbt-input-item.tsx b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-list/components/psbt-input-item.tsx index bb11d204acf..2709de06da4 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-list/components/psbt-input-item.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-list/components/psbt-input-item.tsx @@ -1,10 +1,9 @@ -import { truncateMiddle } from '@stacks/ui-utils'; - import { createMoney } from '@shared/models/money.model'; import { formatMoney } from '@app/common/money/format-money'; import { Pill } from '@app/components/pill'; import { PsbtInput } from '@app/features/psbt-signer/hooks/use-parsed-inputs'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { PsbtInputOutputItemLayout } from '../../psbt-input-output-item.layout'; diff --git a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-output-item.layout.tsx b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-output-item.layout.tsx index 8e74243b475..e6a04b7a4ce 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-output-item.layout.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-input-output-item.layout.tsx @@ -2,10 +2,10 @@ import { Box, Flex, HStack, styled } from 'leather-styles/jsx'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; -import { LeatherButton } from '@app/components/button/button'; -import { CopyIcon } from '@app/components/icons/copy-icon'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; +import { LeatherButton } from '@app/ui/components/button'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; interface PsbtInputOutputItemLayoutProps { address: string; @@ -27,7 +27,7 @@ export function PsbtInputOutputItemLayout({ const { handleOpenTxLink } = useExplorerLink(); return ( - } mt="loose" spacing="base"> + } mt="space.05" spacing="space.04"> @@ -57,7 +57,7 @@ export function PsbtInputOutputItemLayout({ onClick={() => handleOpenTxLink({ blockchain: 'bitcoin', - txId: txIdHoverLabel ?? '', + txid: txIdHoverLabel ?? '', }) } variant="text" diff --git a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-output-list/components/psbt-output-item.tsx b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-output-list/components/psbt-output-item.tsx index 744f0d36925..e8ddb099cb4 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-output-list/components/psbt-output-item.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-and-outputs/components/psbt-output-list/components/psbt-output-item.tsx @@ -1,10 +1,9 @@ -import { truncateMiddle } from '@stacks/ui-utils'; - import { createMoney } from '@shared/models/money.model'; import { formatMoney } from '@app/common/money/format-money'; import { Pill } from '@app/components/pill'; import { PsbtOutput } from '@app/features/psbt-signer/hooks/use-parsed-outputs'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { PsbtInputOutputItemLayout } from '../../psbt-input-output-item.layout'; diff --git a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-receive-totals.tsx b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-receive-totals.tsx index 09933f8365f..88d5ac0dea3 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-receive-totals.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-receive-totals.tsx @@ -1,9 +1,8 @@ -import { truncateMiddle } from '@stacks/ui-utils'; - import { formatMoney, i18nFormatCurrency } from '@app/common/money/format-money'; import { removeMinusSign } from '@app/common/utils'; import { usePsbtSignerContext } from '@app/features/psbt-signer/psbt-signer.context'; import { useCalculateBitcoinFiatValue } from '@app/query/common/market-data/market-data.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { PsbtAddressTotalItem } from './psbt-address-total-item'; import { PsbtInscription } from './psbt-inscription'; diff --git a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-total-item.tsx b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-total-item.tsx index 3d4858f84a5..0669543c04e 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-total-item.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-total-item.tsx @@ -1,11 +1,11 @@ import { Box, HStack, styled } from 'leather-styles/jsx'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; -import { LeatherButton } from '@app/components/button/button'; -import { BtcIcon } from '@app/components/icons/btc-icon'; -import { CopyIcon } from '@app/components/icons/copy-icon'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; +import { LeatherButton } from '@app/ui/components/button'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; interface PsbtAddressTotalItemProps { hoverLabel?: string; @@ -28,7 +28,7 @@ export function PsbtAddressTotalItem({ const { onCopy, hasCopied } = useClipboard(hoverLabel ?? ''); return ( - } mt="loose" spacing="base"> + } mt="space.05" spacing="space.04"> {title ? title : 'Bitcoin'} {valueAction ? ( diff --git a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-transfer-totals.tsx b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-transfer-totals.tsx index 430e1a050db..66314965e76 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-transfer-totals.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-address-transfer-totals.tsx @@ -1,8 +1,7 @@ -import { truncateMiddle } from '@stacks/ui-utils'; - import { formatMoney, i18nFormatCurrency } from '@app/common/money/format-money'; import { usePsbtSignerContext } from '@app/features/psbt-signer/psbt-signer.context'; import { useCalculateBitcoinFiatValue } from '@app/query/common/market-data/market-data.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { PsbtAddressTotalItem } from './psbt-address-total-item'; import { PsbtInscription } from './psbt-inscription'; diff --git a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-inscription.tsx b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-inscription.tsx index 7c2027aa272..5c5f59428e3 100644 --- a/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-inscription.tsx +++ b/src/app/features/psbt-signer/components/psbt-inputs-outputs-totals/components/psbt-inscription.tsx @@ -2,12 +2,12 @@ import { Inscription } from '@shared/models/inscription.model'; import { isUndefined } from '@shared/utils'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { OrdinalIcon } from '@app/components/icons/ordinal-icon'; import { InscriptionPreview } from '@app/components/inscription-preview-card/components/inscription-preview'; import { createInscriptionInfoUrl, useInscription, } from '@app/query/bitcoin/ordinals/inscription.hooks'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; import { PsbtAddressTotalItem } from './psbt-address-total-item'; diff --git a/src/app/features/psbt-signer/components/psbt-request-actions.tsx b/src/app/features/psbt-signer/components/psbt-request-actions.tsx index 5c127793a72..8a314ebf5ba 100644 --- a/src/app/features/psbt-signer/components/psbt-request-actions.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-actions.tsx @@ -1,7 +1,6 @@ -import { Box, color } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { Box, HStack } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface PsbtRequestActionsProps { isLoading?: boolean; @@ -11,12 +10,12 @@ interface PsbtRequestActionsProps { export function PsbtRequestActions({ isLoading, onCancel, onSignPsbt }: PsbtRequestActionsProps) { return ( diff --git a/src/app/features/psbt-signer/components/psbt-request-details-header.tsx b/src/app/features/psbt-signer/components/psbt-request-details-header.tsx index 691f8230f5f..9132c34c33c 100644 --- a/src/app/features/psbt-signer/components/psbt-request-details-header.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-details-header.tsx @@ -1,11 +1,10 @@ -import { Box, Stack } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; +import { Box, HStack, styled } from 'leather-styles/jsx'; import { token } from 'leather-styles/tokens'; -import { LockIcon } from '@app/components/icons/lock-icon'; -import { UnlockIcon } from '@app/components/icons/unlock-icon'; import { Tooltip } from '@app/components/tooltip'; import { usePsbtSignerContext } from '@app/features/psbt-signer/psbt-signer.context'; +import { LockIcon } from '@app/ui/components/icons/lock-icon'; +import { UnlockIcon } from '@app/ui/components/icons/unlock-icon'; const immutableLabel = 'Any modification to the transaction, including the fee amount or other inputs/outputs, will invalidate the signature.'; @@ -14,38 +13,41 @@ const uncertainLabel = export function PsbtRequestDetailsHeader() { const { isPsbtMutable } = usePsbtSignerContext(); - const labelColor = isPsbtMutable ? token('colors.error') : token('colors.accent.text-subdued'); + const tokenLabelColor = isPsbtMutable + ? token('colors.warning.label') + : token('colors.accent.text-subdued'); return ( - + Transaction - - + {isPsbtMutable ? ( - + ) : ( - + )} - + {isPsbtMutable ? 'Uncertain' : 'Certain'} - + - + ); } diff --git a/src/app/features/psbt-signer/components/psbt-request-details-section-header.tsx b/src/app/features/psbt-signer/components/psbt-request-details-section-header.tsx index a542617a9db..9d578a39f66 100644 --- a/src/app/features/psbt-signer/components/psbt-request-details-section-header.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-details-section-header.tsx @@ -1,7 +1,7 @@ import { HStack, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { ArrowUpIcon } from '@app/components/icons/arrow-up-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; interface PsbtRequestDetailsSectionHeaderProps { hasDetails?: boolean; diff --git a/src/app/features/psbt-signer/components/psbt-request-details-section.layout.tsx b/src/app/features/psbt-signer/components/psbt-request-details-section.layout.tsx index e9e5a7299a6..8de37340302 100644 --- a/src/app/features/psbt-signer/components/psbt-request-details-section.layout.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-details-section.layout.tsx @@ -4,7 +4,7 @@ import { HasChildren } from '@app/common/has-children'; export function PsbtRequestDetailsSectionLayout({ children, ...props }: HasChildren & StackProps) { return ( - + {children} ); diff --git a/src/app/features/psbt-signer/components/psbt-request-header.tsx b/src/app/features/psbt-signer/components/psbt-request-header.tsx index 4b9151e078f..78bb0230f8b 100644 --- a/src/app/features/psbt-signer/components/psbt-request-header.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-header.tsx @@ -23,7 +23,7 @@ export function PsbtRequestHeader({ name, origin }: PsbtRequestHeaderProps) { transactions you fully understand. {caption && ( - } pl="tight"> + } pl="space.02"> {caption} diff --git a/src/app/features/psbt-signer/components/psbt-request-sighash-warning-label.tsx b/src/app/features/psbt-signer/components/psbt-request-sighash-warning-label.tsx index e56feb2effb..8d5ebb2bebc 100644 --- a/src/app/features/psbt-signer/components/psbt-request-sighash-warning-label.tsx +++ b/src/app/features/psbt-signer/components/psbt-request-sighash-warning-label.tsx @@ -1,6 +1,5 @@ -import { Text } from '@stacks/ui'; - import { WarningLabel } from '@app/components/warning-label'; +import { LeatherButton } from '@app/ui/components/button'; export function PsbtRequestSighashWarningLabel() { return ( @@ -8,9 +7,10 @@ export function PsbtRequestSighashWarningLabel() { The details you see here are not guaranteed. Be sure to fully trust your counterparty, who can later modify this transaction to send or receive other assets from your account, and possibly even drain it. - - Learn more↗ - + {/* TODO: Link for this? */} + + Learn more ↗ + ); } diff --git a/src/app/features/psbt-signer/components/psbt-signer.layout.tsx b/src/app/features/psbt-signer/components/psbt-signer.layout.tsx index 8093d7a3a11..1016de2b254 100644 --- a/src/app/features/psbt-signer/components/psbt-signer.layout.tsx +++ b/src/app/features/psbt-signer/components/psbt-signer.layout.tsx @@ -9,8 +9,8 @@ export function PsbtSignerLayout({ children }: HasChildren) { maxHeight="calc(100vh - 72px)" overflowY="auto" pb="120px" - px="loose" - gap="base-loose" + px="space.05" + gap="space.04" width="100%" > {children} diff --git a/src/app/features/psbt-signer/hooks/use-parsed-inputs.tsx b/src/app/features/psbt-signer/hooks/use-parsed-inputs.tsx index a8e89101f78..eb669674968 100644 --- a/src/app/features/psbt-signer/hooks/use-parsed-inputs.tsx +++ b/src/app/features/psbt-signer/hooks/use-parsed-inputs.tsx @@ -3,11 +3,8 @@ import { useMemo } from 'react'; import * as btc from '@scure/btc-signer'; import { bytesToHex } from '@stacks/common'; -import { - BtcSignerNetwork, - getBtcSignerLibNetworkConfigByMode, -} from '@shared/crypto/bitcoin/bitcoin.network'; -import { getAddressFromOutScript } from '@shared/crypto/bitcoin/bitcoin.utils'; +import { getBtcSignerLibNetworkConfigByMode } from '@shared/crypto/bitcoin/bitcoin.network'; +import { getBitcoinInputAddress, getBitcoinInputValue } from '@shared/crypto/bitcoin/bitcoin.utils'; import { Inscription } from '@shared/models/inscription.model'; import { isDefined, isUndefined } from '@shared/utils'; @@ -26,31 +23,13 @@ export interface PsbtInput { value: number; } -function getInputAddress( - index: number, - input: btc.TransactionInput, - bitcoinNetwork: BtcSignerNetwork -) { - if (isDefined(input.witnessUtxo)) - return getAddressFromOutScript(input.witnessUtxo.script, bitcoinNetwork); - if (isDefined(input.nonWitnessUtxo)) - return getAddressFromOutScript(input.nonWitnessUtxo.outputs[index]?.script, bitcoinNetwork); - return ''; -} - -function getInputValue(index: number, input: btc.TransactionInput) { - if (isDefined(input.witnessUtxo)) return Number(input.witnessUtxo.amount); - if (isDefined(input.nonWitnessUtxo)) return Number(input.nonWitnessUtxo.outputs[index]?.amount); - return 0; -} - interface UseParsedInputsArgs { inputs: btc.TransactionInput[]; indexesToSign?: number[]; } export function useParsedInputs({ inputs, indexesToSign }: UseParsedInputsArgs) { const network = useCurrentNetwork(); - const bitcoinNetwork = getBtcSignerLibNetworkConfigByMode(network.chain.bitcoin.network); + const bitcoinNetwork = getBtcSignerLibNetworkConfigByMode(network.chain.bitcoin.bitcoinNetwork); const bitcoinAddressNativeSegwit = useCurrentAccountNativeSegwitIndexZeroSigner().address; const { address: bitcoinAddressTaproot } = useCurrentAccountTaprootIndexZeroSigner(); const inscriptions = useGetInscriptionsByOutputQueries(inputs).map(query => { @@ -62,7 +41,7 @@ export function useParsedInputs({ inputs, indexesToSign }: UseParsedInputsArgs) () => inputs.map((input, i) => { const inputAddress = isDefined(input.index) - ? getInputAddress(input.index, input, bitcoinNetwork) + ? getBitcoinInputAddress(input.index, input, bitcoinNetwork) : ''; const isCurrentAddress = inputAddress === bitcoinAddressNativeSegwit || inputAddress === bitcoinAddressTaproot; @@ -81,7 +60,7 @@ export function useParsedInputs({ inputs, indexesToSign }: UseParsedInputsArgs) isMutable: canChange, toSign: toSignAll || toSignIndex, txid: input.txid ? bytesToHex(input.txid) : '', - value: isDefined(input.index) ? getInputValue(input.index, input) : 0, + value: isDefined(input.index) ? getBitcoinInputValue(input.index, input) : 0, }; }), [ diff --git a/src/app/features/psbt-signer/hooks/use-parsed-outputs.tsx b/src/app/features/psbt-signer/hooks/use-parsed-outputs.tsx index feb2c695f26..7f47a05ecb4 100644 --- a/src/app/features/psbt-signer/hooks/use-parsed-outputs.tsx +++ b/src/app/features/psbt-signer/hooks/use-parsed-outputs.tsx @@ -26,7 +26,7 @@ interface UseParsedOutputsArgs { export function useParsedOutputs({ isPsbtMutable, outputs, network }: UseParsedOutputsArgs) { const bitcoinAddressNativeSegwit = useCurrentAccountNativeSegwitIndexZeroSigner().address; const { address: bitcoinAddressTaproot } = useCurrentAccountTaprootIndexZeroSigner(); - const bitcoinNetwork = getBtcSignerLibNetworkConfigByMode(network.chain.bitcoin.network); + const bitcoinNetwork = getBtcSignerLibNetworkConfigByMode(network.chain.bitcoin.bitcoinNetwork); return useMemo( () => diff --git a/src/app/features/psbt-signer/hooks/use-psbt-signer.tsx b/src/app/features/psbt-signer/hooks/use-psbt-signer.tsx index cea022001bb..edf27070016 100644 --- a/src/app/features/psbt-signer/hooks/use-psbt-signer.tsx +++ b/src/app/features/psbt-signer/hooks/use-psbt-signer.tsx @@ -4,54 +4,28 @@ import { hexToBytes } from '@noble/hashes/utils'; import * as btc from '@scure/btc-signer'; import { logger } from '@shared/logger'; -import { allSighashTypes } from '@shared/rpc/methods/sign-psbt'; -import { isString, isUndefined } from '@shared/utils'; +import { isString } from '@shared/utils'; -import { useCurrentAccountNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; -import { useCurrentAccountTaprootSigner } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; +import { + useAddTapInternalKeysIfMissing, + useSignBitcoinTx, +} from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; export type RawPsbt = ReturnType; interface SignPsbtArgs { - inputs: btc.TransactionInput[]; indexesToSign?: number[]; tx: btc.Transaction; } - export function usePsbtSigner() { - const createNativeSegwitSigner = useCurrentAccountNativeSegwitSigner(); - const createTaprootSigner = useCurrentAccountTaprootSigner(); - - const nativeSegwitSigner = createNativeSegwitSigner?.(0); - const taprootSigner = createTaprootSigner?.(0); + const addMissingTapInteralKeys = useAddTapInternalKeysIfMissing(); + const signBitcoinTx = useSignBitcoinTx(); return useMemo( () => ({ - signPsbt({ inputs, indexesToSign, tx }: SignPsbtArgs) { - inputs.forEach((input, idx) => { - const isSigning = isUndefined(indexesToSign) || indexesToSign.includes(idx); - - if (!isSigning) return; - - const witnessOutputScript = - input.witnessUtxo?.script && btc.OutScript.decode(input.witnessUtxo.script); - - // If type taproot, and the tapInternalKey is missing, assume it should - // be the account publicKey - if (taprootSigner && witnessOutputScript?.type === 'tr' && !input.tapInternalKey) { - tx.updateInput(idx, { ...input, tapInternalKey: taprootSigner.payment.tapInternalKey }); - } - - try { - nativeSegwitSigner?.signIndex(tx, idx, allSighashTypes); - } catch (e1) { - try { - taprootSigner?.signIndex(tx, idx, allSighashTypes); - } catch (e2) { - throw new Error(`Unable to sign PSBT at index, ${e1 ?? e2}`); - } - } - }); + async signPsbt({ indexesToSign, tx }: SignPsbtArgs) { + addMissingTapInteralKeys(tx, indexesToSign); + return signBitcoinTx(tx.toPSBT(), indexesToSign); }, getPsbtAsTransaction(psbt: string | Uint8Array) { const bytes = isString(psbt) ? hexToBytes(psbt) : psbt; @@ -71,6 +45,6 @@ export function usePsbtSigner() { } }, }), - [nativeSegwitSigner, taprootSigner] + [addMissingTapInteralKeys, signBitcoinTx] ); } diff --git a/src/app/features/psbt-signer/psbt-signer.tsx b/src/app/features/psbt-signer/psbt-signer.tsx index 434d39aa700..d1d53249425 100644 --- a/src/app/features/psbt-signer/psbt-signer.tsx +++ b/src/app/features/psbt-signer/psbt-signer.tsx @@ -1,8 +1,7 @@ import { useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; -import * as btc from '@scure/btc-signer'; - +import { getPsbtTxInputs, getPsbtTxOutputs } from '@shared/crypto/bitcoin/bitcoin.utils'; import { RouteUrls } from '@shared/route-urls'; import { closeWindow } from '@shared/utils'; @@ -27,26 +26,6 @@ import { useParsedPsbt } from './hooks/use-parsed-psbt'; import { usePsbtSigner } from './hooks/use-psbt-signer'; import { PsbtSignerContext, PsbtSignerProvider } from './psbt-signer.context'; -function getPsbtTxInputs(psbtTx: btc.Transaction) { - const inputsLength = psbtTx.inputsLength; - const inputs: btc.TransactionInput[] = []; - if (inputsLength === 0) return inputs; - for (let i = 0; i < inputsLength; i++) { - inputs.push(psbtTx.getInput(i)); - } - return inputs; -} - -function getPsbtTxOutputs(psbtTx: btc.Transaction) { - const outputsLength = psbtTx.outputsLength; - const outputs: btc.TransactionOutput[] = []; - if (outputsLength === 0) return outputs; - for (let i = 0; i < outputsLength; i++) { - outputs.push(psbtTx.getOutput(i)); - } - return outputs; -} - interface PsbtSignerProps { indexesToSign?: number[]; isBroadcasting?: boolean; diff --git a/src/app/features/retrieve-taproot-to-native-segwit/components/retrieve-taproot-to-native-segwit.layout.tsx b/src/app/features/retrieve-taproot-to-native-segwit/components/retrieve-taproot-to-native-segwit.layout.tsx index ad8bed62fd9..e7a901a13bd 100644 --- a/src/app/features/retrieve-taproot-to-native-segwit/components/retrieve-taproot-to-native-segwit.layout.tsx +++ b/src/app/features/retrieve-taproot-to-native-segwit/components/retrieve-taproot-to-native-segwit.layout.tsx @@ -1,10 +1,9 @@ -import { Flex } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; -import { BtcIcon } from '@app/components/icons/btc-icon'; -import { Body, Title } from '@app/components/typography'; import { WarningLabel } from '@app/components/warning-label'; +import { LeatherButton } from '@app/ui/components/button'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; interface RetrieveTaprootToNativeSegwitLayoutProps { isBroadcasting: boolean; @@ -12,29 +11,30 @@ interface RetrieveTaprootToNativeSegwitLayoutProps { onClose(): void; onApproveTransaction(): void; } - export function RetrieveTaprootToNativeSegwitLayout( props: RetrieveTaprootToNativeSegwitLayoutProps ) { const { onClose, onApproveTransaction, isBroadcasting, children } = props; return ( onClose()}> - + - + <styled.span mt="space.04" textStyle="label.01"> Retrieve Bitcoin deposited to <br /> Taproot addresses - - + + Taproot addresses are used by Leather for Ordinal inscriptions, but they can also contain bitcoin. - - + + As we don't support tranferring from Taproot addresses yet, you can retrieve funds to your account's main Native SegWit balance here. - - This transaction may take upwards of 30 minutes to confirm. + + + This transaction may take upwards of 30 minutes to confirm. + {children} - + We recommend you check the URL for each "Uninscribed UTXO" listed above to ensure it displays no inscription. If it does display one, do not proceed with retrieval or you may lose it! @@ -43,7 +43,7 @@ export function RetrieveTaprootToNativeSegwitLayout( onClick={onApproveTransaction} aria-busy={isBroadcasting} width="100%" - my="loose" + my="space.05" > Retrieve bitcoin diff --git a/src/app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit.tsx b/src/app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit.tsx index 51a844fe102..0b30c95d8c5 100644 --- a/src/app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit.tsx +++ b/src/app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit.tsx @@ -1,8 +1,7 @@ import toast from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; +import { Stack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; @@ -18,6 +17,7 @@ import { } from '@app/query/bitcoin/balance/btc-taproot-balance.hooks'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { RetrieveTaprootToNativeSegwitLayout } from './components/retrieve-taproot-to-native-segwit.layout'; import { useGenerateRetrieveTaprootFundsTx } from './use-generate-retrieve-taproot-funds-tx'; @@ -54,7 +54,7 @@ export function RetrieveTaprootToNativeSegwit() { onApproveTransaction={handleBroadcastRetieveBitcoinTx} onClose={() => navigate(RouteUrls.Home)} > - + } /> diff --git a/src/app/features/secret-key-displayer/components/secret-key-word.tsx b/src/app/features/secret-key-displayer/components/secret-key-word.tsx index 08966613c0d..92641996886 100644 --- a/src/app/features/secret-key-displayer/components/secret-key-word.tsx +++ b/src/app/features/secret-key-displayer/components/secret-key-word.tsx @@ -13,7 +13,7 @@ export function SecretKeyWord({ word, num }: SecretKeyWordProps) { gap="space.01" px="space.03" backgroundColor="accent.component-background-default" - borderRadius="8px" + borderRadius="xs" > {/* FIXME #4130: need to fix this color color: var(--color-grey-light-8, #BBB); */} diff --git a/src/app/features/secret-key-displayer/secret-key-displayer.layout.tsx b/src/app/features/secret-key-displayer/secret-key-displayer.layout.tsx index cbfa7f92052..ef77237b23f 100644 --- a/src/app/features/secret-key-displayer/secret-key-displayer.layout.tsx +++ b/src/app/features/secret-key-displayer/secret-key-displayer.layout.tsx @@ -1,12 +1,13 @@ import { useState } from 'react'; -import { FiEye, FiEyeOff } from 'react-icons/fi'; import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { Flex, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { CopyIcon } from '@app/components/icons/copy-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { EyeIcon } from '@app/ui/components/icons/eye-icon'; +import { EyeSlashIcon } from '@app/ui/components/icons/eye-slash-icon'; import { SecretKeyGrid } from '../../components/secret-key/secret-key-grid'; import { SecretKeyWord } from './components/secret-key-word'; @@ -46,7 +47,7 @@ export function SecretKeyDisplayerLayout(props: SecretKeyDisplayerLayoutProps) { data-testid={SettingsSelectors.ShowSecretKeyBtn} onClick={() => setShowSecretKey(!showSecretKey)} > - {showSecretKey ? : } + {showSecretKey ? : } {showSecretKey ? 'Hide key' : 'Show key'} Copy diagnostics to clipboard - + Contains private wallet usage activity @@ -57,7 +57,7 @@ export function AdvancedMenuItems({ closeHandler, settingsShown }: AdvancedMenuI })} > Clear diagnostic information - + {diagnosticLogText} diff --git a/src/app/features/settings-dropdown/components/ledger-item-row.tsx b/src/app/features/settings-dropdown/components/ledger-item-row.tsx index 22903831681..c5b61940fb2 100644 --- a/src/app/features/settings-dropdown/components/ledger-item-row.tsx +++ b/src/app/features/settings-dropdown/components/ledger-item-row.tsx @@ -1,7 +1,7 @@ -import { Flex, Text, color } from '@stacks/ui'; +import { Flex, styled } from 'leather-styles/jsx'; -import { WalletTypeLedgerIcon } from '@app/components/icons/wallet-type-ledger-icon'; import { Divider } from '@app/components/layout/divider'; +import { WalletTypeLedgerIcon } from '@app/ui/components/icons/wallet-type-ledger-icon'; interface LedgerDeviceItemRowProps { deviceType?: string; @@ -9,11 +9,9 @@ interface LedgerDeviceItemRowProps { export function LedgerDeviceItemRow({ deviceType }: LedgerDeviceItemRowProps) { return ( <> - - - - Ledger {deviceType ?? ''} - + + + Ledger {deviceType ?? ''} diff --git a/src/app/features/settings-dropdown/components/settings-menu-item.tsx b/src/app/features/settings-dropdown/components/settings-menu-item.tsx index 8f1f9215d70..25a35acee49 100644 --- a/src/app/features/settings-dropdown/components/settings-menu-item.tsx +++ b/src/app/features/settings-dropdown/components/settings-menu-item.tsx @@ -1,25 +1,29 @@ -import { memo } from 'react'; +import { ReactNode } from 'react'; -import { BoxProps, Text, color } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { ButtonProps, LeatherButton } from '@app/ui/components/button'; -export const SettingsMenuItem = memo((props: BoxProps) => { - const { onClick, children, ...rest } = props; +interface SettingsMenuItemProps extends ButtonProps { + color?: string; + onClick: (e: React.MouseEvent) => void; + children: ReactNode; +} +export function SettingsMenuItem({ color, onClick, children, ...props }: SettingsMenuItemProps) { return ( - { onClick?.(e); }} - fontSize={1} - {...rest} + textStyle="label.02" + variant="text" + width="100%" + {...props} > {children} - + ); -}); +} diff --git a/src/app/features/settings-dropdown/components/settings-menu-wrapper.tsx b/src/app/features/settings-dropdown/components/settings-menu-wrapper.tsx index 134edfa830e..1337b3154c7 100644 --- a/src/app/features/settings-dropdown/components/settings-menu-wrapper.tsx +++ b/src/app/features/settings-dropdown/components/settings-menu-wrapper.tsx @@ -1,21 +1,27 @@ -import { Box, color } from '@stacks/ui'; -import { forwardRefWithAs } from '@stacks/ui-core'; +import { forwardRef } from 'react'; -export const MenuWrapper = forwardRefWithAs((props, ref) => ( - -)); +import { Box, BoxProps } from 'leather-styles/jsx'; + +interface MenuWrapperProps extends BoxProps { + isShowing: boolean; +} +export const MenuWrapper = forwardRef( + ({ isShowing, ...props }: MenuWrapperProps, ref) => + isShowing ? ( + + ) : null +); diff --git a/src/app/features/settings-dropdown/settings-dropdown.tsx b/src/app/features/settings-dropdown/settings-dropdown.tsx index d3a67ff1545..fedf84c5eae 100644 --- a/src/app/features/settings-dropdown/settings-dropdown.tsx +++ b/src/app/features/settings-dropdown/settings-dropdown.tsx @@ -1,9 +1,8 @@ import { useCallback, useRef } from 'react'; -import { FiExternalLink } from 'react-icons/fi'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Box, Flex, SlideFade, Stack, color } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; +import { Box, Flex, HStack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; @@ -16,10 +15,11 @@ import { useWalletType } from '@app/common/use-wallet-type'; import { whenPageMode } from '@app/common/utils'; import { openInNewTab, openIndexPageInNewTab } from '@app/common/utils/open-in-new-tab'; import { Divider } from '@app/components/layout/divider'; -import { Caption } from '@app/components/typography'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useHasLedgerKeys, useLedgerDeviceTargetId } from '@app/store/ledger/ledger.selectors'; import { useCurrentNetworkId } from '@app/store/networks/networks.selectors'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; +import { Caption } from '@app/ui/components/typography/caption'; import { extractDeviceNameFromKnownTargetIds } from '../ledger/utils/generic-ledger-utils'; import { AdvancedMenuItems } from './components/advanced-menu-items'; @@ -32,7 +32,7 @@ export function SettingsDropdown() { const hasGeneratedWallet = !!useCurrentStacksAccount(); const { lockWallet } = useKeyActions(); - const { setIsShowingSettings, isShowingSettings } = useDrawers(); + const { isShowingSettings, setIsShowingSettings } = useDrawers(); const currentNetworkId = useCurrentNetworkId(); const navigate = useNavigate(); const analytics = useAnalytics(); @@ -52,136 +52,128 @@ export function SettingsDropdown() { [handleClose] ); - const isShowing = isShowingSettings; const isLedger = useHasLedgerKeys(); - useOnClickOutside(ref, isShowing ? handleClose : null); + useOnClickOutside(ref, isShowingSettings ? handleClose : null); // RouteUrls.Activity is nested off / so we need to use a link relative to the route const linkRelativeType = location.pathname === `${RouteUrls.Home}${RouteUrls.Activity}` ? 'route' : 'path'; return ( - - {styles => ( - - {isLedger && targetId && ( - - )} - {hasGeneratedWallet && walletType === 'software' && ( - <> - { - navigate(RouteUrls.ViewSecretKey); - })} - > - View Secret Key - - - )} - { - void analytics.track('click_change_theme_menu_item'); - navigate(RouteUrls.ChangeTheme, { - relative: linkRelativeType, - state: { backgroundLocation: location }, - }); - })} - > - Change theme - - {whenPageMode({ - full: null, - popup: ( - { - void analytics.track('click_open_in_new_tab_menu_item'); - openIndexPageInNewTab(location.pathname); - }} - > - - Open in new tab - - - - ), - })} - { - void analytics.track('click_get_support_menu_item'); - openInNewTab('https://leather.gitbook.io/guides/installing/contact-support'); - })} - > - - Get support - - - + + {isLedger && targetId && ( + + )} + {hasGeneratedWallet && walletType === 'software' && ( + <> { - void analytics.track('click_request_feature_menu_item'); - openInNewTab('https://leather.canny.io/feature-requests'); + navigate(RouteUrls.ViewSecretKey); })} > - - Request feature - - + View Secret Key - {hasGeneratedWallet ? : null} + + )} + { + void analytics.track('click_change_theme_menu_item'); + navigate(RouteUrls.ChangeTheme, { + relative: linkRelativeType, + state: { backgroundLocation: location }, + }); + })} + > + Change theme + + {whenPageMode({ + full: null, + popup: ( { - void analytics.track('click_change_network_menu_item'); - navigate(RouteUrls.SelectNetwork, { - relative: linkRelativeType, - state: { backgroundLocation: location }, - }); - })} + data-testid={SettingsSelectors.OpenWalletInNewTab} + onClick={() => { + void analytics.track('click_open_in_new_tab_menu_item'); + openIndexPageInNewTab(location.pathname); + }} > - - Change network - {currentNetworkId} - + + Open in new tab + + + ), + })} + { + void analytics.track('click_get_support_menu_item'); + openInNewTab('https://leather.gitbook.io/guides/installing/contact-support'); + })} + > + + Get support + + + + { + void analytics.track('click_request_feature_menu_item'); + openInNewTab('https://leather.canny.io/feature-requests'); + })} + > + + Request feature + + + + {hasGeneratedWallet ? : null} + { + void analytics.track('click_change_network_menu_item'); + navigate(RouteUrls.SelectNetwork, { + relative: linkRelativeType, + state: { backgroundLocation: location }, + }); + })} + > + + Change network + {currentNetworkId} + + - - {showAdvancedMenuOptions && ( - - )} - {hasGeneratedWallet && walletType === 'software' && ( - { - void analytics.track('lock_session'); - void lockWallet(); - navigate(RouteUrls.Unlock); - })} - data-testid="settings-lock" - > - Lock - - )} - - navigate(RouteUrls.SignOutConfirm, { - relative: linkRelativeType, - state: { backgroundLocation: location }, - }) - )} - data-testid={SettingsSelectors.SignOutListItem} - > - Sign out - - + + {showAdvancedMenuOptions && ( + + )} + {hasGeneratedWallet && walletType === 'software' && ( + { + void analytics.track('lock_session'); + void lockWallet(); + navigate(RouteUrls.Unlock); + })} + data-testid="settings-lock" + > + Lock + )} - + + navigate(RouteUrls.SignOutConfirm, { + relative: linkRelativeType, + state: { backgroundLocation: location }, + }) + )} + data-testid={SettingsSelectors.SignOutListItem} + > + Sign out + + ); } diff --git a/src/app/features/stacks-transaction-request/contract-call-details/contract-call-details.tsx b/src/app/features/stacks-transaction-request/contract-call-details/contract-call-details.tsx index 4e834fe4595..a58c292c921 100644 --- a/src/app/features/stacks-transaction-request/contract-call-details/contract-call-details.tsx +++ b/src/app/features/stacks-transaction-request/contract-call-details/contract-call-details.tsx @@ -1,14 +1,13 @@ import { Suspense } from 'react'; -import { Stack, color } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; import { formatContractId } from '@app/common/utils'; -import { Divider } from '@app/components/layout/divider'; -import { Title } from '@app/components/typography'; import { AttachmentRow } from '@app/features/stacks-transaction-request/attachment-row'; import { ContractPreviewLayout } from '@app/features/stacks-transaction-request/contract-preview'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { Title } from '@app/ui/components/typography/title'; import { FunctionArgumentsList } from './function-arguments-list'; @@ -22,30 +21,28 @@ function ContractCallDetailsSuspense() { return ( - - Function and arguments - + Function and arguments handleOpenTxLink({ blockchain: 'stacks', - txId: formatContractId(contractAddress, contractName), + txid: formatContractId(contractAddress, contractName), }) } contractAddress={contractAddress} contractName={contractName} functionName={functionName} /> - } spacing="base"> + {attachment && } diff --git a/src/app/features/stacks-transaction-request/contract-call-details/function-arguments-list.tsx b/src/app/features/stacks-transaction-request/contract-call-details/function-arguments-list.tsx index 86dbbdddc44..50953f2384e 100644 --- a/src/app/features/stacks-transaction-request/contract-call-details/function-arguments-list.tsx +++ b/src/app/features/stacks-transaction-request/contract-call-details/function-arguments-list.tsx @@ -1,10 +1,9 @@ import { Suspense, memo } from 'react'; -import { Stack, StackProps } from '@stacks/ui'; +import { Stack, StackProps } from 'leather-styles/jsx'; -import { Divider } from '@app/components/layout/divider'; -import { Caption } from '@app/components/typography'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; import { FunctionArgumentItem } from './function-argument-item'; @@ -19,7 +18,7 @@ function FunctionArgumentsListBase(props: StackProps): React.JSX.Element | null return ( <> {hasArgs ? ( - } spacing="base" {...props}> + {transactionRequest.functionArgs.map((arg, index) => { return ( loading} key={`${arg}-${index}`}> diff --git a/src/app/features/stacks-transaction-request/contract-deploy-details/contract-deploy-details.tsx b/src/app/features/stacks-transaction-request/contract-deploy-details/contract-deploy-details.tsx index cbcedff33e0..c0140dacf5b 100644 --- a/src/app/features/stacks-transaction-request/contract-deploy-details/contract-deploy-details.tsx +++ b/src/app/features/stacks-transaction-request/contract-deploy-details/contract-deploy-details.tsx @@ -1,10 +1,8 @@ import { useState } from 'react'; -import { BoxProps, CodeBlock, Stack, color } from '@stacks/ui'; +import { HStack, HTMLStyledProps, Stack, styled } from 'leather-styles/jsx'; import { Prism } from '@app/common/clarity-prism'; -import { Divider } from '@app/components/layout/divider'; -import { Caption, Title } from '@app/components/typography'; import { AttachmentRow } from '@app/features/stacks-transaction-request/attachment-row'; import { ContractPreviewLayout } from '@app/features/stacks-transaction-request/contract-preview'; import { Row } from '@app/features/stacks-transaction-request/row'; @@ -13,6 +11,8 @@ import { useCurrentStacksAccount, } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { CodeBlock } from '@app/ui/components/codeblock'; +import { Title } from '@app/ui/components/typography/title'; function ContractCodeSection() { const transactionRequest = useTransactionRequestState(); @@ -31,19 +31,15 @@ function ContractCodeSection() { return ( ); } -interface TabButtonProps extends BoxProps { +interface TabButtonProps extends HTMLStyledProps<'button'> { isActive: boolean; } @@ -51,14 +47,14 @@ function TabButton(props: TabButtonProps) { const { isActive, ...rest } = props; return ( - ); @@ -80,32 +76,30 @@ export function ContractDeployDetails() { } return ( - - + + setTab('details')} isActive={tab === 'details'}> Details setTab('code')} isActive={tab === 'code'}> Code - + {tab === 'details' ? ( - - Contract deploy details - + Contract deploy details - }> + {currentAccountStxAddress && ( )} diff --git a/src/app/features/stacks-transaction-request/contract-preview.tsx b/src/app/features/stacks-transaction-request/contract-preview.tsx index 9ea23bf9700..400ad664dcb 100644 --- a/src/app/features/stacks-transaction-request/contract-preview.tsx +++ b/src/app/features/stacks-transaction-request/contract-preview.tsx @@ -1,53 +1,55 @@ -import { DynamicColorCircle, Stack, StackProps, color } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; +import { HStack, Stack } from 'leather-styles/jsx'; import { formatContractId } from '@app/common/utils'; -import { Caption, Title } from '@app/components/typography'; +import { DynamicColorCircle } from '@app/ui/components/dynamic-color-circle'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Title } from '@app/ui/components/typography/title'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; -interface ContractPreviewLayoutProps extends StackProps { +interface ContractPreviewLayoutProps { contractAddress: string; contractName: string; functionName?: string; + onClick?: () => void; } -export function ContractPreviewLayout(props: ContractPreviewLayoutProps) { - const { contractAddress, contractName, functionName, ...rest } = props; - +export function ContractPreviewLayout({ + contractAddress, + contractName, + functionName, + onClick, +}: ContractPreviewLayoutProps) { return ( - - - - {functionName || contractName} - + + {functionName || contractName} {truncateMiddle(contractAddress, functionName ? 4 : 6)} {functionName ? `.${contractName}` : ''} - + ); } diff --git a/src/app/features/stacks-transaction-request/minimal-error-message.tsx b/src/app/features/stacks-transaction-request/minimal-error-message.tsx index eea14468c39..116c0a8197f 100644 --- a/src/app/features/stacks-transaction-request/minimal-error-message.tsx +++ b/src/app/features/stacks-transaction-request/minimal-error-message.tsx @@ -1,14 +1,13 @@ import { Suspense, memo } from 'react'; -import { Stack, StackProps, color } from '@stacks/ui'; import { TransactionRequestSelectors } from '@tests/selectors/requests.selectors'; -import { styled } from 'leather-styles/jsx'; +import { HStack, HstackProps, styled } from 'leather-styles/jsx'; -import { ErrorIcon } from '@app/components/icons/error-icon'; import { useTransactionError } from '@app/features/stacks-transaction-request/hooks/use-transaction-error'; import { TransactionErrorReason } from '@app/features/stacks-transaction-request/transaction-error/transaction-error'; +import { ErrorIcon } from '@app/ui/components/icons/error-icon'; -function MinimalErrorMessageSuspense(props: StackProps) { +function MinimalErrorMessageSuspense(props: HstackProps) { const error = useTransactionError(); if (!error) return null; @@ -33,13 +32,13 @@ function MinimalErrorMessageSuspense(props: StackProps) { }; return ( - @@ -47,11 +46,11 @@ function MinimalErrorMessageSuspense(props: StackProps) { {getTitle()} - + ); } -function MinimalErrorMessageBase(props: StackProps) { +function MinimalErrorMessageBase(props: HstackProps) { return ( }> diff --git a/src/app/features/stacks-transaction-request/page-top.tsx b/src/app/features/stacks-transaction-request/page-top.tsx index 8d6993da910..e5985829756 100644 --- a/src/app/features/stacks-transaction-request/page-top.tsx +++ b/src/app/features/stacks-transaction-request/page-top.tsx @@ -29,7 +29,7 @@ function PageTopBase() { return ( @@ -37,7 +37,7 @@ function PageTopBase() { {pageTitle} {caption && ( - } pl="tight"> + } pl="space.02"> {caption} diff --git a/src/app/features/stacks-transaction-request/post-condition-mode-warning.tsx b/src/app/features/stacks-transaction-request/post-condition-mode-warning.tsx index 3589ee5b840..10346530107 100644 --- a/src/app/features/stacks-transaction-request/post-condition-mode-warning.tsx +++ b/src/app/features/stacks-transaction-request/post-condition-mode-warning.tsx @@ -9,7 +9,7 @@ export function PostConditionModeWarning(): React.JSX.Element | null { if (mode !== PostConditionMode.Allow) return null; return ( - + If you confirm, you allow it to transfer any of your tokens. Only confirm if you trust and have verified the contract. diff --git a/src/app/features/stacks-transaction-request/post-conditions/fungible-post-condition-item.tsx b/src/app/features/stacks-transaction-request/post-conditions/fungible-post-condition-item.tsx index 83783996ece..3010f23edc2 100644 --- a/src/app/features/stacks-transaction-request/post-conditions/fungible-post-condition-item.tsx +++ b/src/app/features/stacks-transaction-request/post-conditions/fungible-post-condition-item.tsx @@ -2,7 +2,6 @@ import { Suspense } from 'react'; import { TransactionTypes } from '@stacks/connect'; import { FungiblePostCondition, addressToString } from '@stacks/transactions'; -import { truncateMiddle } from '@stacks/ui-utils'; import { getImageCanonicalUri } from '@app/common/crypto-assets/stacks-crypto-asset.utils'; import { ftDecimals } from '@app/common/stacks-utils'; @@ -19,6 +18,7 @@ import { LoadingSpinner } from '@app/components/loading-spinner'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useAssetFromFungiblePostCondition } from '@app/store/transactions/post-conditions.hooks'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; interface FungiblePostConditionItemProps { isLast?: boolean; diff --git a/src/app/features/stacks-transaction-request/post-conditions/no-post-conditions.tsx b/src/app/features/stacks-transaction-request/post-conditions/no-post-conditions.tsx index e44af4fcd4d..6b680558c91 100644 --- a/src/app/features/stacks-transaction-request/post-conditions/no-post-conditions.tsx +++ b/src/app/features/stacks-transaction-request/post-conditions/no-post-conditions.tsx @@ -1,21 +1,19 @@ -import { FiLock } from 'react-icons/fi'; +import { Box, Circle, HStack } from 'leather-styles/jsx'; +import { styled } from 'leather-styles/jsx'; -import { Box, Circle, Stack } from '@stacks/ui'; -import { color } from '@stacks/ui-utils'; - -import { Body } from '@app/components/typography'; +import { LockIcon } from '@app/ui/components/icons/lock-icon'; export function NoPostConditions(): React.JSX.Element { return ( - - - + + + - + No transfers (besides fees) will be made from your account or the transaction will abort. - + - + ); } diff --git a/src/app/features/stacks-transaction-request/post-conditions/post-condition-item.tsx b/src/app/features/stacks-transaction-request/post-conditions/post-condition-item.tsx index ede15fee4f8..71962896ce7 100644 --- a/src/app/features/stacks-transaction-request/post-conditions/post-condition-item.tsx +++ b/src/app/features/stacks-transaction-request/post-conditions/post-condition-item.tsx @@ -2,7 +2,6 @@ import { Suspense } from 'react'; import { TransactionTypes } from '@stacks/connect'; import { NonFungiblePostCondition, STXPostCondition, addressToString } from '@stacks/transactions'; -import { truncateMiddle } from '@stacks/ui-utils'; import { getAmountFromPostCondition, @@ -16,6 +15,7 @@ import { EventCard } from '@app/components/event-card'; import { LoadingSpinner } from '@app/components/loading-spinner'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; interface PostConditionItemProps { isLast?: boolean; diff --git a/src/app/features/stacks-transaction-request/post-conditions/post-conditions.tsx b/src/app/features/stacks-transaction-request/post-conditions/post-conditions.tsx index a1ffbadf428..7d693ecb057 100644 --- a/src/app/features/stacks-transaction-request/post-conditions/post-conditions.tsx +++ b/src/app/features/stacks-transaction-request/post-conditions/post-conditions.tsx @@ -2,7 +2,7 @@ import { Suspense, useMemo } from 'react'; import { TransactionTypes } from '@stacks/connect'; import { PostConditionMode } from '@stacks/transactions'; -import { Flex, color } from '@stacks/ui'; +import { Flex } from 'leather-styles/jsx'; import { IS_TEST_ENV } from '@shared/environment'; @@ -31,10 +31,10 @@ function PostConditionsSuspense(): React.JSX.Element | null { return ( {hasPostConditions ? ( diff --git a/src/app/features/stacks-transaction-request/post-conditions/stx-post-condition.tsx b/src/app/features/stacks-transaction-request/post-conditions/stx-post-condition.tsx index 6e2793b4ad3..81dc7a15be0 100644 --- a/src/app/features/stacks-transaction-request/post-conditions/stx-post-condition.tsx +++ b/src/app/features/stacks-transaction-request/post-conditions/stx-post-condition.tsx @@ -1,9 +1,9 @@ import { TransactionTypes } from '@stacks/connect'; -import { truncateMiddle } from '@stacks/ui-utils'; import { stacksValue } from '@app/common/stacks-utils'; import { EventCard } from '@app/components/event-card'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; export function StxPostCondition(): React.JSX.Element | null { const pendingTransaction = useTransactionRequestState(); diff --git a/src/app/features/stacks-transaction-request/principal-value.tsx b/src/app/features/stacks-transaction-request/principal-value.tsx index 420b90d1092..207d995267e 100644 --- a/src/app/features/stacks-transaction-request/principal-value.tsx +++ b/src/app/features/stacks-transaction-request/principal-value.tsx @@ -1,24 +1,22 @@ import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { Link } from '@app/components/link'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; +import { LeatherButton } from '@app/ui/components/button'; interface PrincipalValueProps { address: string; } export function PrincipalValue(props: PrincipalValueProps) { - const { address, ...rest } = props; + const { address } = props; const { mode } = useCurrentNetworkState(); return ( - openInNewTab(`https://explorer.hiro.so/address/${address}?chain=${mode}`)} - {...rest} + textStyle="label.03" + variant="text" + wordBreak="break-all" > {address} - + ); } diff --git a/src/app/features/stacks-transaction-request/row.tsx b/src/app/features/stacks-transaction-request/row.tsx index b91823809f1..4b6fed7fb97 100644 --- a/src/app/features/stacks-transaction-request/row.tsx +++ b/src/app/features/stacks-transaction-request/row.tsx @@ -1,21 +1,18 @@ -import { Stack, StackProps, Text } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { HStack, Stack, styled } from 'leather-styles/jsx'; -import { Caption } from '@app/components/typography'; +import { Caption } from '@app/ui/components/typography/caption'; import { PrincipalValue } from './principal-value'; -interface RowProps extends StackProps { +interface RowProps { name?: string | React.JSX.Element | null; type?: string; value: string; } -export function Row(props: RowProps): React.JSX.Element { - const { name, type, value, ...rest } = props; - +export function Row({ name, type, value }: RowProps): React.JSX.Element { return ( - + {name && {name}} {type && {type}} @@ -24,9 +21,15 @@ export function Row(props: RowProps): React.JSX.Element { {type?.toLowerCase() === 'principal' ? ( ) : ( - + {value} - + )} ); diff --git a/src/app/features/stacks-transaction-request/stacks-transaction-signer.tsx b/src/app/features/stacks-transaction-request/stacks-transaction-signer.tsx index dbfa9227efe..5e49347b0f4 100644 --- a/src/app/features/stacks-transaction-request/stacks-transaction-signer.tsx +++ b/src/app/features/stacks-transaction-request/stacks-transaction-signer.tsx @@ -1,8 +1,8 @@ import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import { StacksTransaction } from '@stacks/transactions'; -import { Flex } from '@stacks/ui'; import { Formik } from 'formik'; +import { Flex } from 'leather-styles/jsx'; import * as yup from 'yup'; import { HIGH_FEE_WARNING_LEARN_MORE_URL_STX } from '@shared/constants'; @@ -92,7 +92,7 @@ export function StacksTransactionSigner({ }; return ( - + navigate(RouteUrls.EditNonce + search)} /> )} diff --git a/src/app/features/stacks-transaction-request/stx-transfer-details/stx-transfer-details.tsx b/src/app/features/stacks-transaction-request/stx-transfer-details/stx-transfer-details.tsx index 0cafaa5012a..d22e45167e2 100644 --- a/src/app/features/stacks-transaction-request/stx-transfer-details/stx-transfer-details.tsx +++ b/src/app/features/stacks-transaction-request/stx-transfer-details/stx-transfer-details.tsx @@ -1,10 +1,9 @@ -import { Stack, color } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; -import { Divider } from '@app/components/layout/divider'; -import { Title } from '@app/components/typography'; import { AttachmentRow } from '@app/features/stacks-transaction-request/attachment-row'; import { Row } from '@app/features/stacks-transaction-request/row'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { Title } from '@app/ui/components/typography/title'; export function StxTransferDetails(): React.JSX.Element | null { const pendingTransaction = useTransactionRequestState(); @@ -16,17 +15,15 @@ export function StxTransferDetails(): React.JSX.Element | null { return ( - - Transfer details - - } spacing="base"> + Transfer details + {pendingTransaction.memo && ( diff --git a/src/app/features/stacks-transaction-request/submit-action.tsx b/src/app/features/stacks-transaction-request/submit-action.tsx index 54a8e0ad59e..3979dc41142 100644 --- a/src/app/features/stacks-transaction-request/submit-action.tsx +++ b/src/app/features/stacks-transaction-request/submit-action.tsx @@ -7,8 +7,8 @@ import { isEmpty } from '@shared/utils'; import { useDrawers } from '@app/common/hooks/use-drawers'; import { LoadingKeys, useLoading } from '@app/common/hooks/use-loading'; -import { ButtonProps, LeatherButton } from '@app/components/button/button'; import { useTransactionError } from '@app/features/stacks-transaction-request/hooks/use-transaction-error'; +import { ButtonProps, LeatherButton } from '@app/ui/components/button'; function BaseConfirmButton(props: ButtonProps): React.JSX.Element { return ( diff --git a/src/app/features/stacks-transaction-request/transaction-error/error-message.tsx b/src/app/features/stacks-transaction-request/transaction-error/error-message.tsx index 4f371536c42..b2ff0f0b258 100644 --- a/src/app/features/stacks-transaction-request/transaction-error/error-message.tsx +++ b/src/app/features/stacks-transaction-request/transaction-error/error-message.tsx @@ -1,34 +1,36 @@ import { memo } from 'react'; -import { Stack, StackProps, color } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; +import { HStack, Stack, styled } from 'leather-styles/jsx'; -import { ErrorIcon } from '@app/components/icons/error-icon'; +import { ErrorIcon } from '@app/ui/components/icons/error-icon'; -interface ErrorMessageProps extends StackProps { +interface ErrorMessageProps { title: string; body: string | React.JSX.Element; actions?: React.JSX.Element; + // #4476 FIXME share borders better colour + border?: string; + borderColor?: string; } -export const ErrorMessage = memo(({ title, body, actions, ...rest }: ErrorMessageProps) => { +export const ErrorMessage = memo(({ border, title, body, actions }: ErrorMessageProps) => { return ( - - + + {title} - + {body} - {actions && {actions}} + {actions && {actions}} ); }); diff --git a/src/app/features/stacks-transaction-request/transaction-error/error-messages.tsx b/src/app/features/stacks-transaction-request/transaction-error/error-messages.tsx index 9ec1068605b..753f0cad84f 100644 --- a/src/app/features/stacks-transaction-request/transaction-error/error-messages.tsx +++ b/src/app/features/stacks-transaction-request/transaction-error/error-messages.tsx @@ -2,9 +2,7 @@ import { memo } from 'react'; import { Navigate } from 'react-router-dom'; import { STXTransferPayload, TransactionTypes } from '@stacks/connect'; -import { Fade, Flex, Stack, color } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; -import { HStack } from 'leather-styles/jsx'; +import { Flex, HStack, Stack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { closeWindow } from '@shared/utils'; @@ -13,12 +11,13 @@ import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useDrawers } from '@app/common/hooks/use-drawers'; import { useScrollLock } from '@app/common/hooks/use-scroll-lock'; import { stacksValue } from '@app/common/stacks-utils'; -import { LeatherButton } from '@app/components/button/button'; -import { Caption } from '@app/components/typography'; import { ErrorMessage } from '@app/features/stacks-transaction-request/transaction-error/error-message'; import { useCurrentStacksAccountAnchoredBalances } from '@app/query/stacks/balance/stx-balance.hooks'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; import { useTransactionRequestState } from '@app/store/transactions/requests.hooks'; +import { LeatherButton } from '@app/ui/components/button'; +import { Caption } from '@app/ui/components/typography/caption'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; interface InsufficientFundsActionButtonsProps { eventName: string; @@ -62,12 +61,12 @@ export const StxTransferInsufficientFundsErrorMessage = memo(props => { - + + You don't have enough STX to make this transfer. Send some STX to this address, or switch to another account. - + Current balance @@ -135,40 +134,38 @@ export const UnauthorizedRequestRedirect = memo(() => { }); // TODO: Change this to new Error component? +// #4476 TODO: maybe we can do the above now? export const ExpiredRequestErrorMessage = memo(props => { useScrollLock(true); return ( - - {styles => ( - - *': { - pointerEvents: 'all', - }, - }} - {...props} - /> - - )} - + + *': { + // pointerEvents: 'all', + // }, + // }} + {...props} + /> + ); }); diff --git a/src/app/features/switch-account-drawer/components/account-list-unavailable.tsx b/src/app/features/switch-account-drawer/components/account-list-unavailable.tsx index 21265c57b60..5ced903f54d 100644 --- a/src/app/features/switch-account-drawer/components/account-list-unavailable.tsx +++ b/src/app/features/switch-account-drawer/components/account-list-unavailable.tsx @@ -1,23 +1,21 @@ import { memo } from 'react'; -import { Box, Flex } from '@stacks/ui'; - -import { Body, Title } from '@app/components/typography'; +import { Box, Flex, styled } from 'leather-styles/jsx'; export const AccountListUnavailable = memo(() => ( - Unable to load account information - + Unable to load account information + We're unable to load information about your accounts. This may be a problem with the wallet's API. If this problem persists, contact support. - + )); diff --git a/src/app/features/switch-account-drawer/components/create-account-action.tsx b/src/app/features/switch-account-drawer/components/create-account-action.tsx index 74d44247577..b21b99b399c 100644 --- a/src/app/features/switch-account-drawer/components/create-account-action.tsx +++ b/src/app/features/switch-account-drawer/components/create-account-action.tsx @@ -1,6 +1,6 @@ import { Flex } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface CreateAccountActionProps { onCreateAccount(): void; diff --git a/src/app/features/switch-account-drawer/components/switch-account-list-item.tsx b/src/app/features/switch-account-drawer/components/switch-account-list-item.tsx index 2b370fae42e..761823e7bc1 100644 --- a/src/app/features/switch-account-drawer/components/switch-account-list-item.tsx +++ b/src/app/features/switch-account-drawer/components/switch-account-list-item.tsx @@ -1,13 +1,7 @@ import { memo } from 'react'; -import { useNavigate } from 'react-router-dom'; - -import { RouteUrls } from '@shared/route-urls'; import { useAccountDisplayName } from '@app/common/hooks/account/use-account-names'; import { useSwitchAccount } from '@app/common/hooks/account/use-switch-account'; -import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; -import { useDrawers } from '@app/common/hooks/use-drawers'; import { useLoading } from '@app/common/hooks/use-loading'; import { AccountTotalBalance } from '@app/components/account-total-balance'; import { AccountListItemLayout } from '@app/components/account/account-list-item-layout'; @@ -15,7 +9,7 @@ import { usePressable } from '@app/components/item-hover'; import { useNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; -import { AccountAvatarItem } from '../../../components/account/account-avatar'; +import { AccountAvatarItem } from '../../../components/account/account-avatar-item'; import { AccountNameLayout } from '../../../components/account/account-name'; interface SwitchAccountListItemProps { @@ -36,7 +30,6 @@ export const SwitchAccountListItem = memo( const { handleSwitchAccount } = useSwitchAccount(handleClose); const [component, bind] = usePressable(true); const name = useAccountDisplayName({ address: stacksAddress, index }); - const navigate = useNavigate(); const handleClick = async () => { setIsLoading(); @@ -46,25 +39,6 @@ export const SwitchAccountListItem = memo( }, 80); }; - const analytics = useAnalytics(); - const { onCopy, hasCopied } = useClipboard(stacksAddress || ''); - const { setIsShowingSwitchAccountsState } = useDrawers(); - - const onCopyToClipboard = (e: React.MouseEvent) => { - e.stopPropagation(); - void analytics.track('copy_address_to_clipboard'); - onCopy(); - }; - - const onClickBtcCopyIcon = (e: React.MouseEvent) => { - if (!bitcoinAddress) return; - e.stopPropagation(); - setIsShowingSwitchAccountsState(false); - navigate(RouteUrls.ReceiveBtc, { - state: { btcAddress: bitcoinAddress, accountIndex: currentAccountIndex }, - }); - }; - return ( } @@ -82,10 +56,7 @@ export const SwitchAccountListItem = memo( balanceLabel={ } - hasCopied={hasCopied} - onCopyToClipboard={onCopyToClipboard} - onClickBtcCopyIcon={onClickBtcCopyIcon} - mt="loose" + mt="space.05" {...bind} > {component} diff --git a/src/app/features/switch-account-drawer/switch-account-drawer.tsx b/src/app/features/switch-account-drawer/switch-account-drawer.tsx index b97e17df35f..6fa56009a0f 100644 --- a/src/app/features/switch-account-drawer/switch-account-drawer.tsx +++ b/src/app/features/switch-account-drawer/switch-account-drawer.tsx @@ -1,12 +1,12 @@ import { memo } from 'react'; -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; import { useCreateAccount } from '@app/common/hooks/account/use-create-account'; import { useWalletType } from '@app/common/use-wallet-type'; import { ControlledDrawer } from '@app/components/drawer/controlled-drawer'; -import { store } from '@app/store'; import { useCurrentAccountIndex } from '@app/store/accounts/account'; +import { useFilteredBitcoinAccounts } from '@app/store/accounts/blockchain/bitcoin/bitcoin.ledger'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useShowSwitchAccountsState } from '@app/store/ui/ui.hooks'; @@ -22,7 +22,8 @@ export const SwitchAccountDrawer = memo(() => { const { whenWallet } = useWalletType(); const stacksAccounts = useStacksAccounts(); - const btcAddressesNum = Object.keys(store.getState().ledger.bitcoin.entities).length / 2; + const bitcoinAccounts = useFilteredBitcoinAccounts(); + const btcAddressesNum = bitcoinAccounts.length / 2; const stacksAddressesNum = stacksAccounts.length; const onClose = () => setShowSwitchAccountsState(false); @@ -38,7 +39,7 @@ export const SwitchAccountDrawer = memo(() => { return isShowing ? ( - + void; @@ -13,7 +11,6 @@ export function ThemeListItemLayout({ themeLabel, isActive, onThemeItemSelect, - ...props }: ThemeListItemProps) { return ( - - {themeLabel} - + {themeLabel} {isActive && } diff --git a/src/app/features/theme-drawer/theme-list-item.tsx b/src/app/features/theme-drawer/theme-list-item.tsx index 322e3b1c8ee..a91513eb57c 100644 --- a/src/app/features/theme-drawer/theme-list-item.tsx +++ b/src/app/features/theme-drawer/theme-list-item.tsx @@ -1,17 +1,15 @@ import { useCallback } from 'react'; -import { BoxProps } from '@stacks/ui'; - import { UserSelectedTheme, getThemeLabel } from '@app/common/theme-provider'; import { ThemeListItemLayout } from './theme-list-item-layout'; -interface ThemeListItemProps extends BoxProps { +interface ThemeListItemProps { theme: UserSelectedTheme; onThemeSelected: (theme: UserSelectedTheme) => void; isActive: boolean; } -export function ThemeListItem({ theme, onThemeSelected, isActive, ...props }: ThemeListItemProps) { +export function ThemeListItem({ theme, onThemeSelected, isActive }: ThemeListItemProps) { const themeLabel = getThemeLabel(theme); const itemSelectHandler = useCallback(() => { onThemeSelected(theme); @@ -22,7 +20,6 @@ export function ThemeListItem({ theme, onThemeSelected, isActive, ...props }: Th themeLabel={themeLabel} isActive={isActive} onThemeItemSelect={itemSelectHandler} - {...props} /> ); } diff --git a/src/app/features/theme-drawer/theme-list.tsx b/src/app/features/theme-drawer/theme-list.tsx index 8ca200d8e74..7c8a4ccdf00 100644 --- a/src/app/features/theme-drawer/theme-list.tsx +++ b/src/app/features/theme-drawer/theme-list.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react'; -import { Flex, FlexProps } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; +import { Flex, FlexProps } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { UserSelectedTheme, themeLabelMap, useThemeSwitcher } from '@app/common/theme-provider'; @@ -26,7 +26,7 @@ export function ThemeList(props: FlexProps) { const { userSelectedTheme } = useThemeSwitcher(); return ( - + {themes.map(theme => ( {bitcoinContracts.length === 0 || isError ? ( - + {isError ? 'Bitcoin Contracts are not available currently' : "You don't have any open Bitcoin Contracts."} - + ) : ( bitcoinContracts.map(bitcoinContract => { @@ -51,7 +50,7 @@ export function BitcoinContractList() { key={bitcoinContract.id} id={truncateMiddle(bitcoinContract.id)} collateralAmount={bitcoinContract.acceptorCollateral} - txId={bitcoinContract.txId} + txid={bitcoinContract.txId} state={bitcoinContract.state} /> ); diff --git a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx index 5f94bf2acf8..f90ba9ed7f7 100644 --- a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx +++ b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-item-layout.tsx @@ -1,7 +1,6 @@ import { useCallback } from 'react'; -import { Box, Flex } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { Flex, HStack, styled } from 'leather-styles/jsx'; import { createMoneyFromDecimal } from '@shared/models/money.model'; @@ -9,22 +8,22 @@ import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; import { baseCurrencyAmountInQuote } from '@app/common/money/calculate-money'; import { i18nFormatCurrency } from '@app/common/money/format-money'; import { satToBtc } from '@app/common/money/unit-conversion'; -import { BitcoinContractIcon } from '@app/components/icons/bitcoin-contract-icon'; import { Flag } from '@app/components/layout/flag'; -import { Caption, Text } from '@app/components/typography'; import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { BitcoinContractIcon } from '@app/ui/components/icons/bitcoin-contract-icon'; +import { Caption } from '@app/ui/components/typography/caption'; interface BitcoinContractListItemLayoutProps { id: string; state: string; collateralAmount: string; - txId: string; + txid: string; } export function BitcoinContractListItemLayout({ id, state, collateralAmount, - txId, + txid, }: BitcoinContractListItemLayoutProps) { const { handleOpenTxLink } = useExplorerLink(); const bitcoinMarketData = useCryptoCurrencyMarketData('BTC'); @@ -39,22 +38,21 @@ export function BitcoinContractListItemLayout({ return ( handleOpenTxLink({ blockchain: 'bitcoin', suffix: `&submitted=true`, - txId, + txid, }) } > - } align="middle" spacing="base" width="100%"> + } align="middle" spacing="space.04" width="100%"> - {id} - + {id} + {satToBtc(parseInt(collateralAmount)).toString()} - + {state} diff --git a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-layout.tsx b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-layout.tsx index 6002a8bf1da..3074f22f036 100644 --- a/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-layout.tsx +++ b/src/app/pages/bitcoin-contract-list/components/bitcoin-contract-list-layout.tsx @@ -15,7 +15,7 @@ export function BitcoinContractListLayout({ children }: BitcoinContractListProps const navigate = useNavigate(); useRouteHeader(
navigate(RouteUrls.Home)} />); return ( - + {children} ); diff --git a/src/app/pages/bitcoin-contract-request/bitcoin-contract-request.tsx b/src/app/pages/bitcoin-contract-request/bitcoin-contract-request.tsx index 08cf710fd9c..cbed6c93363 100644 --- a/src/app/pages/bitcoin-contract-request/bitcoin-contract-request.tsx +++ b/src/app/pages/bitcoin-contract-request/bitcoin-contract-request.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { BitcoinContractResponseStatus } from '@shared/rpc/methods/accept-bitcoin-contract'; @@ -46,6 +46,7 @@ export function BitcoinContractRequest() { useOnMount(() => { const bitcoinContractOfferJSON = initialSearchParams.get('bitcoinContractOffer'); + const bitcoinNetwork = initialSearchParams.get('bitcoinNetwork'); const counterpartyWalletDetailsJSON = initialSearchParams.get('counterpartyWalletDetails'); const bitcoinAccountDetails = getNativeSegwitSigner?.(0); @@ -54,19 +55,35 @@ export function BitcoinContractRequest() { const currentBitcoinNetwork = bitcoinAccountDetails.network; - if (currentBitcoinNetwork !== 'testnet') { + if ( + !getNativeSegwitSigner || + !bitcoinContractOfferJSON || + !counterpartyWalletDetailsJSON || + !bitcoinNetwork + ) + return; + + if (!['testnet', 'regtest'].includes(currentBitcoinNetwork)) { navigate(RouteUrls.BitcoinContractLockError, { state: { error: new Error('Invalid Network'), - title: "Network doesn't support Bitcoin Contracts", + title: "Current selected network doesn't support Bitcoin Contracts", body: "The wallet's current selected network doesn't support Bitcoin Contracts", }, }); sendRpcResponse(BitcoinContractResponseStatus.NETWORK_ERROR); } - if (!getNativeSegwitSigner || !bitcoinContractOfferJSON || !counterpartyWalletDetailsJSON) - return; + if (JSON.parse(bitcoinNetwork) !== currentBitcoinNetwork) { + navigate(RouteUrls.BitcoinContractLockError, { + state: { + error: new Error('Invalid Network'), + title: "Current selected network doesn't match offer's network", + body: "The wallet's current selected network doesn't match the offer's network", + }, + }); + sendRpcResponse(BitcoinContractResponseStatus.NETWORK_ERROR); + } const currentBitcoinContractOfferDetails = handleOffer( bitcoinContractOfferJSON, @@ -93,7 +110,7 @@ export function BitcoinContractRequest() { bitcoinContractOfferDetails.counterpartyWalletDetails.counterpartyWalletIcon } /> - + diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-emergency-refund-time.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-emergency-refund-time.tsx new file mode 100644 index 00000000000..2e71ab32ec4 --- /dev/null +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-emergency-refund-time.tsx @@ -0,0 +1,24 @@ +import { BitcoinContractRequestSelectors } from '@tests/selectors/bitcoin-contract-request.selectors'; +import { Flex } from 'leather-styles/jsx'; +import { styled } from 'leather-styles/jsx'; + +interface BitcoinContractEmergencyRefundTimeProps { + emergencyRefundTime: string; +} +export function BitcoinContractEmergencyRefundTime({ + emergencyRefundTime, +}: BitcoinContractEmergencyRefundTimeProps) { + return ( + + + Emergency Refund Time + + + {emergencyRefundTime} + + + ); +} diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-expiration-date.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-expiration-date.tsx deleted file mode 100644 index 01d19d16a1a..00000000000 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-expiration-date.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Flex } from '@stacks/ui'; -import { BitcoinContractRequestSelectors } from '@tests/selectors/bitcoin-contract-request.selectors'; - -import { Text } from '@app/components/typography'; - -interface BitcoinContractExpirationDateProps { - expirationDate: string; -} -export function BitcoinContractExpirationDate({ - expirationDate, -}: BitcoinContractExpirationDateProps) { - return ( - - - Expiration Date - - - {expirationDate} - - - ); -} diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-lock-amount.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-lock-amount.tsx index 41e38a07ec2..e2fea0b02e6 100644 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-lock-amount.tsx +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-lock-amount.tsx @@ -1,17 +1,20 @@ -import { FiArrowUpRight, FiCopy } from 'react-icons/fi'; +import { ReactNode } from 'react'; -import { Box, Stack, Text, color } from '@stacks/ui'; import { BitcoinContractRequestSelectors } from '@tests/selectors/bitcoin-contract-request.selectors'; -import { HStack } from 'leather-styles/jsx'; +import { HStack, styled } from 'leather-styles/jsx'; +import { token } from 'leather-styles/tokens'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; -import { BtcIcon } from '@app/components/icons/btc-icon'; import { Flag } from '@app/components/layout/flag'; import { Tooltip } from '@app/components/tooltip'; +import { LeatherButton } from '@app/ui/components/button'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; interface BitcoinContractLockAmountProps { hoverLabel?: string; - image?: JSX.Element; + image?: ReactNode; subtitle?: string; subValue?: string; subValueAction?(): void; @@ -30,18 +33,15 @@ export function BitcoinContractLockAmount({ const { onCopy, hasCopied } = useClipboard(hoverLabel ?? ''); return ( - } align="middle" width="100%"> + } width="100%"> - - {title ? title : 'BTC'} - - {title ? title : 'BTC'} + {value} - + {subtitle ? ( @@ -53,28 +53,31 @@ export function BitcoinContractLockAmount({ maxWidth="230px" placement="bottom" > - - + {subtitle} - - {hoverLabel ? : null} - + + {hoverLabel ? : null} + ) : null} {subValue ? ( - - - {subValue} - - {subValueAction ? : null} - + + + + {subValue} + + {subValueAction ? ( + + ) : null} + + ) : null} diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-details.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-details.tsx index 2897ec8b276..05cf9203839 100644 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-details.tsx +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-details.tsx @@ -1,6 +1,6 @@ import { SimplifiedBitcoinContract } from '@app/common/hooks/use-bitcoin-contracts'; -import { BitcoinContractExpirationDate } from './bitcoin-contract-expiration-date'; +import { BitcoinContractEmergencyRefundTime } from './bitcoin-contract-emergency-refund-time'; import { BitcoinContractOfferInput } from './bitcoin-contract-offer-input'; interface BitcoinContractOfferDetailsSimpleProps { @@ -17,8 +17,8 @@ export function BitcoinContractOfferDetailsSimple({ addressNativeSegwit={bitcoinAddress} bitcoinContractOffer={bitcoinContractOffer} /> - ); diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-input.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-input.tsx index 5e1e329c10e..8529b527585 100644 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-input.tsx +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-offer/bitcoin-contract-offer-input.tsx @@ -1,5 +1,4 @@ -import { Stack, Text } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; +import { Stack, styled } from 'leather-styles/jsx'; import { createMoneyFromDecimal } from '@shared/models/money.model'; @@ -7,6 +6,7 @@ import { SimplifiedBitcoinContract } from '@app/common/hooks/use-bitcoin-contrac import { formatMoney, i18nFormatCurrency } from '@app/common/money/format-money'; import { satToBtc } from '@app/common/money/unit-conversion'; import { useCalculateBitcoinFiatValue } from '@app/query/common/market-data/market-data.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { BitcoinContractLockAmount } from './bitcoin-contract-lock-amount'; @@ -27,8 +27,8 @@ export function BitcoinContractOfferInput({ const formattedFiatValue = i18nFormatCurrency(fiatValue); return ( - - Amount + + Amount - - + Accept - + ); } diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-header.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-header.tsx index dd377e6c465..65247be0b40 100644 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-header.tsx +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-header.tsx @@ -1,10 +1,11 @@ import { memo } from 'react'; -import { Flex } from '@stacks/ui'; import { BitcoinContractRequestSelectors } from '@tests/selectors/bitcoin-contract-request.selectors'; +import { Flex } from 'leather-styles/jsx'; import { Flag } from '@app/components/layout/flag'; -import { Caption, Title } from '@app/components/typography'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Title } from '@app/ui/components/typography/title'; interface BitcoinContractRequestHeaderBaseProps { counterpartyWalletIcon: string; @@ -18,15 +19,13 @@ function BitcoinContractRequestHeaderBase({ const caption = `${counterpartyWalletName} is requesting you accept this offer`; return ( - - - Lock Bitcoin - + + Lock Bitcoin {caption && ( } - pl="tight" + pl="space.02" > {caption} diff --git a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-layout.tsx b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-layout.tsx index 99df93e3f41..171c52142ab 100644 --- a/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-layout.tsx +++ b/src/app/pages/bitcoin-contract-request/components/bitcoin-contract-request-layout.tsx @@ -1,4 +1,4 @@ -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; interface BitcoinContractRequestLayoutProps { children: React.ReactNode; @@ -10,8 +10,8 @@ export function BitcoinContractRequestLayout({ children }: BitcoinContractReques maxHeight="calc(100vh - 72px)" overflowY="scroll" pb="120px" - px="loose" - spacing="tight" + px="space.05" + gap="space.02" width="100%" > {children} diff --git a/src/app/pages/choose-account/choose-account.tsx b/src/app/pages/choose-account/choose-account.tsx index 88abc6218df..bcc5da06e0e 100644 --- a/src/app/pages/choose-account/choose-account.tsx +++ b/src/app/pages/choose-account/choose-account.tsx @@ -8,10 +8,10 @@ import { closeWindow } from '@shared/utils'; import { useCancelAuthRequest } from '@app/common/authentication/use-cancel-auth-request'; import { useAppDetails } from '@app/common/hooks/auth/use-app-details'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; -import { LeatherIcon } from '@app/components/icons/leather-icon'; import { RequesterFlag } from '@app/components/requester-flag'; import { ChooseAccountsList } from '@app/pages/choose-account/components/accounts'; import { useOnOriginTabClose } from '@app/routes/hooks/use-on-tab-closed'; +import { LeatherIcon } from '@app/ui/components/icons/leather-icon'; export const ChooseAccount = memo(() => { const { url } = useAppDetails(); @@ -32,10 +32,10 @@ export const ChooseAccount = memo(() => { return ( <> - + {url && } - + Choose an account to connect diff --git a/src/app/pages/choose-account/components/accounts.tsx b/src/app/pages/choose-account/components/accounts.tsx index 9cc0d95e509..ac452e9d973 100644 --- a/src/app/pages/choose-account/components/accounts.tsx +++ b/src/app/pages/choose-account/components/accounts.tsx @@ -1,49 +1,31 @@ import { Suspense, memo, useMemo, useState } from 'react'; -import { FiPlusCircle } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { Virtuoso } from 'react-virtuoso'; -import { Box, BoxProps, FlexProps, Stack, Text } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; +import { Box, FlexProps, HStack, styled } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { useFinishAuthRequest } from '@app/common/authentication/use-finish-auth-request'; import { useAccountDisplayName } from '@app/common/hooks/account/use-account-names'; import { useCreateAccount } from '@app/common/hooks/account/use-create-account'; -import { useOnboardingState } from '@app/common/hooks/auth/use-onboarding-state'; import { useWalletType } from '@app/common/use-wallet-type'; import { slugify } from '@app/common/utils'; import { AccountTotalBalance } from '@app/components/account-total-balance'; -import { AccountAvatar } from '@app/components/account/account-avatar/account-avatar'; +import { AccountAvatar } from '@app/components/account/account-avatar'; import { AccountListItemLayout } from '@app/components/account/account-list-item-layout'; import { usePressable } from '@app/components/item-hover'; -import { Title } from '@app/components/typography'; import { useNativeSegwitAccountIndexAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.models'; +import { PlusIcon } from '@app/ui/components/icons/plus-icon'; -const loadingProps = { color: '#A1A7B3' }; -const getLoadingProps = (loading: boolean) => (loading ? loadingProps : {}); - -interface AccountTitlePlaceholderProps extends BoxProps { +interface AccountTitlePlaceholderProps { account: StacksAccount; } -function AccountTitlePlaceholder({ account, ...rest }: AccountTitlePlaceholderProps) { +function AccountTitlePlaceholder({ account }: AccountTitlePlaceholderProps) { const name = `Account ${account?.index + 1}`; - return ( - - {name} - - ); -} - -interface AccountTitleProps { - account: StacksAccount; - name: string; -} -function AccountTitle({ name }: AccountTitleProps) { - return {name}; + return {name}; } interface ChooseAccountItemProps extends FlexProps { @@ -53,30 +35,23 @@ interface ChooseAccountItemProps extends FlexProps { onSelectAccount(index: number): void; } const ChooseAccountItem = memo( - ({ selectedAddress, account, isLoading, onSelectAccount }: ChooseAccountItemProps) => { + ({ account, isLoading, onSelectAccount }: ChooseAccountItemProps) => { const [component, bind] = usePressable(true); - const { decodedAuthRequest } = useOnboardingState(); const name = useAccountDisplayName(account); const btcAddress = useNativeSegwitAccountIndexAddressIndexZero(account.index); - const showLoadingProps = !!selectedAddress || !decodedAuthRequest; - const accountSlug = useMemo(() => slugify(`Account ${account?.index + 1}`), [account?.index]); return ( // Padding required on outer element to prevent jumpy list behaviours in // virtualised list library - + - } - > - + }> + {name} } avatar={ @@ -111,11 +86,11 @@ const AddAccountAction = memo(() => { }; return ( - - - - Generate new account - + + + + Generate new account + {component} ); @@ -143,7 +118,7 @@ export const ChooseAccountsList = memo(() => { if (!accounts) return null; return ( - + {whenWallet({ software: , ledger: <> })} - - + + Fast checkout - - + + ); } diff --git a/src/app/pages/fund/components/fund-account-tile.tsx b/src/app/pages/fund/components/fund-account-tile.tsx index 52a38807f11..7c8d7aafe26 100644 --- a/src/app/pages/fund/components/fund-account-tile.tsx +++ b/src/app/pages/fund/components/fund-account-tile.tsx @@ -1,7 +1,5 @@ -import { Box, Stack, color, transition } from '@stacks/ui'; import { FundPageSelectors } from '@tests/selectors/fund.selectors'; -import { styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; +import { Box, HStack, Stack, styled } from 'leather-styles/jsx'; interface FundAccountTileProps { attributes?: React.JSX.Element; @@ -16,10 +14,9 @@ export function FundAccountTile(props: FundAccountTileProps) { const { attributes, description, icon, onClickTile, receiveStxIcon, testId, title } = props; return ( - - - + + {receiveStxIcon} {title} - + {description} - - {attributes} - + {attributes} - + ); } diff --git a/src/app/pages/fund/components/receive-stx-item.tsx b/src/app/pages/fund/components/receive-stx-item.tsx index a815ad93173..2b77bb58e3a 100644 --- a/src/app/pages/fund/components/receive-stx-item.tsx +++ b/src/app/pages/fund/components/receive-stx-item.tsx @@ -1,8 +1,8 @@ import QRCodeIcon from '@assets/images/fund/qr-code-icon.png'; import ReceiveStxEllipses from '@assets/images/fund/receive-stx-ellipses.png'; import StacksIcon from '@assets/images/fund/stacks-icon.png'; -import { Box } from '@stacks/ui'; import { FundPageSelectors } from '@tests/selectors/fund.selectors'; +import { Box } from 'leather-styles/jsx'; import { FundAccountTile } from './fund-account-tile'; diff --git a/src/app/pages/fund/components/zero-percent-fees-badge.tsx b/src/app/pages/fund/components/zero-percent-fees-badge.tsx index d23d6668787..70e5f9f4e0e 100644 --- a/src/app/pages/fund/components/zero-percent-fees-badge.tsx +++ b/src/app/pages/fund/components/zero-percent-fees-badge.tsx @@ -1,28 +1,23 @@ -import { FiStar } from 'react-icons/fi'; +import { HStack, styled } from 'leather-styles/jsx'; -import { Stack, color } from '@stacks/ui'; - -import { Caption } from '@app/components/typography'; +import { StarIcon } from '@app/ui/components/icons/star-icon'; export function ZeroPercentFeesBadge() { return ( - - - - 0% Fees - - + + + 0 % Fees + + ); } diff --git a/src/app/pages/fund/fund.layout.tsx b/src/app/pages/fund/fund.layout.tsx index 77ec766e094..17602355322 100644 --- a/src/app/pages/fund/fund.layout.tsx +++ b/src/app/pages/fund/fund.layout.tsx @@ -24,7 +24,7 @@ export function FundLayout({ address }: FundLayoutProps) { Let's get funds into your wallet diff --git a/src/app/pages/home/components/account-actions.tsx b/src/app/pages/home/components/account-actions.tsx index b5d548f9409..62a7cf50f57 100644 --- a/src/app/pages/home/components/account-actions.tsx +++ b/src/app/pages/home/components/account-actions.tsx @@ -6,10 +6,11 @@ import { Flex, FlexProps } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { useWalletType } from '@app/common/use-wallet-type'; -import { ArrowDown } from '@app/components/icons/arrow-down'; -import { Plus2 } from '@app/components/icons/plus2'; -import { SwapIcon } from '@app/components/icons/swap-icon'; import { useConfigBitcoinEnabled } from '@app/query/common/remote-config/remote-config.query'; +import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ArrowDownIcon } from '@app/ui/components/icons/arrow-down-icon'; +import { PlusIcon } from '@app/ui/components/icons/plus-icon'; +import { SwapIcon } from '@app/ui/components/icons/swap-icon'; import { ActionButton } from './action-button'; import { SendButton } from './send-button'; @@ -19,6 +20,7 @@ export function AccountActions(props: FlexProps) { const location = useLocation(); const isBitcoinEnabled = useConfigBitcoinEnabled(); const { whenWallet } = useWalletType(); + const stacksAccount = useCurrentStacksAccount(); const receivePath = isBitcoinEnabled ? RouteUrls.Receive @@ -29,24 +31,23 @@ export function AccountActions(props: FlexProps) { } + icon={} label="Receive" onClick={() => navigate(receivePath, { state: { backgroundLocation: location } })} /> - } - label="Buy" - onClick={() => navigate(RouteUrls.Fund)} - /> + + {!!stacksAccount && ( + } + label="Buy" + onClick={() => navigate(RouteUrls.Fund)} + /> + )} + {whenWallet({ software: ( - } - label="Swap" - onClick={() => navigate(RouteUrls.Swap)} - /> + } label="Swap" onClick={() => navigate(RouteUrls.Swap)} /> ), ledger: null, })} diff --git a/src/app/pages/home/components/account-area.tsx b/src/app/pages/home/components/account-area.tsx index 6268de8af0a..c611ba8e090 100644 --- a/src/app/pages/home/components/account-area.tsx +++ b/src/app/pages/home/components/account-area.tsx @@ -1,6 +1,6 @@ import { memo } from 'react'; -import { Stack, StackProps } from '@stacks/ui'; +import { HStack, HstackProps, Stack } from 'leather-styles/jsx'; import { CurrentAccountAvatar } from '@app/features/current-account/current-account-avatar'; import { CurrentAccountName } from '@app/features/current-account/current-account-name'; @@ -9,20 +9,20 @@ import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/s import { AccountTotalBalance } from '../../../components/account-total-balance'; -export const CurrentAccount = memo((props: StackProps) => { +export const CurrentAccount = memo((props: HstackProps) => { const currentAccount = useCurrentStacksAccount(); const btcAddress = useCurrentAccountNativeSegwitAddressIndexZero(); if (!currentAccount) return null; return ( - + - + - + - + - + ); }); diff --git a/src/app/pages/home/components/account-info-card.tsx b/src/app/pages/home/components/account-info-card.tsx index 7e9ba9cecb7..1b2ee7d7d8b 100644 --- a/src/app/pages/home/components/account-info-card.tsx +++ b/src/app/pages/home/components/account-info-card.tsx @@ -4,10 +4,10 @@ import { Box, Divider, Flex, styled } from 'leather-styles/jsx'; import { useCurrentAccountDisplayName } from '@app/common/hooks/account/use-account-names'; import { useTotalBalance } from '@app/common/hooks/balance/use-total-balance'; import { useDrawers } from '@app/common/hooks/use-drawers'; -import { LeatherButton } from '@app/components/button/button'; -import { ChevronDownIcon } from '@app/components/icons/chevron-down-icon'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { LeatherButton } from '@app/ui/components/button'; +import { ChevronDownIcon } from '@app/ui/components/icons/chevron-down-icon'; import { AccountActions } from './account-actions'; @@ -26,8 +26,8 @@ export function AccountInfoCard() { bgColor={{ base: 'brown.2', sm: 'unset' }} rounded="10px" px={{ base: 'space.05', sm: '0' }} - pt={{ base: 'space.05', sm: 'space.07' }} - pb={{ base: 'space.02', sm: 'space.07' }} + pt={{ base: 'space.05', sm: 'space.06' }} + pb={{ base: 'space.02', sm: 'space.06' }} > setIsShowingSwitchAccountsState(true)} @@ -35,11 +35,7 @@ export function AccountInfoCard() { _before={{ bg: 'transparent' }} > - + {name} @@ -47,7 +43,11 @@ export function AccountInfoCard() { - + {totalBalance?.totalUsdBalance} diff --git a/src/app/pages/home/components/action-button.tsx b/src/app/pages/home/components/action-button.tsx index f14dc827d34..2a2b9f09154 100644 --- a/src/app/pages/home/components/action-button.tsx +++ b/src/app/pages/home/components/action-button.tsx @@ -1,6 +1,6 @@ -import { Flex, styled } from 'leather-styles/jsx'; +import { Box, Flex, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import AccessibleIcon from './accessible-icon'; @@ -19,7 +19,11 @@ export function ActionButton({ icon, label, ...rest }: ActionButtonProps) { {...rest} > - {icon} + + + {icon} + + {label} diff --git a/src/app/pages/home/components/home-tabs.tsx b/src/app/pages/home/components/home-tabs.tsx index d730dd534f8..7487db82bc3 100644 --- a/src/app/pages/home/components/home-tabs.tsx +++ b/src/app/pages/home/components/home-tabs.tsx @@ -1,8 +1,7 @@ import { Suspense, useCallback, useMemo } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Box, Stack } from '@stacks/ui'; -import type { StackProps } from '@stacks/ui'; +import { Box, Stack } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; @@ -10,7 +9,7 @@ import { useLocationState } from '@app/common/hooks/use-location-state'; import { LoadingSpinner } from '@app/components/loading-spinner'; import { Tabs } from '@app/components/tabs'; -interface HomeTabsProps extends StackProps { +interface HomeTabsProps { children: React.ReactNode; } // TODO #4013: Abstract this to generic RouteTab once choose-fee-tab updated @@ -37,7 +36,7 @@ export function HomeTabs({ children }: HomeTabsProps) { ); return ( - + }> {children} diff --git a/src/app/pages/home/components/home.layout.tsx b/src/app/pages/home/components/home.layout.tsx index 06ac7e45cb7..c614f076f3c 100644 --- a/src/app/pages/home/components/home.layout.tsx +++ b/src/app/pages/home/components/home.layout.tsx @@ -11,11 +11,11 @@ export function HomeLayout({ children }: HomeLayoutProps) { {children} diff --git a/src/app/pages/home/components/send-button.tsx b/src/app/pages/home/components/send-button.tsx index de939f7fee6..74bf9d04f2b 100644 --- a/src/app/pages/home/components/send-button.tsx +++ b/src/app/pages/home/components/send-button.tsx @@ -1,5 +1,4 @@ import { Suspense, memo } from 'react'; -import { FiArrowUp } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { HomePageSelectors } from '@tests/selectors/home.selectors'; @@ -9,12 +8,12 @@ import { RouteUrls } from '@shared/route-urls'; import { useWalletType } from '@app/common/use-wallet-type'; import { whenPageMode } from '@app/common/utils'; import { openIndexPageInNewTab } from '@app/common/utils/open-in-new-tab'; -import { ArrowUpIcon } from '@app/components/icons/arrow-up-icon'; import { useStacksAnchoredCryptoCurrencyAssetBalance, useTransferableStacksFungibleTokenAssetBalances, } from '@app/query/stacks/balance/stacks-ft-balances.hooks'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ArrowUpIcon } from '@app/ui/components/icons/arrow-up-icon'; import { ActionButton } from './action-button'; @@ -46,7 +45,9 @@ function SendButtonSuspense() { ); } -const SendButtonFallback = memo(() => } disabled />); +const SendButtonFallback = memo(() => ( + } disabled /> +)); export function SendButton() { return ( diff --git a/src/app/pages/onboarding/allow-diagnostics/allow-diagnostics-layout.tsx b/src/app/pages/onboarding/allow-diagnostics/allow-diagnostics-layout.tsx index fa9e2b2a6fa..0191a7151c4 100644 --- a/src/app/pages/onboarding/allow-diagnostics/allow-diagnostics-layout.tsx +++ b/src/app/pages/onboarding/allow-diagnostics/allow-diagnostics-layout.tsx @@ -1,12 +1,11 @@ -import { FiCheck } from 'react-icons/fi'; - import { Dialog } from '@radix-ui/themes'; import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; import { css } from 'leather-styles/css'; import { Box, Flex, HStack, Stack, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { LeatherIcon } from '@app/components/icons/leather-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { LeatherIcon } from '@app/ui/components/icons/leather-icon'; interface ReasonToAllowDiagnosticsProps { text: string; @@ -15,7 +14,7 @@ function ReasonToAllowDiagnostics({ text }: ReasonToAllowDiagnosticsProps) { return ( - + {text} @@ -37,7 +36,7 @@ export function AllowDiagnosticsLayout(props: AllowDiagnosticsLayoutProps) { backgroundColor: 'accent.background-primary', })} > - + Help us improve diff --git a/src/app/pages/onboarding/back-up-secret-key/components/back-up-secret-key.content.tsx b/src/app/pages/onboarding/back-up-secret-key/components/back-up-secret-key.content.tsx index 6d70cf968a3..661e79dd3d7 100644 --- a/src/app/pages/onboarding/back-up-secret-key/components/back-up-secret-key.content.tsx +++ b/src/app/pages/onboarding/back-up-secret-key/components/back-up-secret-key.content.tsx @@ -1,7 +1,9 @@ -import { FiEyeOff, FiLock, FiRotateCcw } from 'react-icons/fi'; - import { HStack, Stack, styled } from 'leather-styles/jsx'; +import { EyeSlashIcon } from '@app/ui/components/icons/eye-slash-icon'; +import { LockIcon } from '@app/ui/components/icons/lock-icon'; +import { RotateLeftIcon } from '@app/ui/components/icons/rotate-left-icon'; + export function BackUpSecretKeyContent(): React.JSX.Element { return ( <> @@ -22,15 +24,15 @@ export function BackUpSecretKeyContent(): React.JSX.Element { - + Your Secret Key gives access to your wallet - + Never share your Secret Key with anyone - + Store it somewhere 100% private and secure diff --git a/src/app/pages/onboarding/set-password/components/password-bars.tsx b/src/app/pages/onboarding/set-password/components/password-bars.tsx new file mode 100644 index 00000000000..a0190e4d5e1 --- /dev/null +++ b/src/app/pages/onboarding/set-password/components/password-bars.tsx @@ -0,0 +1,26 @@ +import { Box, Flex } from 'leather-styles/jsx'; + +interface PasswordStrengthBarsProps { + bars: string[]; +} +export function PasswordStrengthBars({ bars }: PasswordStrengthBarsProps) { + return ( + + {bars.map((bar: string, index: number) => { + return ( + + ); + })} + + ); +} diff --git a/src/app/pages/onboarding/set-password/components/password-field.tsx b/src/app/pages/onboarding/set-password/components/password-field.tsx index 4e222d31b4a..d2944b07ad6 100644 --- a/src/app/pages/onboarding/set-password/components/password-field.tsx +++ b/src/app/pages/onboarding/set-password/components/password-field.tsx @@ -1,13 +1,13 @@ -import { useState } from 'react'; -import { FiEye, FiEyeOff } from 'react-icons/fi'; +import { useMemo, useState } from 'react'; -import { Box, Button, Flex, Input, color } from '@stacks/ui'; import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; import { useField } from 'formik'; -import { token } from 'leather-styles/tokens'; +import { Box, Flex, styled } from 'leather-styles/jsx'; import { ValidatedPassword } from '@app/common/validation/validate-password'; -import { Caption } from '@app/components/typography'; +import { EyeIcon } from '@app/ui/components/icons/eye-icon'; +import { EyeSlashIcon } from '@app/ui/components/icons/eye-slash-icon'; +import { Caption } from '@app/ui/components/typography/caption'; import { getIndicatorsOfPasswordStrength } from './password-field.utils'; import { PasswordStrengthIndicator } from './password-strength-indicator'; @@ -20,44 +20,57 @@ export function PasswordField({ strengthResult, isDisabled }: PasswordFieldProps const [field] = useField('password'); const [showPassword, setShowPassword] = useState(false); - const { strengthColor, strengthText } = getIndicatorsOfPasswordStrength(strengthResult); + const { strengthColor, strengthText } = useMemo( + () => getIndicatorsOfPasswordStrength(strengthResult), + [strengthResult] + ); return ( <> - - + {showPassword ? : } + - + - Password strength: + Password strength: {field.value ? strengthText : '—'} diff --git a/src/app/pages/onboarding/set-password/components/password-field.utils.ts b/src/app/pages/onboarding/set-password/components/password-field.utils.ts index 59460a649aa..778fe5b539d 100644 --- a/src/app/pages/onboarding/set-password/components/password-field.utils.ts +++ b/src/app/pages/onboarding/set-password/components/password-field.utils.ts @@ -1,32 +1,32 @@ -import { color } from '@stacks/ui'; +import { token } from 'leather-styles/tokens'; import { PasswordStrength, ValidatedPassword } from '@app/common/validation/validate-password'; -export const defaultColor = '#EFEFF2'; +export const defaultColor = token('colors.accent.background-secondary'); const strengthStyles = { [PasswordStrength.NoScore]: { - strengthColor: color('feedback-error'), + strengthColor: token('colors.error.label'), strengthText: 'Poor', }, [PasswordStrength.PoorScore]: { - strengthColor: color('feedback-error'), + strengthColor: token('colors.error.label'), strengthText: 'Poor', }, [PasswordStrength.WeakScore]: { - strengthColor: color('feedback-alert'), + strengthColor: token('colors.warning.label'), strengthText: 'Weak', }, [PasswordStrength.AverageScore]: { - strengthColor: '#F0C000', + strengthColor: token('colors.warning.label'), strengthText: 'Average', }, [PasswordStrength.StrongScore]: { - strengthColor: '#F0C000', + strengthColor: token('colors.warning.label'), strengthText: 'Average', }, [PasswordStrength.MeetsAllRequirements]: { - strengthColor: color('feedback-success'), + strengthColor: token('colors.success.label'), strengthText: 'Strong', }, }; diff --git a/src/app/pages/onboarding/set-password/components/password-strength-indicator.tsx b/src/app/pages/onboarding/set-password/components/password-strength-indicator.tsx index d0b99218579..5b9187a869f 100644 --- a/src/app/pages/onboarding/set-password/components/password-strength-indicator.tsx +++ b/src/app/pages/onboarding/set-password/components/password-strength-indicator.tsx @@ -1,53 +1,44 @@ import { useMemo } from 'react'; -import { Box, Stack } from '@stacks/ui'; - import { createNullArrayOfLength } from '@app/common/utils'; import { ValidatedPassword } from '@app/common/validation/validate-password'; +import { PasswordStrengthBars } from './password-bars'; import { defaultColor } from './password-field.utils'; function fillArray(amount: number) { - return (item: (i: number) => React.JSX.Element) => - createNullArrayOfLength(amount).map((_, i) => item(i)); + return (item: (i: number) => string) => createNullArrayOfLength(amount).map((_, i) => item(i)); } interface PasswordStrengthIndicatorProps { + password: string; strengthColor: string; strengthResult: ValidatedPassword; } -export function PasswordStrengthIndicator(props: PasswordStrengthIndicatorProps) { - const { strengthColor, strengthResult } = props; - +export function PasswordStrengthIndicator({ + password, + strengthColor, + strengthResult, +}: PasswordStrengthIndicatorProps) { const bars = useMemo(() => { - if (strengthResult.password.trim() === '') - return fillArray(4)(i => ); + if (strengthResult.password.trim() === '' || password.trim() === '') + return fillArray(4)(() => defaultColor); if (strengthResult.score === 4 && !strengthResult.meetsAllStrengthRequirements) { - return [ - ...fillArray(3)(i => ), - ...fillArray(1)(i => ), - ]; + return [...fillArray(3)(() => strengthColor), ...fillArray(1)(() => defaultColor)]; } return [ - ...fillArray(Math.max(strengthResult.score, 1))(i => ( - - )), - ...fillArray(4 - Math.max(strengthResult.score, 1))(i => ( - - )), + ...fillArray(Math.max(strengthResult.score, 1))(() => strengthColor), + ...fillArray(4 - Math.max(strengthResult.score, 1))(() => defaultColor), ]; }, [ + password, strengthColor, strengthResult.meetsAllStrengthRequirements, strengthResult.password, strengthResult.score, ]); - return ( - - {bars} - - ); + return ; } diff --git a/src/app/pages/onboarding/set-password/set-password.tsx b/src/app/pages/onboarding/set-password/set-password.tsx index 441fcdc0613..75d1fa21b32 100644 --- a/src/app/pages/onboarding/set-password/set-password.tsx +++ b/src/app/pages/onboarding/set-password/set-password.tsx @@ -19,11 +19,11 @@ import { blankPasswordValidation, validatePassword, } from '@app/common/validation/validate-password'; -import { LeatherButton } from '@app/components/button/button'; import { Header } from '@app/components/header'; import { TwoColumnLayout } from '@app/components/secret-key/two-column.layout'; import { OnboardingGate } from '@app/routes/onboarding-gate'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { LeatherButton } from '@app/ui/components/button'; import { PasswordField } from './components/password-field'; diff --git a/src/app/pages/onboarding/sign-in/components/sign-in.content.tsx b/src/app/pages/onboarding/sign-in/components/sign-in.content.tsx index 8b5fd38393b..b3782f7898a 100644 --- a/src/app/pages/onboarding/sign-in/components/sign-in.content.tsx +++ b/src/app/pages/onboarding/sign-in/components/sign-in.content.tsx @@ -1,6 +1,6 @@ import { styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; export function SignInContent({ onClick, @@ -15,16 +15,10 @@ export function SignInContent({ Sign in
with your
Secret Key - + Speed things up by pasting your entire Secret Key in one go. - + {twentyFourWordMode ? 'Have a 12-word Secret Key?' : 'Use 24 word Secret Key'} diff --git a/src/app/pages/onboarding/sign-in/mnemonic-form.tsx b/src/app/pages/onboarding/sign-in/mnemonic-form.tsx index 0baf79b0fa5..f4c2e6f6029 100644 --- a/src/app/pages/onboarding/sign-in/mnemonic-form.tsx +++ b/src/app/pages/onboarding/sign-in/mnemonic-form.tsx @@ -5,10 +5,10 @@ import { Flex, styled } from 'leather-styles/jsx'; import { isEmpty } from '@shared/utils'; import { createNullArrayOfLength } from '@app/common/utils'; -import { LeatherButton } from '@app/components/button/button'; import { ErrorLabel } from '@app/components/error-label'; import { SecretKeyGrid } from '@app/components/secret-key/secret-key-grid'; import { useSignIn } from '@app/pages/onboarding/sign-in/hooks/use-sign-in'; +import { LeatherButton } from '@app/ui/components/button'; import { MnemonicWordInput } from '../../../components/secret-key/mnemonic-key/mnemonic-word-input'; import { diff --git a/src/app/pages/onboarding/welcome/welcome.layout.tsx b/src/app/pages/onboarding/welcome/welcome.layout.tsx index 3960964a7dd..f3e5ce85dbc 100644 --- a/src/app/pages/onboarding/welcome/welcome.layout.tsx +++ b/src/app/pages/onboarding/welcome/welcome.layout.tsx @@ -2,9 +2,9 @@ import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; import { Box, Flex, styled } from 'leather-styles/jsx'; import { useViewportMinWidth } from '@app/common/hooks/use-media-query'; -import { LeatherButton } from '@app/components/button/button'; -import { LeatherIcon } from '@app/components/icons/leather-icon'; -import { LeatherLettermark } from '@app/components/icons/leather-lettermark'; +import { LeatherButton } from '@app/ui/components/button'; +import { LeatherIcon } from '@app/ui/components/icons/leather-icon'; +import { LeatherLettermarkIcon } from '@app/ui/components/icons/leather-lettermark-icon'; interface WelcomeLayoutProps { tagline: React.ReactNode; @@ -14,16 +14,14 @@ interface WelcomeLayoutProps { onStartOnboarding(): void; onRestoreWallet(): void; } -export function WelcomeLayout(props: WelcomeLayoutProps): React.JSX.Element { - const { - tagline, - subheader, - isGeneratingWallet, - onStartOnboarding, - onSelectConnectLedger, - onRestoreWallet, - } = props; - +export function WelcomeLayout({ + tagline, + subheader, + isGeneratingWallet, + onStartOnboarding, + onSelectConnectLedger, + onRestoreWallet, +}: WelcomeLayoutProps): React.JSX.Element { const isAtleastBreakpointMd = useViewportMinWidth('md'); return ( @@ -95,7 +93,7 @@ export function WelcomeLayout(props: WelcomeLayoutProps): React.JSX.Element { flex={['', '', 1]} > - +
); diff --git a/src/app/pages/onboarding/welcome/welcome.tsx b/src/app/pages/onboarding/welcome/welcome.tsx index fb049a9b0df..fae11bd2dc8 100644 --- a/src/app/pages/onboarding/welcome/welcome.tsx +++ b/src/app/pages/onboarding/welcome/welcome.tsx @@ -24,7 +24,6 @@ export function WelcomePage() { const [isGeneratingWallet, setIsGeneratingWallet] = useState(false); useRouteHeader(<>); - const startOnboarding = useCallback(async () => { if (isPopupMode()) { openIndexPageInNewTab(RouteUrls.Onboarding); @@ -32,6 +31,8 @@ export function WelcomePage() { return; } setIsGeneratingWallet(true); + // #4517 signout other tabs on wallet create + await keyActions.signOut(); keyActions.generateWalletKey(); void analytics.track('generate_new_secret_key'); if (decodedAuthRequest) { diff --git a/src/app/pages/psbt-request/use-psbt-request.tsx b/src/app/pages/psbt-request/use-psbt-request.tsx index 61ba4142bd8..ec091af8b5c 100644 --- a/src/app/pages/psbt-request/use-psbt-request.tsx +++ b/src/app/pages/psbt-request/use-psbt-request.tsx @@ -7,7 +7,6 @@ import { finalizePsbt } from '@shared/actions/finalize-psbt'; import { RouteUrls } from '@shared/route-urls'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { SignPsbtArgs } from '@app/common/psbt/requests'; import { usePsbtRequestSearchParams } from '@app/common/psbt/use-psbt-request-params'; import { usePsbtSigner } from '@app/features/psbt-signer/hooks/use-psbt-signer'; @@ -35,29 +34,29 @@ export function usePsbtRequest() { tabId, }); }, - onSignPsbt({ inputs }: SignPsbtArgs) { + async onSignPsbt() { setIsLoading(true); void analytics.track('request_sign_psbt_submit'); const tx = getPsbtAsTransaction(payload.hex); try { - signPsbt({ indexesToSign: signAtIndex, inputs, tx }); + const signedTx = await signPsbt({ indexesToSign: signAtIndex, tx }); + + const signedPsbt = signedTx.toPSBT(); + + setIsLoading(false); + + finalizePsbt({ + data: { hex: bytesToHex(signedPsbt) }, + requestPayload: requestToken, + tabId, + }); } catch (e) { return navigate(RouteUrls.RequestError, { state: { message: e instanceof Error ? e.message : '', title: 'Failed to sign' }, }); } - - const psbt = tx.toPSBT(); - - setIsLoading(false); - - finalizePsbt({ - data: { hex: bytesToHex(psbt) }, - requestPayload: requestToken, - tabId, - }); }, }; }, [ diff --git a/src/app/pages/receive/components/address-qr-code.tsx b/src/app/pages/receive/components/address-qr-code.tsx index 10ea1830490..61d70fb7dd2 100644 --- a/src/app/pages/receive/components/address-qr-code.tsx +++ b/src/app/pages/receive/components/address-qr-code.tsx @@ -1,16 +1,17 @@ import { memo, useMemo } from 'react'; -import { Box, Flex, FlexProps, color } from '@stacks/ui'; import { createQR } from '@vkontakte/vk-qr'; +import { Box, Flex } from 'leather-styles/jsx'; +import { token } from 'leather-styles/tokens'; -export const QrCode = memo(({ principal, ...rest }: { principal: string } & FlexProps) => { +export const QrCode = memo(({ principal, ...rest }: { principal: string }) => { const qrSvg = useMemo( () => createQR(principal, { ecc: 0, qrSize: 180, - backgroundColor: color('text-body'), - foregroundColor: color('invert'), + backgroundColor: token('colors.accent.background-primary'), + foregroundColor: token('colors.accent.text-primary'), }), [principal] ); @@ -21,12 +22,12 @@ export const QrCode = memo(({ principal, ...rest }: { principal: string } & Flex diff --git a/src/app/pages/receive/components/receive-item.tsx b/src/app/pages/receive/components/receive-item.tsx index 02bdd74eee1..1b1c12f8454 100644 --- a/src/app/pages/receive/components/receive-item.tsx +++ b/src/app/pages/receive/components/receive-item.tsx @@ -1,10 +1,10 @@ -import { truncateMiddle } from '@stacks/ui-utils'; import { Flex, HStack, Stack, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { CopyIcon } from '@app/components/icons/copy-icon'; -import { QrCodeIcon } from '@app/components/icons/qr-code-icon'; import { Flag } from '@app/components/layout/flag'; +import { LeatherButton } from '@app/ui/components/button'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { QrCodeIcon } from '@app/ui/components/icons/qr-code-icon'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; interface ReceiveItemProps { address?: string; @@ -24,7 +24,7 @@ export function ReceiveItem({ }: ReceiveItemProps) { if (!address) return null; return ( - + {title} @@ -37,7 +37,7 @@ export function ReceiveItem({ {onClickQrCode && ( diff --git a/src/app/pages/receive/components/receive-items.tsx b/src/app/pages/receive/components/receive-items.tsx index f9775e4442c..d1c2d674ae9 100644 --- a/src/app/pages/receive/components/receive-items.tsx +++ b/src/app/pages/receive/components/receive-items.tsx @@ -7,8 +7,12 @@ interface ReceiveItemListProps { export function ReceiveItemList({ children, title }: ReceiveItemListProps) { return ( <> - {title && {title}} - + {title && ( + + {title} + + )} + {children} diff --git a/src/app/pages/receive/components/receive-tokens.layout.tsx b/src/app/pages/receive/components/receive-tokens.layout.tsx index 7bf223a76fb..54981fe688e 100644 --- a/src/app/pages/receive/components/receive-tokens.layout.tsx +++ b/src/app/pages/receive/components/receive-tokens.layout.tsx @@ -5,9 +5,9 @@ import { Box, Flex, styled } from 'leather-styles/jsx'; import { useLocationState } from '@app/common/hooks/use-location-state'; import { AddressDisplayer } from '@app/components/address-displayer/address-displayer'; -import { LeatherButton } from '@app/components/button/button'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; import { useBackgroundLocationRedirect } from '@app/routes/hooks/use-background-location-redirect'; +import { LeatherButton } from '@app/ui/components/button'; import { QrCode } from './address-qr-code'; @@ -45,8 +45,7 @@ export function ReceiveTokensLayout(props: ReceiveTokensLayoutProps) { data-testid={SharedComponentsSelectors.AddressDisplayer} flexWrap="wrap" justifyContent="center" - lineHeight={1.8} - maxWidth="280px" + maxWidth="300px" mt="space.04" > diff --git a/src/app/pages/receive/receive-modal.tsx b/src/app/pages/receive/receive-modal.tsx index 9f1414aa779..4d4d48be159 100644 --- a/src/app/pages/receive/receive-modal.tsx +++ b/src/app/pages/receive/receive-modal.tsx @@ -12,13 +12,13 @@ import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; import { useLocationState } from '@app/common/hooks/use-location-state'; import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; -import { BtcIcon } from '@app/components/icons/btc-icon'; -import { BtcStampsIcon } from '@app/components/icons/btc-stamps-icon'; -import { OrdinalIcon } from '@app/components/icons/ordinal-icon'; import { useBackgroundLocationRedirect } from '@app/routes/hooks/use-background-location-redirect'; import { useZeroIndexTaprootAddress } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useCurrentAccountStxAddressState } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; +import { StampsIcon } from '@app/ui/components/icons/stamps-icon'; import { ReceiveItem } from './components/receive-item'; import { ReceiveItemList } from './components/receive-items'; @@ -121,7 +121,7 @@ export function ReceiveModal({ type = 'full' }: ReceiveModalProps) { /> } + icon={} onClickQrCode={() => navigate(`${RouteUrls.Home}${RouteUrls.ReceiveBtcStamp}`, { state: { backgroundLocation }, diff --git a/src/app/pages/request-error/request-error.tsx b/src/app/pages/request-error/request-error.tsx index 5b01124605f..b5ea4df53dc 100644 --- a/src/app/pages/request-error/request-error.tsx +++ b/src/app/pages/request-error/request-error.tsx @@ -1,14 +1,11 @@ import { useLocation } from 'react-router-dom'; -import { Box, Text } from '@stacks/ui'; import get from 'lodash.get'; -import { GenericError } from '@app/components/generic-error/generic-error'; +import { GenericError, GenericErrorListItem } from '@app/components/generic-error/generic-error'; const helpTextList = [ - - Please report issue to requesting app - , + , ]; function useRequestErrorState() { diff --git a/src/app/pages/rpc-get-addresses/components/get-addresses.layout.tsx b/src/app/pages/rpc-get-addresses/components/get-addresses.layout.tsx index 008f5f53220..74574a34863 100644 --- a/src/app/pages/rpc-get-addresses/components/get-addresses.layout.tsx +++ b/src/app/pages/rpc-get-addresses/components/get-addresses.layout.tsx @@ -1,9 +1,9 @@ import { Box, Flex, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { LIcon } from '@app/components/icons/l-icon'; -import { LeatherIcon } from '@app/components/icons/leather-icon'; import { RequesterFlag } from '@app/components/requester-flag'; +import { LeatherButton } from '@app/ui/components/button'; +import { LeatherIcon } from '@app/ui/components/icons/leather-icon'; +import { LeatherLIcon } from '@app/ui/components/icons/leather-l-icon'; interface GetAddressesLayoutProps { requester: string; @@ -31,9 +31,7 @@ export function GetAddressesLayout(props: GetAddressesLayoutProps) { onUserApproveGetAddresses()} fullWidth> - - - + Connect Leather diff --git a/src/app/pages/rpc-get-addresses/use-request-accounts.ts b/src/app/pages/rpc-get-addresses/use-request-accounts.ts index 3b943234bf3..f365d46b723 100644 --- a/src/app/pages/rpc-get-addresses/use-request-accounts.ts +++ b/src/app/pages/rpc-get-addresses/use-request-accounts.ts @@ -8,8 +8,8 @@ import { closeWindow } from '@shared/utils'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useRpcRequestParams } from '@app/common/rpc-helpers'; -import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; -import { useCurrentAccountTaprootIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; +import { useCurrentAccountNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { useCurrentAccountTaprootSigner } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; import { useCurrentStacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { useAppPermissions } from '@app/store/app-permissions/app-permissions.slice'; @@ -19,32 +19,10 @@ export function useGetAddresses() { const permissions = useAppPermissions(); const { tabId, origin, requestId } = useRpcRequestParams(); - const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); - const taprootSigner = useCurrentAccountTaprootIndexZeroSigner(); + const createNativeSegwitSigner = useCurrentAccountNativeSegwitSigner(); + const createTaprootSigner = useCurrentAccountTaprootSigner(); const stacksAccount = useCurrentStacksAccount(); - const taprootAddressResponse: BtcAddress = { - symbol: 'BTC', - type: 'p2tr', - address: taprootSigner.address, - publicKey: bytesToHex(taprootSigner.publicKey), - tweakedPublicKey: bytesToHex(ecdsaPublicKeyToSchnorr(taprootSigner.publicKey)), - derivationPath: taprootSigner.derivationPath, - }; - - const nativeSegwitAddressResponse: BtcAddress = { - symbol: 'BTC', - type: 'p2wpkh', - address: nativeSegwitSigner.address, - publicKey: bytesToHex(nativeSegwitSigner.publicKey), - derivationPath: nativeSegwitSigner.derivationPath, - }; - - const stacksAddressResponse = { - symbol: 'STX', - address: stacksAccount?.address ?? '', - }; - return { origin, onUserApproveGetAddresses() { @@ -52,20 +30,52 @@ export function useGetAddresses() { logger.error('Cannot give app accounts: missing tabId, origin'); return; } + + const keysToIncludeInResponse = []; + + if (createNativeSegwitSigner) { + const nativeSegwitSigner = createNativeSegwitSigner(0); + + const nativeSegwitAddressResponse: BtcAddress = { + symbol: 'BTC', + type: 'p2wpkh', + address: nativeSegwitSigner.address, + publicKey: bytesToHex(nativeSegwitSigner.publicKey), + derivationPath: nativeSegwitSigner.derivationPath, + }; + + keysToIncludeInResponse.push(nativeSegwitAddressResponse); + } + + if (createTaprootSigner) { + const taprootSigner = createTaprootSigner(0); + const taprootAddressResponse: BtcAddress = { + symbol: 'BTC', + type: 'p2tr', + address: taprootSigner.address, + publicKey: bytesToHex(taprootSigner.publicKey), + tweakedPublicKey: bytesToHex(ecdsaPublicKeyToSchnorr(taprootSigner.publicKey)), + derivationPath: taprootSigner.derivationPath, + }; + keysToIncludeInResponse.push(taprootAddressResponse); + } + + if (stacksAccount) { + const stacksAddressResponse = { + symbol: 'STX', + address: stacksAccount?.address ?? '', + }; + + keysToIncludeInResponse.push(stacksAddressResponse); + } + void analytics.track('user_approved_get_addresses', { origin }); permissions.hasRequestedAccounts(origin); chrome.tabs.sendMessage( tabId, makeRpcSuccessResponse('getAddresses', { id: requestId, - result: { - addresses: [ - nativeSegwitAddressResponse, - taprootAddressResponse, - // casting until btckit has better extend support - stacksAddressResponse as any, - ], - }, + result: { addresses: keysToIncludeInResponse as any }, }) ); closeWindow(); diff --git a/src/app/pages/rpc-send-transfer/components/rpc-send-transfer-container.layout.tsx b/src/app/pages/rpc-send-transfer/components/rpc-send-transfer-container.layout.tsx index 5ccf8341ee6..8b0d8a3e761 100644 --- a/src/app/pages/rpc-send-transfer/components/rpc-send-transfer-container.layout.tsx +++ b/src/app/pages/rpc-send-transfer/components/rpc-send-transfer-container.layout.tsx @@ -1,10 +1,10 @@ -import { Flex } from '@stacks/ui'; +import { Flex } from 'leather-styles/jsx'; import { HasChildren } from '@app/common/has-children'; export function RpcSendTransferContainerLayout({ children }: HasChildren) { return ( - + {children} ); diff --git a/src/app/pages/rpc-send-transfer/components/send-transfer-actions.tsx b/src/app/pages/rpc-send-transfer/components/send-transfer-actions.tsx index bc5f6896cfa..1fa62fc761b 100644 --- a/src/app/pages/rpc-send-transfer/components/send-transfer-actions.tsx +++ b/src/app/pages/rpc-send-transfer/components/send-transfer-actions.tsx @@ -1,4 +1,4 @@ -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; import { SendTransferFooter } from './send-transfer-footer'; @@ -10,7 +10,7 @@ interface SendTransferActionsProps { export function SendTransferActions({ action, isLoading, onApprove }: SendTransferActionsProps) { return ( - + {action} diff --git a/src/app/pages/rpc-send-transfer/components/send-transfer-confirmation-details.tsx b/src/app/pages/rpc-send-transfer/components/send-transfer-confirmation-details.tsx index 0a39ebf77ba..e84b29b1bb9 100644 --- a/src/app/pages/rpc-send-transfer/components/send-transfer-confirmation-details.tsx +++ b/src/app/pages/rpc-send-transfer/components/send-transfer-confirmation-details.tsx @@ -1,5 +1,4 @@ -import { Stack, Text, color } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; +import { HStack, Stack, styled } from 'leather-styles/jsx'; interface SendTransferConfirmationDetailsProps { currentAddress: string; @@ -18,32 +17,32 @@ export function SendTransferConfirmationDetails({ return ( - From - {currentAddress} + From + {currentAddress} - To - {recipient} + To + {recipient} - Fee - {feeRowValue} + Fee + {feeRowValue} - Total - {total} + Total + {total} {time && ( - Estimated Time - {time} + Estimated Time + {time} )} diff --git a/src/app/pages/rpc-send-transfer/components/send-transfer-details.tsx b/src/app/pages/rpc-send-transfer/components/send-transfer-details.tsx index e7c9eb022a4..7611268b90a 100644 --- a/src/app/pages/rpc-send-transfer/components/send-transfer-details.tsx +++ b/src/app/pages/rpc-send-transfer/components/send-transfer-details.tsx @@ -1,6 +1,7 @@ -import { truncateMiddle } from '@stacks/ui-utils'; import { HStack, Stack, styled } from 'leather-styles/jsx'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; + interface SendTransferDetailsProps { address: string; amount: string; @@ -11,7 +12,7 @@ export function SendTransferDetails({ address, amount, currentAddress }: SendTra diff --git a/src/app/pages/rpc-send-transfer/components/send-transfer-header.tsx b/src/app/pages/rpc-send-transfer/components/send-transfer-header.tsx index a9821b59145..57cf469ac9e 100644 --- a/src/app/pages/rpc-send-transfer/components/send-transfer-header.tsx +++ b/src/app/pages/rpc-send-transfer/components/send-transfer-header.tsx @@ -1,5 +1,4 @@ -import { Flex } from '@stacks/ui'; -import { styled } from 'leather-styles/jsx'; +import { Flex, styled } from 'leather-styles/jsx'; import { Favicon } from '@app/components/favicon'; import { Flag } from '@app/components/layout/flag'; @@ -13,12 +12,12 @@ export function SendTransferHeader({ amount, origin }: SendTransferHeaderProps) const caption = origin ? `Requested by ${origin}` : null; return ( - + {title} {caption && ( - } pl="tight"> + } pl="space.02"> {caption} diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer-choose-fee.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer-choose-fee.tsx index ec065c5f6dc..6fa4797a0cb 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer-choose-fee.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer-choose-fee.tsx @@ -1,15 +1,12 @@ -import { useLocation, useNavigate } from 'react-router-dom'; - -import get from 'lodash.get'; +import { Outlet, useNavigate } from 'react-router-dom'; import { logger } from '@shared/logger'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; import { createMoney } from '@shared/models/money.model'; import { RouteUrls } from '@shared/route-urls'; -import { noop } from '@shared/utils'; -import { useGenerateSignedNativeSegwitTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; -import { useWalletType } from '@app/common/use-wallet-type'; +import { useLocationStateWithCache } from '@app/common/hooks/use-location-state'; +import { useGenerateUnsignedNativeSegwitSingleRecipientTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; import { BitcoinFeesList, OnChooseFeeArgs, @@ -18,29 +15,27 @@ import { useBitcoinFeesList } from '@app/components/bitcoin-fees-list/use-bitcoi import { BitcoinChooseFee } from '@app/features/bitcoin-choose-fee/bitcoin-choose-fee'; import { useValidateBitcoinSpend } from '@app/features/bitcoin-choose-fee/hooks/use-validate-bitcoin-spend'; import { UtxoResponseItem } from '@app/query/bitcoin/bitcoin-client'; +import { useSignBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { formFeeRowValue } from '../../common/send/utils'; import { useRpcSendTransferState } from './rpc-send-transfer-container'; function useRpcSendTransferFeeState() { - const location = useLocation(); - const amount = get(location.state, 'amount'); + const amount = useLocationStateWithCache('amount'); const amountAsMoney = createMoney(Number(amount), 'BTC'); - const utxos = get(location.state, 'utxos') as UtxoResponseItem[]; + const utxos = useLocationStateWithCache('utxos') as UtxoResponseItem[]; + const address = useLocationStateWithCache('address') as string; - return { - address: get(location.state, 'address') as string, - amountAsMoney, - utxos, - }; + return { address, amountAsMoney, utxos }; } export function RpcSendTransferChooseFee() { const { selectedFeeType, setSelectedFeeType } = useRpcSendTransferState(); const { address, amountAsMoney, utxos } = useRpcSendTransferFeeState(); const navigate = useNavigate(); - const { whenWallet } = useWalletType(); - const generateTx = useGenerateSignedNativeSegwitTx(); + + const generateTx = useGenerateUnsignedNativeSegwitSingleRecipientTx(); + const signTransaction = useSignBitcoinTx(); const { feesList, isLoading } = useBitcoinFeesList({ amount: Number(amountAsMoney.amount), recipient: address, @@ -51,49 +46,51 @@ export function RpcSendTransferChooseFee() { const { showInsufficientBalanceError, onValidateBitcoinFeeSpend } = useValidateBitcoinSpend(); async function previewTransfer({ feeRate, feeValue, time, isCustomFee }: OnChooseFeeArgs) { - const resp = generateTx({ amount: amountAsMoney, recipient: address }, feeRate, utxos); + const resp = await generateTx({ amount: amountAsMoney, recipient: address }, feeRate, utxos); if (!resp) return logger.error('Attempted to generate raw tx, but no tx exists'); - const { hex } = resp; + const tx = await signTransaction(resp.psbt); + + tx.finalize(); const feeRowValue = formFeeRowValue(feeRate, isCustomFee); - whenWallet({ - software: () => - navigate(RouteUrls.RpcSendTransferConfirmation, { - state: { - fee: feeValue, - recipient: address, - time, - tx: hex, - feeRowValue, - }, - }), - ledger: noop, - })(); + + navigate(RouteUrls.RpcSendTransferConfirmation, { + state: { + fee: feeValue, + recipient: address, + time, + tx: tx.hex, + feeRowValue, + }, + }); } return ( - setSelectedFeeType(value)} - selectedFeeType={selectedFeeType} - /> - } - isLoading={isLoading} - isSendingMax={false} - onChooseFee={previewTransfer} - onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} - onValidateBitcoinSpend={onValidateBitcoinFeeSpend} - recipient={address} - recommendedFeeRate={recommendedFeeRate} - showError={showInsufficientBalanceError} - maxRecommendedFeeRate={feesList[0]?.feeRate} - /> + <> + + setSelectedFeeType(value)} + selectedFeeType={selectedFeeType} + /> + } + isLoading={isLoading} + isSendingMax={false} + onChooseFee={previewTransfer} + onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} + onValidateBitcoinSpend={onValidateBitcoinFeeSpend} + recipient={address} + recommendedFeeRate={recommendedFeeRate} + showError={showInsufficientBalanceError} + maxRecommendedFeeRate={feesList[0]?.feeRate} + /> + ); } diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx index cad4b9a3ea4..03231b49b59 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer-confirmation.tsx @@ -1,6 +1,5 @@ import { useLocation, useNavigate } from 'react-router-dom'; -import { truncateMiddle } from '@stacks/ui-utils'; import get from 'lodash.get'; import { decodeBitcoinTx } from '@shared/crypto/bitcoin/bitcoin.utils'; @@ -18,6 +17,7 @@ import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountNativeSegwitAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { SendTransferActions } from './components/send-transfer-actions'; import { SendTransferConfirmationDetails } from './components/send-transfer-confirmation-details'; @@ -113,7 +113,6 @@ export function RpcSendTransferConfirmation() { }, onError(e) { logger.error('Error broadcasting tx', e); - // TODO: Error page }, }); } diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer-summary.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer-summary.tsx index bc450eb94a0..4c27bc4fe2f 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer-summary.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer-summary.tsx @@ -1,8 +1,7 @@ import toast from 'react-hot-toast'; -import { FiCheck, FiCopy, FiExternalLink } from 'react-icons/fi'; import { useLocation } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { HStack, Stack } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; @@ -16,6 +15,9 @@ import { InfoCardRow, InfoCardSeparator, } from '@app/components/info-card/info-card'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; export function RpcSendTransferSummary() { const { state } = useLocation(); @@ -52,14 +54,14 @@ export function RpcSendTransferSummary() { <> } + mb="space.05" symbol={symbol} - icon={FiCheck} - mb="loose" + value={txValue} /> - + } /> @@ -68,10 +70,14 @@ export function RpcSendTransferSummary() { {arrivesIn && } - - - - + + } + label="View details" + onClick={onClickLink} + /> + } label="Copy ID" onClick={onClickCopy} /> + diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer.routes.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer.routes.tsx index cb85eee714f..104ea009fe4 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer.routes.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer.routes.tsx @@ -2,6 +2,7 @@ import { Route } from 'react-router-dom'; import { RouteUrls } from '@shared/route-urls'; +import { ledgerBitcoinTxSigningRoutes } from '@app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container'; import { AccountGate } from '@app/routes/account-gate'; import { RpcSendTransfer } from './rpc-send-transfer'; @@ -19,7 +20,9 @@ export const rpcSendTransferRoutes = ( } > } /> - } /> + }> + {ledgerBitcoinTxSigningRoutes} + } /> } /> diff --git a/src/app/pages/rpc-send-transfer/rpc-send-transfer.tsx b/src/app/pages/rpc-send-transfer/rpc-send-transfer.tsx index f631aba0b5e..ba7abe1c529 100644 --- a/src/app/pages/rpc-send-transfer/rpc-send-transfer.tsx +++ b/src/app/pages/rpc-send-transfer/rpc-send-transfer.tsx @@ -3,7 +3,6 @@ import BigNumber from 'bignumber.js'; import { createMoney } from '@shared/models/money.model'; import { formatMoneyPadded } from '@app/common/money/format-money'; -import { useRejectIfLedgerWallet } from '@app/common/rpc-helpers'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { SendTransferActions } from './components/send-transfer-actions'; @@ -12,8 +11,6 @@ import { SendTransferHeader } from './components/send-transfer-header'; import { useRpcSendTransfer } from './use-rpc-send-transfer'; export function RpcSendTransfer() { - useRejectIfLedgerWallet('sendTransfer'); - const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); const { address, amount, onChooseTransferFee, origin } = useRpcSendTransfer(); const amountAsMoney = createMoney(new BigNumber(amount), 'BTC'); diff --git a/src/app/pages/rpc-send-transfer/use-rpc-send-transfer.ts b/src/app/pages/rpc-send-transfer/use-rpc-send-transfer.ts index 66804cb59eb..ca4ec6d4810 100644 --- a/src/app/pages/rpc-send-transfer/use-rpc-send-transfer.ts +++ b/src/app/pages/rpc-send-transfer/use-rpc-send-transfer.ts @@ -2,12 +2,10 @@ import { useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { RouteUrls } from '@shared/route-urls'; -import { noop } from '@shared/utils'; import { useDefaultRequestParams } from '@app/common/hooks/use-default-request-search-params'; import { useOnMount } from '@app/common/hooks/use-on-mount'; import { initialSearchParams } from '@app/common/initial-search-params'; -import { useWalletType } from '@app/common/use-wallet-type'; import { useCurrentNativeSegwitAccountSpendableUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; export function useRpcSendTransferRequestParams() { @@ -25,7 +23,6 @@ export function useRpcSendTransferRequestParams() { export function useRpcSendTransfer() { const navigate = useNavigate(); - const { whenWallet } = useWalletType(); const { address, amount, origin } = useRpcSendTransferRequestParams(); const { data: utxos = [], refetch } = useCurrentNativeSegwitAccountSpendableUtxos(); @@ -40,17 +37,9 @@ export function useRpcSendTransfer() { origin, utxos, async onChooseTransferFee() { - whenWallet({ - software: () => - navigate(RouteUrls.RpcSendTransferChooseFee, { - state: { - address, - amount, - utxos, - }, - }), - ledger: noop, - })(); + navigate(RouteUrls.RpcSendTransferChooseFee, { + state: { address, amount, utxos }, + }); }, }; } diff --git a/src/app/pages/rpc-sign-bip322-message/rpc-sign-bip322-message.tsx b/src/app/pages/rpc-sign-bip322-message/rpc-sign-bip322-message.tsx index dff5d1bb75b..192f19d16d1 100644 --- a/src/app/pages/rpc-sign-bip322-message/rpc-sign-bip322-message.tsx +++ b/src/app/pages/rpc-sign-bip322-message/rpc-sign-bip322-message.tsx @@ -1,9 +1,8 @@ -import { truncateMiddle } from '@stacks/ui-utils'; +import { Outlet } from 'react-router-dom'; import { closeWindow } from '@shared/utils'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; -import { useRejectIfLedgerWallet } from '@app/common/rpc-helpers'; import { Disclaimer } from '@app/components/disclaimer'; import { NoFeesWarningRow } from '@app/components/no-fees-warning-row'; import { PopupHeader } from '@app/features/current-account/popup-header'; @@ -11,6 +10,7 @@ import { MessagePreviewBox } from '@app/features/message-signer/message-preview- import { MessageSigningRequestLayout } from '@app/features/message-signer/message-signing-request.layout'; import { AccountGate } from '@app/routes/account-gate'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; +import { truncateMiddle } from '@app/ui/utils/truncate-middle'; import { MessageSigningHeader } from '../../features/message-signer/message-signing-header'; import { SignMessageActions } from '../../features/message-signer/stacks-sign-message-action'; @@ -28,7 +28,6 @@ export function RpcSignBip322MessageRoute() { function RpcSignBip322Message() { useRouteHeader(); - useRejectIfLedgerWallet('signMessage'); const { origin, @@ -47,23 +46,26 @@ function RpcSignBip322Message() { } return ( - - - - - onUserApproveBip322MessageSigningRequest()} - onSignMessageCancel={() => onUserRejectBip322MessageSigningRequest()} - /> -
- -
+ <> + + + + + + onUserApproveBip322MessageSigningRequest()} + onSignMessageCancel={() => onUserRejectBip322MessageSigningRequest()} + /> +
+ +
+ ); } diff --git a/src/app/pages/rpc-sign-bip322-message/use-sign-bip322-message.ts b/src/app/pages/rpc-sign-bip322-message/use-sign-bip322-message.ts index bdc348f35ad..c35a0dd2696 100644 --- a/src/app/pages/rpc-sign-bip322-message/use-sign-bip322-message.ts +++ b/src/app/pages/rpc-sign-bip322-message/use-sign-bip322-message.ts @@ -2,14 +2,10 @@ import { useMemo, useState } from 'react'; import toast from 'react-hot-toast'; import { PaymentTypes, RpcErrorCode } from '@btckit/types'; +import * as btc from '@scure/btc-signer'; import * as bitcoin from 'bitcoinjs-lib'; -import { - createNativeSegwitBitcoinJsSigner, - createTaprootBitcoinJsSigner, - signBip322MessageSimple, -} from '@shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs'; -import { deriveAddressIndexZeroFromAccount } from '@shared/crypto/bitcoin/bitcoin.utils'; +import { signBip322MessageSimple } from '@shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs'; import { logger } from '@shared/logger'; import { makeRpcErrorResponse, makeRpcSuccessResponse } from '@shared/rpc/rpc-methods'; import { closeWindow } from '@shared/utils'; @@ -18,6 +14,7 @@ import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useDefaultRequestParams } from '@app/common/hooks/use-default-request-search-params'; import { initialSearchParams } from '@app/common/initial-search-params'; import { createDelay } from '@app/common/utils'; +import { useSignBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { useCurrentAccountNativeSegwitSigner, useCurrentNativeSegwitAccount, @@ -49,7 +46,7 @@ const allowTimeForUserToReadToast = createDelay(1200); interface SignBip322MessageFactoryArgs { address: string; - signPsbt(a: bitcoin.Psbt): void; + signPsbt(a: bitcoin.Psbt): Promise; } function useSignBip322MessageFactory({ address, signPsbt }: SignBip322MessageFactoryArgs) { const network = useCurrentNetwork(); @@ -86,11 +83,11 @@ function useSignBip322MessageFactory({ address, signPsbt }: SignBip322MessageFac return; } - const { signature } = signBip322MessageSimple({ + const { signature } = await signBip322MessageSimple({ message, address, signPsbt, - network: network.chain.bitcoin.network, + network: network.chain.bitcoin.bitcoinNetwork, }); await shortPauseBeforeToast(); @@ -117,21 +114,17 @@ function useSignBip322MessageTaproot() { if (!createTaprootSigner) throw new Error('No taproot signer for current account'); const currentTaprootAccount = useCurrentTaprootAccount(); if (!currentTaprootAccount) throw new Error('No keychain for current account'); - + const sign = useSignBitcoinTx(); const signer = createTaprootSigner(0); - const keychain = deriveAddressIndexZeroFromAccount(currentTaprootAccount.keychain); - function signPsbt(psbt: bitcoin.Psbt) { + async function signPsbt(psbt: bitcoin.Psbt) { psbt.data.inputs.forEach( input => (input.tapInternalKey = Buffer.from(signer.payment.tapInternalKey)) ); - psbt.signAllInputs(createTaprootBitcoinJsSigner(Buffer.from(keychain.privateKey!))); + return sign(psbt.toBuffer()); } - return useSignBip322MessageFactory({ - address: signer.payment.address ?? '', - signPsbt, - }); + return useSignBip322MessageFactory({ address: signer.payment.address ?? '', signPsbt }); } function useSignBip322MessageNativeSegwit() { @@ -140,12 +133,12 @@ function useSignBip322MessageNativeSegwit() { const currentNativeSegwitAccount = useCurrentNativeSegwitAccount(); if (!currentNativeSegwitAccount) throw new Error('No keychain for current account'); + const sign = useSignBitcoinTx(); - const keychain = deriveAddressIndexZeroFromAccount(currentNativeSegwitAccount.keychain); const signer = createNativeSegwitSigner(0); - function signPsbt(psbt: bitcoin.Psbt) { - psbt.signAllInputs(createNativeSegwitBitcoinJsSigner(Buffer.from(keychain.privateKey!))); + async function signPsbt(psbt: bitcoin.Psbt) { + return sign(psbt.toBuffer()); } return useSignBip322MessageFactory({ diff --git a/src/app/pages/rpc-sign-psbt/rpc-sign-psbt-summary.tsx b/src/app/pages/rpc-sign-psbt/rpc-sign-psbt-summary.tsx index 97ad6c95620..a7cc1f1c866 100644 --- a/src/app/pages/rpc-sign-psbt/rpc-sign-psbt-summary.tsx +++ b/src/app/pages/rpc-sign-psbt/rpc-sign-psbt-summary.tsx @@ -1,8 +1,7 @@ import toast from 'react-hot-toast'; -import { FiCheck, FiCopy, FiExternalLink } from 'react-icons/fi'; import { useLocation } from 'react-router-dom'; -import { Flex, Stack } from '@stacks/ui'; +import { Flex, HStack, Stack } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; @@ -14,6 +13,9 @@ import { InfoCardFooter, InfoCardRow, } from '@app/components/info-card/info-card'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; export function RpcSignPsbtSummary() { const { state } = useLocation(); @@ -36,25 +38,29 @@ export function RpcSignPsbtSummary() { } return ( - + } + mb="space.05" + value={txValue} /> - + - - - - + + } + label="View details" + onClick={onClickLink} + /> + } label="Copy ID" onClick={onClickCopy} /> + diff --git a/src/app/pages/rpc-sign-psbt/rpc-sign-psbt.tsx b/src/app/pages/rpc-sign-psbt/rpc-sign-psbt.tsx index dcd3cf81d88..84f68dce1ca 100644 --- a/src/app/pages/rpc-sign-psbt/rpc-sign-psbt.tsx +++ b/src/app/pages/rpc-sign-psbt/rpc-sign-psbt.tsx @@ -1,3 +1,5 @@ +import { Outlet } from 'react-router-dom'; + import { PsbtSigner } from '@app/features/psbt-signer/psbt-signer'; import { useRpcSignPsbt } from './use-rpc-sign-psbt'; @@ -6,13 +8,16 @@ export function RpcSignPsbt() { const { indexesToSign, isBroadcasting, onSignPsbt, onCancel, origin, psbtHex } = useRpcSignPsbt(); return ( - + <> + + + ); } diff --git a/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx b/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx index f955fd83d51..b97c9c40428 100644 --- a/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx +++ b/src/app/pages/rpc-sign-psbt/use-rpc-sign-psbt.tsx @@ -27,7 +27,6 @@ interface BroadcastSignedPsbtTxArgs { fee: Money; tx: string; } - export function useRpcSignPsbt() { const analytics = useAnalytics(); const navigate = useNavigate(); @@ -38,7 +37,7 @@ export function useRpcSignPsbt() { const btcMarketData = useCryptoCurrencyMarketData('BTC'); const calculateBitcoinFiatValue = useCalculateBitcoinFiatValue(); - if (!requestId || !psbtHex || !origin) throw new Error('Invalid params'); + if (!requestId || !psbtHex || !origin) throw new Error('Invalid params in useRpcSignPsbt'); async function broadcastSignedPsbtTx({ addressNativeSegwitTotal, @@ -87,45 +86,48 @@ export function useRpcSignPsbt() { isBroadcasting, origin, psbtHex, - async onSignPsbt({ addressNativeSegwitTotal, addressTaprootTotal, fee, inputs }: SignPsbtArgs) { + async onSignPsbt({ addressNativeSegwitTotal, addressTaprootTotal, fee }: SignPsbtArgs) { const tx = getPsbtAsTransaction(psbtHex); try { - signPsbt({ indexesToSign: signAtIndex, inputs, tx }); - } catch (e) { - return navigate(RouteUrls.RequestError, { - state: { message: e instanceof Error ? e.message : '', title: 'Failed to sign' }, - }); - } - - const psbt = tx.toPSBT(); - - chrome.tabs.sendMessage( - tabId, - makeRpcSuccessResponse('signPsbt', { id: requestId, result: { hex: bytesToHex(psbt) } }) - ); - - // Optional args are handled here bc we support two request apis, - // but we only support broadcasting using the rpc request method - if (broadcast && addressNativeSegwitTotal && addressTaprootTotal && fee) { - try { - tx.finalize(); - } catch (e) { - return navigate(RouteUrls.RequestError, { - state: { message: e instanceof Error ? e.message : '', title: 'Failed to finalize tx' }, + const signedTx = await signPsbt({ tx, indexesToSign: signAtIndex }); + + const psbt = signedTx.toPSBT(); + + chrome.tabs.sendMessage( + tabId, + makeRpcSuccessResponse('signPsbt', { id: requestId, result: { hex: bytesToHex(psbt) } }) + ); + + // Optional args are handled here bc we support two request apis, + // but we only support broadcasting using the rpc request method + if (broadcast && addressNativeSegwitTotal && addressTaprootTotal && fee) { + try { + tx.finalize(); + } catch (e) { + return navigate(RouteUrls.RequestError, { + state: { + message: e instanceof Error ? e.message : '', + title: 'Failed to finalize tx', + }, + }); + } + + await broadcastSignedPsbtTx({ + addressNativeSegwitTotal, + addressTaprootTotal, + fee, + tx: signedTx.hex, }); + return; } - await broadcastSignedPsbtTx({ - addressNativeSegwitTotal, - addressTaprootTotal, - fee, - tx: tx.hex, + closeWindow(); + } catch (e) { + return navigate(RouteUrls.RequestError, { + state: { message: e instanceof Error ? e.message : '', title: 'Failed to sign' }, }); - return; } - - closeWindow(); }, onCancel() { chrome.tabs.sendMessage( diff --git a/src/app/pages/select-network/components/add-network-button.tsx b/src/app/pages/select-network/components/add-network-button.tsx index 9975c3a59de..afaf774d29e 100644 --- a/src/app/pages/select-network/components/add-network-button.tsx +++ b/src/app/pages/select-network/components/add-network-button.tsx @@ -1,10 +1,9 @@ -import { ButtonProps } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { Flex } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; -interface AddNetworkButtonProps extends ButtonProps { +interface AddNetworkButtonProps { onAddNetwork(): void; } export function AddNetworkButton({ onAddNetwork }: AddNetworkButtonProps) { diff --git a/src/app/pages/select-network/components/network-list-item.layout.tsx b/src/app/pages/select-network/components/network-list-item.layout.tsx index 3ecfd57ba7d..92af4e18b47 100644 --- a/src/app/pages/select-network/components/network-list-item.layout.tsx +++ b/src/app/pages/select-network/components/network-list-item.layout.tsx @@ -1,17 +1,16 @@ -import { FiTrash2 } from 'react-icons/fi'; - -import { Box, BoxProps, Button, Flex, Stack } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; +import { Box, Flex, Stack } from 'leather-styles/jsx'; import { styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { NetworkConfiguration } from '@shared/constants'; import { getUrlHostname } from '@app/common/utils'; +import { LeatherButton } from '@app/ui/components/button'; +import { TrashIcon } from '@app/ui/components/icons/trash-icon'; import { NetworkStatusIndicator } from './network-status-indicator'; -interface NetworkListItemLayoutProps extends BoxProps { +interface NetworkListItemLayoutProps { networkId: string; isOnline: boolean; isActive: boolean; @@ -20,47 +19,42 @@ interface NetworkListItemLayoutProps extends BoxProps { onSelectNetwork(): void; onRemoveNetwork(id: string): void; } -export function NetworkListItemLayout(props: NetworkListItemLayoutProps) { - const { - networkId, - isOnline, - isActive, - network, - isCustom, - onRemoveNetwork, - onSelectNetwork, - ...rest - } = props; - +export function NetworkListItemLayout({ + networkId, + isOnline, + isActive, + network, + isCustom, + onRemoveNetwork, + onSelectNetwork, +}: NetworkListItemLayoutProps) { + const unSelectable = !isOnline || isActive; return ( - + {network.name} @@ -71,17 +65,16 @@ export function NetworkListItemLayout(props: NetworkListItemLayoutProps) { {isCustom && ( - + +
)}
diff --git a/src/app/pages/select-network/components/network-list.layout.tsx b/src/app/pages/select-network/components/network-list.layout.tsx index 40098cca182..302dedf8429 100644 --- a/src/app/pages/select-network/components/network-list.layout.tsx +++ b/src/app/pages/select-network/components/network-list.layout.tsx @@ -1,4 +1,4 @@ -import { Flex, FlexProps } from '@stacks/ui'; +import { Flex, FlexProps } from 'leather-styles/jsx'; export function NetworkListLayout({ children, ...props }: FlexProps) { return ( diff --git a/src/app/pages/select-network/components/network-status-indicator.tsx b/src/app/pages/select-network/components/network-status-indicator.tsx index a8efa0abf89..7abfd51e8b6 100644 --- a/src/app/pages/select-network/components/network-status-indicator.tsx +++ b/src/app/pages/select-network/components/network-status-indicator.tsx @@ -1,11 +1,10 @@ -import { FiCloudOff as IconCloudOff } from 'react-icons/fi'; - -import { CheckmarkIcon } from '@app/components/icons/checkmark-icon'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { CloudOffIcon } from '@app/ui/components/icons/cloud-off-icon'; interface NetworkStatusIndicatorProps { isActive: boolean; isOnline: boolean; } export function NetworkStatusIndicator({ isActive, isOnline }: NetworkStatusIndicatorProps) { - return !isOnline ? : isActive ? : null; + return !isOnline ? : isActive ? : null; } diff --git a/src/app/pages/send/broadcast-error/broadcast-error.tsx b/src/app/pages/send/broadcast-error/broadcast-error.tsx index 18e364604f2..092f61f7ed6 100644 --- a/src/app/pages/send/broadcast-error/broadcast-error.tsx +++ b/src/app/pages/send/broadcast-error/broadcast-error.tsx @@ -18,7 +18,7 @@ export function BroadcastError() { return ( - + + Unhappy user interface cloud - + <styled.span mx="space.05" mt="space.05" textStyle="heading.05"> {title} - - + + {body} - + {errorPayload && ( {errorPayload} diff --git a/src/app/pages/send/choose-crypto-asset/components/choose-crypto-asset.layout.tsx b/src/app/pages/send/choose-crypto-asset/components/choose-crypto-asset.layout.tsx index 962ca9fcd25..7ef819b9108 100644 --- a/src/app/pages/send/choose-crypto-asset/components/choose-crypto-asset.layout.tsx +++ b/src/app/pages/send/choose-crypto-asset/components/choose-crypto-asset.layout.tsx @@ -1,5 +1,4 @@ -import { Flex, StackProps } from '@stacks/ui'; -import { Box, styled } from 'leather-styles/jsx'; +import { Box, Flex, StackProps, styled } from 'leather-styles/jsx'; export function ChooseCryptoAssetLayout({ children }: StackProps) { return ( @@ -10,6 +9,7 @@ export function ChooseCryptoAssetLayout({ children }: StackProps) { justifyContent="start" maxHeight={['unset', '85vh']} overflowY="auto" + pb="space.05" > diff --git a/src/app/pages/send/choose-crypto-asset/components/crypto-asset-list.layout.tsx b/src/app/pages/send/choose-crypto-asset/components/crypto-asset-list.layout.tsx index 9595bc89f15..e1803d73421 100644 --- a/src/app/pages/send/choose-crypto-asset/components/crypto-asset-list.layout.tsx +++ b/src/app/pages/send/choose-crypto-asset/components/crypto-asset-list.layout.tsx @@ -1,14 +1,13 @@ -import { Stack, StackProps } from '@stacks/ui'; import { CryptoAssetSelectors } from '@tests/selectors/crypto-asset.selectors'; +import { Stack, StackProps } from 'leather-styles/jsx'; export function CryptoAssetListLayout({ children }: StackProps) { return ( {children} diff --git a/src/app/pages/send/choose-crypto-asset/components/crypto-currency-asset-icon.tsx b/src/app/pages/send/choose-crypto-asset/components/crypto-currency-asset-icon.tsx index b3cbf01aa91..e911f80240c 100644 --- a/src/app/pages/send/choose-crypto-asset/components/crypto-currency-asset-icon.tsx +++ b/src/app/pages/send/choose-crypto-asset/components/crypto-currency-asset-icon.tsx @@ -1,7 +1,7 @@ import type { Blockchains } from '@shared/models/blockchain.model'; import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; -import { BtcIcon } from '@app/components/icons/btc-icon'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; export function CryptoCurrencyAssetIcon(props: { blockchain: Blockchains }) { switch (props.blockchain) { diff --git a/src/app/pages/send/choose-crypto-asset/components/fungible-token-asset-item.tsx b/src/app/pages/send/choose-crypto-asset/components/fungible-token-asset-item.tsx index 2677c29e045..200355eacc4 100644 --- a/src/app/pages/send/choose-crypto-asset/components/fungible-token-asset-item.tsx +++ b/src/app/pages/send/choose-crypto-asset/components/fungible-token-asset-item.tsx @@ -1,19 +1,21 @@ -import { BoxProps } from '@stacks/ui'; +import { FlexProps } from 'leather-styles/jsx'; import type { StacksFungibleTokenAssetBalance } from '@shared/models/crypto-asset-balance.model'; import { StacksFungibleTokenAssetItem } from '@app/components/crypto-assets/stacks/fungible-token-asset/stacks-fungible-token-asset-item'; -interface FungibleTokenAssetItemProps extends BoxProps { +interface FungibleTokenAssetItemProps extends FlexProps { assetBalance: StacksFungibleTokenAssetBalance; + onClick: () => void; } -export function FungibleTokenAssetItem(props: FungibleTokenAssetItemProps) { - const { assetBalance, ...rest } = props; +export function FungibleTokenAssetItem({ assetBalance, onClick }: FungibleTokenAssetItemProps) { const { blockchain } = assetBalance; switch (blockchain) { case 'stacks': - return ; + return ( + + ); default: return null; } diff --git a/src/app/pages/send/choose-crypto-asset/components/send-btc-disabled.tsx b/src/app/pages/send/choose-crypto-asset/components/send-btc-disabled.tsx index 3dca6e99c59..387171ff111 100644 --- a/src/app/pages/send/choose-crypto-asset/components/send-btc-disabled.tsx +++ b/src/app/pages/send/choose-crypto-asset/components/send-btc-disabled.tsx @@ -1,23 +1,23 @@ -import { FiExternalLink } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; -import { Box, Stack, Text } from '@stacks/ui'; +import { Box, HStack, styled } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { GenericError } from '@app/components/generic-error/generic-error'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; const body = 'Sending bitcoin is temporarily disabled'; const helpTextList = [ - - - Learm more on Twitter at @LeatherBTC - openInNewTab('https://twitter.com/leatherbtc')}> - - - - , + + + Learn more on Twitter at @LeatherBTC + openInNewTab('https://twitter.com/leatherbtc')} type="button"> + + + + , ]; const title = 'Temporarily disabled'; @@ -25,7 +25,7 @@ export function SendBtcDisabled() { const navigate = useNavigate(); return ( - + } + my="space.05" + px="space.05" symbol={symbol} - icon={FiCheck} - my="loose" - px="loose" + value={Number(satToBtc(txMoney.amount))} /> - - Success! Your bitcoin has been locked securely. All - that's left is for it to be confirmed on the blockchain. After confirmation, you can proceed - with borrowing against it. - + + Success! Your bitcoin has been locked + securely. All that's left is for it to be confirmed on the blockchain. After confirmation, + you can proceed with borrowing against it. + - - - - + + } + label="View details" + onClick={onClickLink} + /> + } label="Copy ID" onClick={onClickCopy} /> + ); diff --git a/src/app/pages/send/ordinal-inscription/components/collectible-asset.tsx b/src/app/pages/send/ordinal-inscription/components/collectible-asset.tsx index b707b4b7487..e769cdfd4f5 100644 --- a/src/app/pages/send/ordinal-inscription/components/collectible-asset.tsx +++ b/src/app/pages/send/ordinal-inscription/components/collectible-asset.tsx @@ -1,8 +1,5 @@ -import { Flex } from '@stacks/ui'; -import { HStack } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; - -import { Text } from '@app/components/typography'; +import { Flex } from 'leather-styles/jsx'; +import { HStack, styled } from 'leather-styles/jsx'; interface CollectibleAssetProps { icon: React.JSX.Element; @@ -13,21 +10,21 @@ export function CollectibleAsset({ icon, name, symbol }: CollectibleAssetProps) return ( {icon} - + {name} - - {symbol && ({symbol.toUpperCase()})} + + {symbol && ({symbol.toUpperCase()})} diff --git a/src/app/pages/send/ordinal-inscription/hooks/use-generate-ordinal-tx.ts b/src/app/pages/send/ordinal-inscription/hooks/use-generate-ordinal-tx.ts index 3c75946786f..d7eff2cbbeb 100644 --- a/src/app/pages/send/ordinal-inscription/hooks/use-generate-ordinal-tx.ts +++ b/src/app/pages/send/ordinal-inscription/hooks/use-generate-ordinal-tx.ts @@ -6,33 +6,33 @@ import { OrdinalSendFormValues } from '@shared/models/form.model'; import { determineUtxosForSpend } from '@app/common/transactions/bitcoin/coinselect/local-coin-selection'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; -import { NativeSegwitUtxo, TaprootUtxo } from '@app/query/bitcoin/bitcoin-client'; +import { TaprootUtxo } from '@app/query/bitcoin/bitcoin-client'; import { useBitcoinScureLibNetworkConfig } from '@app/store/accounts/blockchain/bitcoin/bitcoin-keychain'; import { useCurrentAccountNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useCurrentAccountTaprootSigner } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; import { selectInscriptionTransferCoins } from '../coinselect/select-inscription-coins'; -export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | NativeSegwitUtxo) { - const createTapRootSigner = useCurrentAccountTaprootSigner(); +export function useGenerateUnsignedOrdinalTx(taprootInput: TaprootUtxo) { + const createTaprootSigner = useCurrentAccountTaprootSigner(); const createNativeSegwitSigner = useCurrentAccountNativeSegwitSigner(); const networkMode = useBitcoinScureLibNetworkConfig(); const { data: nativeSegwitUtxos } = useCurrentNativeSegwitUtxos(); function coverFeeFromAdditionalUtxos(values: OrdinalSendFormValues) { if (getAddressInfo(values.inscription.address).type === AddressType.p2wpkh) { - return formNsOrdinalTx(values); + return formNativeSegwitOrdinalTx(values); } - return formTrOrdinalTx(values); + return formTaprootOrdinalTx(values); } - function formTrOrdinalTx(values: OrdinalSendFormValues) { - const inscriptionInput = inscriptionUtxo as TaprootUtxo; - const trSigner = createTapRootSigner?.(inscriptionInput.addressIndex); + function formTaprootOrdinalTx(values: OrdinalSendFormValues) { + const inscriptionInput = taprootInput; + const taprootSigner = createTaprootSigner?.(inscriptionInput.addressIndex); const nativeSegwitSigner = createNativeSegwitSigner?.(0); - if (!trSigner || !nativeSegwitSigner || !nativeSegwitUtxos || !values.feeRate) return; + if (!taprootSigner || !nativeSegwitSigner || !nativeSegwitUtxos || !values.feeRate) return; const result = selectInscriptionTransferCoins({ recipient: values.recipient, @@ -51,13 +51,13 @@ export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | Native // Inscription input tx.addInput({ - txid: inscriptionUtxo.txid, - index: inscriptionUtxo.vout, - tapInternalKey: trSigner.payment.tapInternalKey, + txid: taprootInput.txid, + index: taprootInput.vout, + tapInternalKey: taprootSigner.payment.tapInternalKey, sequence: 0, witnessUtxo: { - script: trSigner.payment.script, - amount: BigInt(inscriptionUtxo.value), + script: taprootSigner.payment.script, + amount: BigInt(taprootInput.value), }, }); @@ -77,24 +77,16 @@ export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | Native // Recipient and change outputs outputs.forEach(output => tx.addOutputAddress(output.address, output.value, networkMode)); - // We know the first is TR and the rest are native segwit - for (let i = 0; i < tx.inputsLength; i++) { - if (i === 0) { - trSigner.signIndex(tx, i); - continue; - } - nativeSegwitSigner.signIndex(tx, i); - } + tx.toPSBT(); - tx.finalize(); - return { hex: tx.hex }; + return { hex: tx.hex, psbt: tx.toPSBT() }; } catch (e) { logger.error('Unable to sign transaction'); return null; } } - function formNsOrdinalTx(values: OrdinalSendFormValues) { + function formNativeSegwitOrdinalTx(values: OrdinalSendFormValues) { const nativeSegwitSigner = createNativeSegwitSigner?.(0); const { feeRate, recipient } = values; if (!nativeSegwitSigner || !nativeSegwitUtxos || !values.feeRate) return; @@ -112,7 +104,7 @@ export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | Native const tx = new btc.Transaction(); // Fee-covering Native Segwit inputs - [inscriptionUtxo, ...inputs].forEach(input => + [taprootInput, ...inputs].forEach(input => tx.addInput({ txid: input.txid, index: input.vout, @@ -125,7 +117,7 @@ export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | Native ); // Inscription output - tx.addOutputAddress(values.recipient, BigInt(inscriptionUtxo.value), networkMode); + tx.addOutputAddress(values.recipient, BigInt(taprootInput.value), networkMode); // Recipient and change outputs outputs.forEach(output => { @@ -138,10 +130,7 @@ export function useGenerateSignedOrdinalTx(inscriptionUtxo: TaprootUtxo | Native tx.addOutputAddress(values.recipient, BigInt(output.value), networkMode); }); - nativeSegwitSigner.sign(tx); - tx.finalize(); - - return { hex: tx.hex }; + return { hex: tx.hex, psbt: tx.toPSBT() }; } catch (e) { logger.error('Unable to sign transaction'); return null; diff --git a/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-form.tsx b/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-form.tsx index 1f2cf93cdb8..35e3c00db09 100644 --- a/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-form.tsx +++ b/src/app/pages/send/ordinal-inscription/hooks/use-send-inscription-form.tsx @@ -6,34 +6,33 @@ import * as yup from 'yup'; import { logger } from '@shared/logger'; import { OrdinalSendFormValues } from '@shared/models/form.model'; import { RouteUrls } from '@shared/route-urls'; -import { noop } from '@shared/utils'; import { FormErrorMessages } from '@app/common/error-messages'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { formFeeRowValue } from '@app/common/send/utils'; -import { useWalletType } from '@app/common/use-wallet-type'; import { btcAddressNetworkValidator, btcAddressValidator, } from '@app/common/validation/forms/address-validators'; import { useNumberOfInscriptionsOnUtxo } from '@app/query/bitcoin/ordinals/inscriptions.hooks'; +import { useSignBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { useSendInscriptionState } from '../components/send-inscription-container'; import { recipeintFieldName } from '../send-inscription-form'; -import { useGenerateSignedOrdinalTx } from './use-generate-ordinal-tx'; +import { useGenerateUnsignedOrdinalTx } from './use-generate-ordinal-tx'; export function useSendInscriptionForm() { const [currentError, setShowError] = useState(null); const [isCheckingFees, setIsCheckingFees] = useState(false); const analytics = useAnalytics(); const navigate = useNavigate(); - const { whenWallet } = useWalletType(); + const sign = useSignBitcoinTx(); const { inscription, utxo } = useSendInscriptionState(); const currentNetwork = useCurrentNetwork(); - const { coverFeeFromAdditionalUtxos } = useGenerateSignedOrdinalTx(utxo); const getNumberOfInscriptionOnUtxo = useNumberOfInscriptionsOnUtxo(); + const { coverFeeFromAdditionalUtxos } = useGenerateUnsignedOrdinalTx(utxo); return { currentError, @@ -75,16 +74,10 @@ export function useSendInscriptionForm() { setIsCheckingFees(false); } - whenWallet({ - software: () => - navigate( - `/${RouteUrls.SendOrdinalInscription}/${RouteUrls.SendOrdinalInscriptionChooseFee}`, - { - state: { inscription, recipient: values.recipient, utxo }, - } - ), - ledger: noop, - })(); + navigate( + `/${RouteUrls.SendOrdinalInscription}/${RouteUrls.SendOrdinalInscriptionChooseFee}`, + { state: { inscription, recipient: values.recipient, utxo } } + ); }, async reviewTransaction( @@ -101,22 +94,29 @@ export function useSendInscriptionForm() { return; } - const { hex } = resp; + const signedTx = await sign(resp.psbt); + + if (!signedTx) { + logger.error('No signed transaction returned'); + return; + } + + signedTx.finalize(); + + logger.debug('Pre-finalized inscription PSBT', signedTx.hex); + const feeRowValue = formFeeRowValue(values.feeRate, isCustomFee); - return navigate( - `/${RouteUrls.SendOrdinalInscription}/${RouteUrls.SendOrdinalInscriptionReview}`, - { - state: { - fee: feeValue, - inscription, - utxo, - recipient: values.recipient, - time, - feeRowValue, - tx: hex, - }, - } - ); + navigate(`/${RouteUrls.SendOrdinalInscription}/${RouteUrls.SendOrdinalInscriptionReview}`, { + state: { + fee: feeValue, + inscription, + utxo, + recipient: values.recipient, + time, + feeRowValue, + signedTx: signedTx.extract(), + }, + }); }, validationSchema: yup.object({ @@ -124,7 +124,7 @@ export function useSendInscriptionForm() { .string() .required(FormErrorMessages.AddressRequired) .concat(btcAddressValidator()) - .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.network)), + .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.bitcoinNetwork)), }), }; } diff --git a/src/app/routes/ordinal-routes.tsx b/src/app/pages/send/ordinal-inscription/ordinal-routes.tsx similarity index 78% rename from src/app/routes/ordinal-routes.tsx rename to src/app/pages/send/ordinal-inscription/ordinal-routes.tsx index 41e8e02516d..684b67619e5 100644 --- a/src/app/routes/ordinal-routes.tsx +++ b/src/app/pages/send/ordinal-inscription/ordinal-routes.tsx @@ -2,6 +2,7 @@ import { Route } from 'react-router-dom'; import { RouteUrls } from '@shared/route-urls'; +import { ledgerBitcoinTxSigningRoutes } from '@app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container'; import { BroadcastError } from '@app/pages/send/broadcast-error/broadcast-error'; import { SendInscriptionContainer } from '@app/pages/send/ordinal-inscription/components/send-inscription-container'; import { SendInscriptionChooseFee } from '@app/pages/send/ordinal-inscription/send-inscription-choose-fee'; @@ -11,12 +12,14 @@ import { SendInscriptionSummary } from '@app/pages/send/ordinal-inscription/sent export const sendOrdinalRoutes = ( }> + {ledgerBitcoinTxSigningRoutes} + } /> - } - /> + }> + {ledgerBitcoinTxSigningRoutes} + } /> + } /> } /> diff --git a/src/app/pages/send/ordinal-inscription/send-indcription-form-loader.tsx b/src/app/pages/send/ordinal-inscription/send-indcription-form-loader.tsx index 6ba47b896e2..cf74790f02d 100644 --- a/src/app/pages/send/ordinal-inscription/send-indcription-form-loader.tsx +++ b/src/app/pages/send/ordinal-inscription/send-indcription-form-loader.tsx @@ -1,4 +1,4 @@ -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { LoadingSpinner } from '@app/components/loading-spinner'; diff --git a/src/app/pages/send/ordinal-inscription/send-inscription-choose-fee.tsx b/src/app/pages/send/ordinal-inscription/send-inscription-choose-fee.tsx index 0b5c51956a7..9b90eb08bed 100644 --- a/src/app/pages/send/ordinal-inscription/send-inscription-choose-fee.tsx +++ b/src/app/pages/send/ordinal-inscription/send-inscription-choose-fee.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { Outlet, useNavigate } from 'react-router-dom'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; import { createMoney } from '@shared/models/money.model'; @@ -37,31 +37,40 @@ export function SendInscriptionChooseFee() { } } - if (isLoadingReview) return ; + if (isLoadingReview) + return ( + <> + + + + ); return ( - navigate(-1)}> - setSelectedFeeType(value)} - selectedFeeType={selectedFeeType} - /> - } - isLoading={isLoading} - isSendingMax={false} - onChooseFee={previewTransaction} - onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} - onValidateBitcoinSpend={onValidateBitcoinFeeSpend} - recipient={recipient} - recommendedFeeRate={recommendedFeeRate} - showError={showInsufficientBalanceError} - maxRecommendedFeeRate={feesList[0]?.feeRate} - /> - + <> + navigate(-1)}> + setSelectedFeeType(value)} + selectedFeeType={selectedFeeType} + /> + } + isLoading={isLoading} + isSendingMax={false} + onChooseFee={previewTransaction} + onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} + onValidateBitcoinSpend={onValidateBitcoinFeeSpend} + recipient={recipient} + recommendedFeeRate={recommendedFeeRate} + showError={showInsufficientBalanceError} + maxRecommendedFeeRate={feesList[0]?.feeRate} + /> + + + ); } diff --git a/src/app/pages/send/ordinal-inscription/send-inscription-form.tsx b/src/app/pages/send/ordinal-inscription/send-inscription-form.tsx index 3bb5746d8a3..27097f7f214 100644 --- a/src/app/pages/send/ordinal-inscription/send-inscription-form.tsx +++ b/src/app/pages/send/ordinal-inscription/send-inscription-form.tsx @@ -1,16 +1,16 @@ import { useNavigate } from 'react-router-dom'; -import { Box, Flex } from '@stacks/ui'; import { Form, Formik } from 'formik'; +import { Box, Flex } from 'leather-styles/jsx'; import { RouteUrls } from '@shared/route-urls'; -import { LeatherButton } from '@app/components/button/button'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; import { ErrorLabel } from '@app/components/error-label'; -import { OrdinalIcon } from '@app/components/icons/ordinal-icon'; import { InscriptionPreview } from '@app/components/inscription-preview-card/components/inscription-preview'; import { InscriptionPreviewCard } from '@app/components/inscription-preview-card/inscription-preview-card'; +import { LeatherButton } from '@app/ui/components/button'; +import { OrdinalIcon } from '@app/ui/components/icons/ordinal-icon'; import { RecipientField } from '../send-crypto-asset-form/components/recipient-field'; import { CollectibleAsset } from './components/collectible-asset'; @@ -39,14 +39,14 @@ export function SendInscriptionForm() { navigate(RouteUrls.Home)}> - + } subtitle="Ordinal inscription" title={inscription.title} /> - - + + } name="Ordinal inscription" /> navigate(RouteUrls.Home)}> - + } subtitle="Ordinal inscription" @@ -73,7 +74,7 @@ export function SendInscriptionReview() { /> - + } /> diff --git a/src/app/pages/send/ordinal-inscription/sent-inscription-summary.tsx b/src/app/pages/send/ordinal-inscription/sent-inscription-summary.tsx index ad6111d1b37..abeac58abd2 100644 --- a/src/app/pages/send/ordinal-inscription/sent-inscription-summary.tsx +++ b/src/app/pages/send/ordinal-inscription/sent-inscription-summary.tsx @@ -1,8 +1,7 @@ import { toast } from 'react-hot-toast'; -import { FiCheck, FiCopy, FiExternalLink } from 'react-icons/fi'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Box, Stack } from '@stacks/ui'; +import { Box, Stack } from 'leather-styles/jsx'; import get from 'lodash.get'; import { Blockchains } from '@shared/models/blockchain.model'; @@ -21,13 +20,16 @@ import { InfoCardSeparator, } from '@app/components/info-card/info-card'; import { InscriptionPreview } from '@app/components/inscription-preview-card/components/inscription-preview'; +import { CheckmarkIcon } from '@app/ui/components/icons/checkmark-icon'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; import { InscriptionPreviewCard } from '../../../components/inscription-preview-card/inscription-preview-card'; function useSendInscriptionSummaryState() { const location = useLocation(); return { - txId: get(location.state, 'txId') as string, + txid: get(location.state, 'txid') as string, recipient: get(location.state, 'recipient', '') as string, arrivesIn: get(location.state, 'arrivesIn') as string, inscription: get(location.state, 'inscription') as SupportedInscription, @@ -36,15 +38,15 @@ function useSendInscriptionSummaryState() { } export function SendInscriptionSummary() { - const { txId, recipient, arrivesIn, inscription, feeRowValue } = useSendInscriptionSummaryState(); + const { txid, recipient, arrivesIn, inscription, feeRowValue } = useSendInscriptionSummaryState(); const navigate = useNavigate(); const txLink = { blockchain: 'bitcoin' as Blockchains, - txId, + txid, }; - const { onCopy } = useClipboard(txId || ''); + const { onCopy } = useClipboard(txid || ''); const { handleOpenTxLink } = useExplorerLink(); const analytics = useAnalytics(); @@ -60,26 +62,30 @@ export function SendInscriptionSummary() { return ( navigate(RouteUrls.Home)}> - + } + icon={} image={} subtitle="Ordinal inscription" title={inscription.title} /> - - + + } /> {arrivesIn && } - - - + + } + label="View details" + /> + } label="Copy ID" /> diff --git a/src/app/pages/send/send-container.tsx b/src/app/pages/send/send-container.tsx index 75b69e96a85..03a7483f92c 100644 --- a/src/app/pages/send/send-container.tsx +++ b/src/app/pages/send/send-container.tsx @@ -1,7 +1,6 @@ import { Outlet } from 'react-router-dom'; -import { Flex } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { Flex } from 'leather-styles/jsx'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { whenPageMode } from '@app/common/utils'; @@ -15,15 +14,15 @@ export function SendContainer() { ), popup: ( - + ), diff --git a/src/app/pages/send/send-crypto-asset-form/components/amount-field.tsx b/src/app/pages/send/send-crypto-asset-form/components/amount-field.tsx index d92acd3556e..2225aa24356 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/amount-field.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/amount-field.tsx @@ -1,10 +1,9 @@ import type { ChangeEvent } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react'; -import { Box, Flex, Input, Stack, Text, color } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { useField } from 'formik'; -import { token } from 'leather-styles/tokens'; +import { Box, Flex, Stack, styled } from 'leather-styles/jsx'; import { STX_DECIMALS, TOKEN_NAME_LENGTH } from '@shared/constants'; import { Money } from '@shared/models/money.model'; @@ -141,11 +140,12 @@ export function AmountField({ return ( + {/* #4476 TODO check these fonts against design */} - {isSendingMax ? ~ : null} - ~ : null} + {switchableAmount && switchableAmount} {showError && ( {meta.error} diff --git a/src/app/pages/send/send-crypto-asset-form/components/form-footer.tsx b/src/app/pages/send/send-crypto-asset-form/components/form-footer.tsx index cdaea427002..2993596e33b 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/form-footer.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/form-footer.tsx @@ -1,6 +1,5 @@ -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; import { Flex } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { Money } from '@shared/models/money.model'; @@ -13,6 +12,7 @@ export function FormFooter(props: { balance: Money; balanceTooltipLabel?: string return ( diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/account-list-item.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/account-list-item.tsx index 08bfd605a06..971e0aa5bb5 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/account-list-item.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/account-list-item.tsx @@ -6,44 +6,51 @@ import { BitcoinSendFormValues, StacksSendFormValues } from '@shared/models/form import { useAccountDisplayName } from '@app/common/hooks/account/use-account-names'; import { AccountTotalBalance } from '@app/components/account-total-balance'; -import { AccountAvatarItem } from '@app/components/account/account-avatar'; +import { AccountAvatarItem } from '@app/components/account/account-avatar-item'; import { AccountListItemLayout } from '@app/components/account/account-list-item-layout'; -import { AccountName } from '@app/components/account/account-name'; +import { AccountNameLayout } from '@app/components/account/account-name'; import { usePressable } from '@app/components/item-hover'; -import { useNativeSegwitAccountIndexAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { useNativeSegwitSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { StacksAccount } from '@app/store/accounts/blockchain/stacks/stacks-account.models'; interface AccountListItemProps { - account: StacksAccount; + stacksAccount: StacksAccount; + index: number; onClose(): void; } -export const AccountListItem = memo(({ account, onClose }: AccountListItemProps) => { +export const AccountListItem = memo(({ index, stacksAccount, onClose }: AccountListItemProps) => { const { setFieldValue, values, setFieldTouched } = useFormikContext< BitcoinSendFormValues | StacksSendFormValues >(); const [component, bind] = usePressable(true); - const name = useAccountDisplayName(account); + const stacksAddress = stacksAccount?.address || ''; + const name = useAccountDisplayName({ address: stacksAddress, index }); - const btcAddress = useNativeSegwitAccountIndexAddressIndexZero(account.index); + const bitcoinSigner = useNativeSegwitSigner(index); + const bitcoinAddress = bitcoinSigner?.(0).address || ''; const onSelectAccount = () => { const isBitcoin = values.symbol === 'BTC'; - void setFieldValue('recipient', isBitcoin ? btcAddress : account.address, false); - setFieldTouched('recipient', false); + void setFieldValue('recipient', isBitcoin ? bitcoinAddress : stacksAddress, false); + void setFieldTouched('recipient', false); onClose(); }; return ( } + accountName={{name}} avatar={ - + } - balanceLabel={} - index={account.index} + balanceLabel={} + index={index} isActive={false} isLoading={false} - mt="loose" + mt="space.05" onSelectAccount={onSelectAccount} {...bind} > diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/recipient-accounts-drawer.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/recipient-accounts-drawer.tsx index d8531e2a704..0972c44c5bf 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/recipient-accounts-drawer.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-accounts-drawer/recipient-accounts-drawer.tsx @@ -2,42 +2,42 @@ import { memo, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Virtuoso } from 'react-virtuoso'; -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; -import { useWalletType } from '@app/common/use-wallet-type'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; +import { useFilteredBitcoinAccounts } from '@app/store/accounts/blockchain/bitcoin/bitcoin.ledger'; import { useStacksAccounts } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; import { AccountListItem } from './account-list-item'; -const smallNumberOfAccountsToRenderWholeList = 10; - export const RecipientAccountsDrawer = memo(() => { - const { whenWallet } = useWalletType(); - const accounts = useStacksAccounts(); + const stacksAccounts = useStacksAccounts(); const navigate = useNavigate(); const onGoBack = useCallback(() => navigate('..', { replace: true }), [navigate]); + const bitcoinAccounts = useFilteredBitcoinAccounts(); + const btcAddressesNum = bitcoinAccounts.length / 2; + const stacksAddressesNum = stacksAccounts.length; - if (!accounts) return null; + if (stacksAddressesNum === 0 && btcAddressesNum === 0) return null; return ( - - {accounts.length <= smallNumberOfAccountsToRenderWholeList ? ( - - {accounts.map(item => ( - - ))} - - ) : ( - } - style={{ paddingTop: '24px', height: '70vh' }} - totalCount={accounts.length} - /> - )} + + ( + + + + )} + style={{ paddingTop: '24px', height: '70vh' }} + totalCount={stacksAddressesNum || btcAddressesNum} + /> ); diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-field.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-field.tsx index fea53abb9b6..5aad336632e 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-field.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-field.tsx @@ -29,6 +29,7 @@ export function RecipientField({ }: RecipientFieldProps) { const [field] = useField(name); const { setFieldValue } = useFormikContext(); + useEffect(() => { void setFieldValue(name, field.value.trim()); }, [name, field.value, setFieldValue]); diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/components/recipient-address-displayer.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/components/recipient-address-displayer.tsx index 7f7a400d77c..90346b460fd 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/components/recipient-address-displayer.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/components/recipient-address-displayer.tsx @@ -1,13 +1,12 @@ import { useCallback } from 'react'; -import { FiCopy } from 'react-icons/fi'; -import { Box, Text, color } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; -import { HStack } from 'leather-styles/jsx'; +import { HStack, styled } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; import { Tooltip } from '@app/components/tooltip'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; interface RecipientAddressDisplayerProps { address: string; @@ -23,24 +22,21 @@ export function RecipientAddressDisplayer({ address }: RecipientAddressDisplayer return ( - {address} - + - - - + + ); diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/hooks/use-recipient-select-fields.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/hooks/use-recipient-select-fields.tsx index 4fe6ef180ac..ed8b256baec 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/hooks/use-recipient-select-fields.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-fields/hooks/use-recipient-select-fields.tsx @@ -25,18 +25,18 @@ export function useRecipientSelectFields() { }, [navigate]); // Formik does not provide a field reset - const resetAllRecipientFields = useCallback(() => { + const resetAllRecipientFields = useCallback(async () => { void setFieldValue('recipient', ''); setFieldError('recipient', undefined); - setFieldTouched('recipient', false); + await setFieldTouched('recipient', false); void setFieldValue('recipientBnsName', ''); setFieldError('recipientBnsName', undefined); - setFieldTouched('recipientBnsName', false); + await setFieldTouched('recipientBnsName', false); }, [setFieldError, setFieldTouched, setFieldValue]); const onSelectRecipientFieldType = useCallback( - (index: number) => { - resetAllRecipientFields(); + async (index: number) => { + await resetAllRecipientFields(); setBnsAddress(''); setSelectedRecipientField(index); setIsSelectVisible(false); @@ -45,8 +45,8 @@ export function useRecipientSelectFields() { ); const onSetIsSelectVisible = useCallback( - (value: boolean) => { - resetAllRecipientFields(); + async (value: boolean) => { + await resetAllRecipientFields(); setIsSelectVisible(value); }, [resetAllRecipientFields] diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown-item.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown-item.tsx index 585e75988bb..c3fa440b693 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown-item.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown-item.tsx @@ -1,7 +1,7 @@ -import { FiChevronDown } from 'react-icons/fi'; +import { HStack, styled } from 'leather-styles/jsx'; -import { Box, Text, color } from '@stacks/ui'; -import { token } from 'leather-styles/tokens'; +import { LeatherButton } from '@app/ui/components/button'; +import { ChevronDownIcon } from '@app/ui/components/icons/chevron-down-icon'; const labels = ['Address', 'BNS Name']; const testLabels = ['address', 'bns-name']; @@ -11,33 +11,31 @@ interface RecipientDropdownItemProps { isVisible?: boolean; onSelectItem(index: number): void; } -export function RecipientDropdownItem(props: RecipientDropdownItemProps) { - const { index, isVisible, onSelectItem } = props; - +export function RecipientDropdownItem({ + index, + isVisible, + onSelectItem, +}: RecipientDropdownItemProps) { return ( - onSelectItem(index)} - pl={isVisible ? 'tight' : 'unset'} - type="button" + pl={isVisible ? 'space.02' : 'unset'} + variant="text" > - - {labels[index]} - - {isVisible ? <> : } - + + {labels[index]} + {isVisible ? <> : } + + ); } diff --git a/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown.layout.tsx b/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown.layout.tsx index 4031c1d53b2..4b52853a90e 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown.layout.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/recipient-type-dropdown/components/recipient-dropdown.layout.tsx @@ -1,6 +1,6 @@ import { ReactNode, useRef } from 'react'; -import { Box, Fade, Stack, color } from '@stacks/ui'; +import { Box, Stack } from 'leather-styles/jsx'; import { useOnClickOutside } from '@app/common/hooks/use-onclickoutside'; @@ -12,8 +12,12 @@ interface RecipientDropdownLayoutProps { onSetIsSelectVisible(value: boolean): void; selectedItem: number; } -export function RecipientDropdownLayout(props: RecipientDropdownLayoutProps) { - const { children, isVisible, onSetIsSelectVisible, selectedItem } = props; +export function RecipientDropdownLayout({ + children, + isVisible, + onSetIsSelectVisible, + selectedItem, +}: RecipientDropdownLayoutProps) { const ref = useRef(null); useOnClickOutside(ref, () => onSetIsSelectVisible(false)); @@ -21,26 +25,23 @@ export function RecipientDropdownLayout(props: RecipientDropdownLayoutProps) { return ( onSetIsSelectVisible(true)} /> - - {styles => ( - - {children} - - )} - + {isVisible ? ( + + {children} + + ) : null} ); } diff --git a/src/app/pages/send/send-crypto-asset-form/components/selected-asset-field.tsx b/src/app/pages/send/send-crypto-asset-form/components/selected-asset-field.tsx index 7c17ab2157f..d6bf49a7869 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/selected-asset-field.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/selected-asset-field.tsx @@ -1,7 +1,6 @@ -import { Flex } from '@stacks/ui'; import { Field, useField } from 'formik'; +import { Flex } from 'leather-styles/jsx'; import { styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { useOnMount } from '@app/common/hooks/use-on-mount'; import { Flag } from '@app/components/layout/flag'; @@ -19,16 +18,16 @@ export function SelectedAssetField({ icon, name, symbol }: SelectedAssetFieldPro return ( - + {name} diff --git a/src/app/pages/send/send-crypto-asset-form/components/send-crypto-asset-form.layout.tsx b/src/app/pages/send/send-crypto-asset-form/components/send-crypto-asset-form.layout.tsx index 4d5dc79907c..38c13c25d95 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/send-crypto-asset-form.layout.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/send-crypto-asset-form.layout.tsx @@ -1,5 +1,5 @@ -import { Flex } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; +import { Flex } from 'leather-styles/jsx'; interface SendCryptoAssetFormLayoutProps { children: React.ReactNode; @@ -13,8 +13,8 @@ export function SendCryptoAssetFormLayout({ children }: SendCryptoAssetFormLayou maxHeight={['calc(100vh - 116px)', 'calc(85vh - 116px)']} overflowY="auto" pb={['120px', '48px']} - pt={['base', '48px']} - px="loose" + pt={['space.04', '48px']} + px="space.05" width="100%" > {children} diff --git a/src/app/pages/send/send-crypto-asset-form/components/send-max-button.tsx b/src/app/pages/send/send-crypto-asset-form/components/send-max-button.tsx index 2cfc5f70504..40c274848be 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/send-max-button.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/send-max-button.tsx @@ -1,14 +1,14 @@ import { useCallback } from 'react'; import toast from 'react-hot-toast'; -import { Box } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { useField } from 'formik'; +import { Box } from 'leather-styles/jsx'; import { Money } from '@shared/models/money.model'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; -import { LeatherButton } from '@app/components/button/button'; +import { LeatherButton } from '@app/ui/components/button'; interface SendMaxButtonProps { balance: Money; diff --git a/src/app/pages/send/send-crypto-asset-form/components/tx-done.tsx b/src/app/pages/send/send-crypto-asset-form/components/tx-done.tsx index c24c0149b37..4926d5099bd 100644 --- a/src/app/pages/send/send-crypto-asset-form/components/tx-done.tsx +++ b/src/app/pages/send/send-crypto-asset-form/components/tx-done.tsx @@ -4,7 +4,7 @@ import { Flex, styled } from 'leather-styles/jsx'; export function TxDone() { return ( - + All done diff --git a/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/bitcoin-send-max-button.tsx b/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/bitcoin-send-max-button.tsx index da6aad99024..776626c5b10 100644 --- a/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/bitcoin-send-max-button.tsx +++ b/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/bitcoin-send-max-button.tsx @@ -3,8 +3,8 @@ import { Box } from 'leather-styles/jsx'; import { Money } from '@shared/models/money.model'; -import { LeatherButton } from '@app/components/button/button'; import { Tooltip } from '@app/components/tooltip'; +import { LeatherButton } from '@app/ui/components/button'; import { useSendMax } from '../hooks/use-send-max'; @@ -40,7 +40,7 @@ export function BitcoinSendMaxButton({ return ( diff --git a/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/testnet-btc-message.tsx b/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/testnet-btc-message.tsx index 328894e8051..f20f5fb22a8 100644 --- a/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/testnet-btc-message.tsx +++ b/src/app/pages/send/send-crypto-asset-form/family/bitcoin/components/testnet-btc-message.tsx @@ -3,7 +3,7 @@ import { WarningLabel } from '@app/components/warning-label'; export function TestnetBtcMessage() { return ( - + This is a Bitcoin testnet transaction. Funds have no value.{' '} Get testnet BTC here ↗ diff --git a/src/app/pages/send/send-crypto-asset-form/family/stacks/hooks/use-stacks-transaction-summary.ts b/src/app/pages/send/send-crypto-asset-form/family/stacks/hooks/use-stacks-transaction-summary.ts index fd3c3c1aa7d..303935fa552 100644 --- a/src/app/pages/send/send-crypto-asset-form/family/stacks/hooks/use-stacks-transaction-summary.ts +++ b/src/app/pages/send/send-crypto-asset-form/family/stacks/hooks/use-stacks-transaction-summary.ts @@ -6,7 +6,6 @@ import { addressToString, cvToString, } from '@stacks/transactions'; -import { microStxToStx } from '@stacks/ui-utils'; import BigNumber from 'bignumber.js'; import { CryptoCurrencies } from '@shared/models/currencies.model'; @@ -22,6 +21,7 @@ import { removeTrailingNullCharacters } from '@app/common/utils'; import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; import { useStacksBlockTime } from '@app/query/stacks/info/info.hooks'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; +import { microStxToStx } from '@app/ui/utils/micro-stx-to-stx'; export function useStacksTransactionSummary(token: CryptoCurrencies) { const tokenMarketData = useCryptoCurrencyMarketData(token); diff --git a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc-20-choose-fee.tsx b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc-20-choose-fee.tsx index dd8fdefd901..4b56ffd75a3 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc-20-choose-fee.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc-20-choose-fee.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; import { toast } from 'react-hot-toast'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import get from 'lodash.get'; import { logger } from '@shared/logger'; @@ -12,7 +12,7 @@ import { RouteUrls } from '@shared/route-urls'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { formFeeRowValue } from '@app/common/send/utils'; -import { useGenerateSignedNativeSegwitTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; +import { useGenerateUnsignedNativeSegwitSingleRecipientTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; import { BitcoinFeesList, OnChooseFeeArgs, @@ -40,7 +40,7 @@ function useBrc20ChooseFeeState() { export function BrcChooseFee() { const navigate = useNavigate(); const { amount, recipient, tick, utxos } = useBrc20ChooseFeeState(); - const generateTx = useGenerateSignedNativeSegwitTx(); + const generateTx = useGenerateUnsignedNativeSegwitSingleRecipientTx(); const { selectedFeeType, setSelectedFeeType } = useSendBitcoinAssetContextState(); const { initiateTransfer } = useBrc20Transfers(); const { feesList, isLoading } = useBitcoinFeesList({ @@ -70,7 +70,7 @@ export function BrcChooseFee() { const serviceFeeAsMoney = createMoney(serviceFee, 'BTC'); - const resp = generateTx( + const resp = await generateTx( { amount: serviceFeeAsMoney, recipient: serviceFeeRecipient, @@ -118,8 +118,8 @@ export function BrcChooseFee() { diff --git a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form-confirmation.tsx b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form-confirmation.tsx index f56892be046..8dc600b4abe 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form-confirmation.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form-confirmation.tsx @@ -1,7 +1,7 @@ import { useLocation, useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; +import { Stack } from 'leather-styles/jsx'; import get from 'lodash.get'; import { decodeBitcoinTx } from '@shared/crypto/bitcoin/bitcoin.utils'; @@ -12,7 +12,6 @@ import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { sumMoney } from '@app/common/money/calculate-money'; import { formatMoney, formatMoneyPadded } from '@app/common/money/format-money'; -import { LeatherButton } from '@app/components/button/button'; import { InfoCard, InfoCardAssetValue, @@ -24,6 +23,7 @@ import { ModalHeader } from '@app/components/modal-header'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useBrc20Transfers } from '@app/query/bitcoin/ordinals/brc20/use-brc-20'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; +import { LeatherButton } from '@app/ui/components/button'; import { useSendFormNavigate } from '../../hooks/use-send-form-navigate'; @@ -108,15 +108,15 @@ export function Brc20SendFormConfirmation() { return ( - + - + Create transfer inscription diff --git a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form.tsx index e381d59edeb..8814d761f5f 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/brc-20/brc20-send-form.tsx @@ -1,13 +1,13 @@ import { Outlet, useLocation } from 'react-router-dom'; -import { Box } from '@stacks/ui'; import { Form, Formik } from 'formik'; +import { Box } from 'leather-styles/jsx'; import get from 'lodash.get'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { Brc20TokenIcon } from '@app/components/icons/brc20-token-icon'; import { InfoLabel } from '@app/components/info-label'; -import { Link } from '@app/components/link'; +import { LeatherButton } from '@app/ui/components/button'; +import { Brc20TokenIcon } from '@app/ui/components/icons/brc20-token-icon'; import { AmountField } from '../../components/amount-field'; import { FormFooter } from '../../components/form-footer'; @@ -38,7 +38,7 @@ export function Brc20SendForm() { } = useBrc20SendForm({ balance, tick, decimals }); return ( - + {'2. Send transfer inscription to recipient of choice'}

- { openInNewTab( 'https://leather.gitbook.io/guides/bitcoin/sending-brc-20-tokens' ); }} + fontSize={1} + fontWeight={500} + lineHeight="1.6" + variant="link" > {'Learn more'} - + diff --git a/src/app/pages/send/send-crypto-asset-form/form/brc-20/use-brc20-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/brc-20/use-brc20-send-form.tsx index 6c7de9111f5..6bd72eb217f 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/brc-20/use-brc20-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/brc-20/use-brc20-send-form.tsx @@ -64,7 +64,7 @@ export function useBrc20SendForm({ balance, tick, decimals }: UseBrc20SendFormAr recipient: yup .string() .concat(btcAddressValidator()) - .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.network)), + .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.bitcoinNetwork)), // .concat(notCurrentAddressValidator(currentAccountBtcAddress || '')), }); const { onFormStateChange } = useUpdatePersistedSendFormValues(); diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-choose-fee.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-choose-fee.tsx index f258442d0b2..6277b2b8004 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-choose-fee.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-choose-fee.tsx @@ -1,10 +1,9 @@ -import { useLocation } from 'react-router-dom'; - -import get from 'lodash.get'; +import { Outlet } from 'react-router-dom'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; import { BitcoinSendFormValues } from '@shared/models/form.model'; +import { useLocationStateWithCache } from '@app/common/hooks/use-location-state'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { BitcoinFeesList } from '@app/components/bitcoin-fees-list/bitcoin-fees-list'; import { useBitcoinFeesList } from '@app/components/bitcoin-fees-list/use-bitcoin-fees-list'; @@ -17,12 +16,11 @@ import { useSendBitcoinAssetContextState } from '../../family/bitcoin/components import { useBtcChooseFee } from './use-btc-choose-fee'; export function useBtcChooseFeeState() { - const location = useLocation(); - return { - isSendingMax: get(location.state, 'isSendingMax') as boolean, - txValues: get(location.state, 'values') as BitcoinSendFormValues, - utxos: get(location.state, 'utxos') as UtxoResponseItem[], - }; + const isSendingMax = useLocationStateWithCache('isSendingMax') as boolean; + const txValues = useLocationStateWithCache('values') as BitcoinSendFormValues; + const utxos = useLocationStateWithCache('utxos') as UtxoResponseItem[]; + + return { isSendingMax, txValues, utxos }; } export function BtcChooseFee() { @@ -45,26 +43,29 @@ export function BtcChooseFee() { useRouteHeader(); return ( - setSelectedFeeType(value)} - onValidateBitcoinSpend={onValidateBitcoinAmountSpend} - selectedFeeType={selectedFeeType} - /> - } - isSendingMax={isSendingMax} - onChooseFee={previewTransaction} - onValidateBitcoinSpend={onValidateBitcoinAmountSpend} - onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} - recipient={txValues.recipient} - recommendedFeeRate={recommendedFeeRate} - showError={showInsufficientBalanceError} - maxRecommendedFeeRate={feesList[0]?.feeRate} - /> + <> + setSelectedFeeType(value)} + onValidateBitcoinSpend={onValidateBitcoinAmountSpend} + selectedFeeType={selectedFeeType} + /> + } + isSendingMax={isSendingMax} + onChooseFee={previewTransaction} + onValidateBitcoinSpend={onValidateBitcoinAmountSpend} + onSetSelectedFeeType={(value: BtcFeeType | null) => setSelectedFeeType(value)} + recipient={txValues.recipient} + recommendedFeeRate={recommendedFeeRate} + showError={showInsufficientBalanceError} + maxRecommendedFeeRate={feesList[0]?.feeRate} + /> + + ); } diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx index 5687ced6625..a26e1e8b649 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form-confirmation.tsx @@ -1,7 +1,9 @@ import { useLocation, useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { hexToBytes } from '@noble/hashes/utils'; +import * as btc from '@scure/btc-signer'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; +import { Stack } from 'leather-styles/jsx'; import get from 'lodash.get'; import { decodeBitcoinTx } from '@shared/crypto/bitcoin/bitcoin.utils'; @@ -16,7 +18,6 @@ import { formatMoneyPadded, i18nFormatCurrency } from '@app/common/money/format- import { satToBtc } from '@app/common/money/unit-conversion'; import { queryClient } from '@app/common/persistence'; import { FormAddressDisplayer } from '@app/components/address-displayer/form-address-displayer'; -import { LeatherButton } from '@app/components/button/button'; import { InfoCard, InfoCardAssetValue, @@ -28,6 +29,7 @@ import { ModalHeader } from '@app/components/modal-header'; import { useCurrentNativeSegwitUtxos } from '@app/query/bitcoin/address/utxos-by-address.hooks'; import { useBitcoinBroadcastTransaction } from '@app/query/bitcoin/transaction/use-bitcoin-broadcast-transaction'; import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; +import { LeatherButton } from '@app/ui/components/button'; import { useSendFormNavigate } from '../../hooks/use-send-form-navigate'; @@ -47,16 +49,20 @@ function useBtcSendFormConfirmationState() { export function BtcSendFormConfirmation() { const navigate = useNavigate(); const { tx, recipient, fee, arrivesIn, feeRowValue } = useBtcSendFormConfirmationState(); + const { refetch } = useCurrentNativeSegwitUtxos(); const analytics = useAnalytics(); const btcMarketData = useCryptoCurrencyMarketData('BTC'); const { broadcastTx, isBroadcasting } = useBitcoinBroadcastTransaction(); - const psbt = decodeBitcoinTx(tx); + + const transaction = btc.Transaction.fromRaw(hexToBytes(tx)); + + const decodedTx = decodeBitcoinTx(transaction.hex); const nav = useSendFormNavigate(); - const transferAmount = satToBtc(psbt.outputs[0].amount.toString()).toString(); + const transferAmount = satToBtc(decodedTx.outputs[0].amount.toString()).toString(); const txFiatValue = i18nFormatCurrency( baseCurrencyAmountInQuote(createMoneyFromDecimal(Number(transferAmount), symbol), btcMarketData) ); @@ -71,14 +77,14 @@ export function BtcSendFormConfirmation() { async function initiateTransaction() { await broadcastTx({ - tx, + tx: transaction.hex, async onSuccess(txid) { void analytics.track('broadcast_transaction', { symbol: 'btc', amount: transferAmount, fee, - inputs: psbt.inputs.length, - outputs: psbt.inputs.length, + inputs: decodedTx.inputs.length, + outputs: decodedTx.inputs.length, }); await refetch(); navigate(RouteUrls.SentBtcTxSummary.replace(':txId', `${txid}`), { @@ -86,9 +92,10 @@ export function BtcSendFormConfirmation() { }); // invalidate txs query after some time to ensure that the new tx will be shown in the list - setTimeout(() => { - void queryClient.invalidateQueries({ queryKey: ['btc-txs-by-address'] }); - }, 2000); + setTimeout( + () => void queryClient.invalidateQueries({ queryKey: ['btc-txs-by-address'] }), + 2000 + ); }, onError(e) { nav.toErrorPage(e); @@ -122,17 +129,17 @@ export function BtcSendFormConfirmation() { return ( - + } @@ -150,7 +157,7 @@ export function BtcSendFormConfirmation() { - + Confirm and send transaction diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx index 1fa15be9b5d..42af9f7ee99 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/btc-send-form.tsx @@ -1,17 +1,17 @@ import { Outlet } from 'react-router-dom'; -import { Box } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; import { Form, Formik } from 'formik'; +import { Box } from 'leather-styles/jsx'; import { HIGH_FEE_WARNING_LEARN_MORE_URL_BTC } from '@shared/constants'; import { CryptoCurrencies } from '@shared/models/currencies.model'; -import { BtcIcon } from '@app/components/icons/btc-icon'; import { HighFeeDrawer } from '@app/features/high-fee-drawer/high-fee-drawer'; import { useNativeSegwitBalance } from '@app/query/bitcoin/balance/btc-native-segwit-balance.hooks'; import { useCryptoCurrencyMarketData } from '@app/query/common/market-data/market-data.hooks'; import { useCurrentAccountNativeSegwitIndexZeroSigner } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; +import { BtcIcon } from '@app/ui/components/icons/btc-icon'; import { AmountField } from '../../components/amount-field'; import { FormFooter } from '../../components/form-footer'; @@ -47,7 +47,7 @@ export function BtcSendForm() { } = useBtcSendForm(); return ( - + - {currentNetwork.chain.bitcoin.network === 'testnet' && } + {currentNetwork.chain.bitcoin.bitcoinNetwork === 'testnet' && } diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-choose-fee.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-choose-fee.tsx index e3d8e5f3d18..55f5dcb07d7 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-choose-fee.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-choose-fee.tsx @@ -3,13 +3,12 @@ import { useNavigate } from 'react-router-dom'; import { logger } from '@shared/logger'; import { BtcFeeType } from '@shared/models/fees/bitcoin-fees.model'; import { createMoney } from '@shared/models/money.model'; -import { noop } from '@shared/utils'; import { btcToSat } from '@app/common/money/unit-conversion'; import { formFeeRowValue } from '@app/common/send/utils'; -import { useGenerateSignedNativeSegwitTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; -import { useWalletType } from '@app/common/use-wallet-type'; +import { useGenerateUnsignedNativeSegwitSingleRecipientTx } from '@app/common/transactions/bitcoin/use-generate-bitcoin-tx'; import { OnChooseFeeArgs } from '@app/components/bitcoin-fees-list/bitcoin-fees-list'; +import { useSignBitcoinTx } from '@app/store/accounts/blockchain/bitcoin/bitcoin.hooks'; import { useSendBitcoinAssetContextState } from '../../family/bitcoin/components/send-bitcoin-asset-container'; import { useCalculateMaxBitcoinSpend } from '../../family/bitcoin/hooks/use-calculate-max-spend'; @@ -19,12 +18,11 @@ import { useBtcChooseFeeState } from './btc-choose-fee'; export function useBtcChooseFee() { const { isSendingMax, txValues, utxos } = useBtcChooseFeeState(); const navigate = useNavigate(); - const { whenWallet } = useWalletType(); const sendFormNavigate = useSendFormNavigate(); - const generateTx = useGenerateSignedNativeSegwitTx(); + const generateTx = useGenerateUnsignedNativeSegwitSingleRecipientTx(); const { setSelectedFeeType } = useSendBitcoinAssetContextState(); const calcMaxSpend = useCalculateMaxBitcoinSpend(); - + const signTx = useSignBitcoinTx(); const amountAsMoney = createMoney(btcToSat(txValues.amount).toNumber(), 'BTC'); return { @@ -35,7 +33,7 @@ export function useBtcChooseFee() { }, async previewTransaction({ feeRate, feeValue, time, isCustomFee }: OnChooseFeeArgs) { - const resp = generateTx( + const resp = await generateTx( { amount: isSendingMax ? calcMaxSpend(txValues.recipient, utxos, feeRate).amount @@ -46,22 +44,22 @@ export function useBtcChooseFee() { utxos, isSendingMax ); - + const feeRowValue = formFeeRowValue(feeRate, isCustomFee); if (!resp) return logger.error('Attempted to generate raw tx, but no tx exists'); - const { hex } = resp; - const feeRowValue = formFeeRowValue(feeRate, isCustomFee); - whenWallet({ - software: () => - sendFormNavigate.toConfirmAndSignBtcTransaction({ - tx: hex, - recipient: txValues.recipient, - fee: feeValue, - feeRowValue, - time, - }), - ledger: noop, - })(); + const signedTx = await signTx(resp.psbt); + + if (!signedTx) return logger.error('Attempted to sign tx, but no tx exists'); + + signedTx.finalize(); + + sendFormNavigate.toConfirmAndSignBtcTransaction({ + tx: signedTx.hex, + recipient: txValues.recipient, + fee: feeValue, + feeRowValue, + time, + }); }, }; } diff --git a/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-send-form.tsx index d502119d4da..037be8222a2 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/btc/use-btc-send-form.tsx @@ -3,13 +3,10 @@ import { useRef, useState } from 'react'; import { FormikHelpers, FormikProps } from 'formik'; import * as yup from 'yup'; -import { logger } from '@shared/logger'; import { BitcoinSendFormValues } from '@shared/models/form.model'; -import { noop } from '@shared/utils'; import { formatPrecisionError } from '@app/common/error-formatters'; import { useOnMount } from '@app/common/hooks/use-on-mount'; -import { useWalletType } from '@app/common/use-wallet-type'; import { btcAddressNetworkValidator, btcAddressValidator, @@ -39,7 +36,6 @@ export function useBtcSendForm() { const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); const { data: utxos = [], refetch } = useCurrentNativeSegwitAccountSpendableUtxos(); const btcCryptoCurrencyAssetBalance = useNativeSegwitBalance(nativeSegwitSigner.address); - const { whenWallet } = useWalletType(); const sendFormNavigate = useSendFormNavigate(); const calcMaxSpend = useCalculateMaxBitcoinSpend(); const { onFormStateChange } = useUpdatePersistedSendFormValues(); @@ -77,7 +73,7 @@ export function useBtcSendForm() { recipient: yup .string() .concat(btcAddressValidator()) - .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.network)) + .concat(btcAddressNetworkValidator(currentNetwork.chain.bitcoin.bitcoinNetwork)) .concat(notCurrentAddressValidator(nativeSegwitSigner.address || '')) .required('Enter a bitcoin address'), }), @@ -86,14 +82,9 @@ export function useBtcSendForm() { values: BitcoinSendFormValues, formikHelpers: FormikHelpers ) { - logger.debug('btc form values', values); - // Validate and check high fee warning first + // Validate and check high fee warning firsts await formikHelpers.validateForm(); - - whenWallet({ - software: () => sendFormNavigate.toChooseTransactionFee(isSendingMax, utxos, values), - ledger: noop, - })(); + sendFormNavigate.toChooseTransactionFee(isSendingMax, utxos, values); }, }; } diff --git a/src/app/pages/send/send-crypto-asset-form/form/send-form-confirmation.tsx b/src/app/pages/send/send-crypto-asset-form/form/send-form-confirmation.tsx index 26df35d84ac..9f1f304c635 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/send-form-confirmation.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/send-form-confirmation.tsx @@ -1,9 +1,8 @@ -import { Stack } from '@stacks/ui'; import { SendCryptoAssetSelectors } from '@tests/selectors/send.selectors'; +import { Stack } from 'leather-styles/jsx'; import { whenPageMode } from '@app/common/utils'; import { FormAddressDisplayer } from '@app/components/address-displayer/form-address-displayer'; -import { LeatherButton } from '@app/components/button/button'; import { InfoCard, InfoCardAssetValue, @@ -12,6 +11,7 @@ import { InfoCardSeparator, } from '@app/components/info-card/info-card'; import { InfoLabel } from '@app/components/info-label'; +import { LeatherButton } from '@app/ui/components/button'; interface SendFormConfirmationProps { recipient: string; @@ -29,7 +29,6 @@ interface SendFormConfirmationProps { feeWarningTooltip?: React.ReactNode; onBroadcastTransaction: () => void; } - export function SendFormConfirmation({ txValue, txFiatValue, @@ -51,24 +50,25 @@ export function SendFormConfirmation({ data-testid={SendCryptoAssetSelectors.ConfirmationDetails} pb={whenPageMode({ full: '0px', - popup: '80px', + popup: '120px', })} > - + {`Make sure you include the memo so the exchange can credit the ${symbol} to your account`} - + } @@ -94,10 +94,10 @@ export function SendFormConfirmation({ Confirm and send transaction diff --git a/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/sip10-token-send-form-container.tsx b/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/sip10-token-send-form-container.tsx index 8e0116ffab4..687f888f53c 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/sip10-token-send-form-container.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/sip10-token-send-form-container.tsx @@ -11,7 +11,6 @@ interface Sip10TokenSendFormContainerProps { symbol: string; contractId: string; } - export function Sip10TokenSendFormContainer({ symbol, contractId, diff --git a/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/use-sip10-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/use-sip10-send-form.tsx index 01de215ec26..10fe5b0a81b 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/use-sip10-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/stacks-sip10/use-sip10-send-form.tsx @@ -24,7 +24,6 @@ interface UseSip10SendFormArgs { symbol: string; contractId: string; } - export function useSip10SendForm({ symbol, contractId }: UseSip10SendFormArgs) { const assetBalance = useStacksFungibleTokenAssetBalance(contractId); const generateTx = useGenerateFtTokenTransferUnsignedTx(assetBalance); diff --git a/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-common-send-form.tsx b/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-common-send-form.tsx index ecf44a7b924..8a4041e0993 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-common-send-form.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-common-send-form.tsx @@ -1,7 +1,7 @@ import { Outlet, useNavigate } from 'react-router-dom'; -import { Box } from '@stacks/ui'; import { Form, Formik, FormikHelpers } from 'formik'; +import { Box } from 'leather-styles/jsx'; import { ObjectSchema } from 'yup'; import { HIGH_FEE_WARNING_LEARN_MORE_URL_STX } from '@shared/constants'; @@ -48,7 +48,7 @@ export function StacksCommonSendForm({ const { onFormStateChange } = useUpdatePersistedSendFormValues(); return ( - + - + + + navigate(RouteUrls.EditNonce)} /> diff --git a/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-send-form-confirmation.tsx b/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-send-form-confirmation.tsx index 84b6cfcf81f..6cf07846e5d 100644 --- a/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-send-form-confirmation.tsx +++ b/src/app/pages/send/send-crypto-asset-form/form/stacks/stacks-send-form-confirmation.tsx @@ -1,13 +1,14 @@ -import { FiInfo } from 'react-icons/fi'; import { Outlet, useNavigate, useParams } from 'react-router-dom'; -import { Box, Stack, Tooltip, color } from '@stacks/ui'; +import { Box, Stack } from 'leather-styles/jsx'; import { CryptoCurrencies } from '@shared/models/currencies.model'; import { useLocationStateWithCache } from '@app/common/hooks/use-location-state'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; import { ModalHeader } from '@app/components/modal-header'; +import { Tooltip } from '@app/components/tooltip'; +import { InfoIcon } from '@app/ui/components/icons/info-icon'; import { useStacksBroadcastTransaction } from '../../family/stacks/hooks/use-stacks-broadcast-transaction'; import { useStacksTransactionSummary } from '../../family/stacks/hooks/use-stacks-transaction-summary'; @@ -62,13 +63,9 @@ export function StacksSendFormConfirmation() { placement="bottom" > - + + +
) : null; diff --git a/src/app/pages/send/send-crypto-asset-form/send-crypto-asset-form.routes.tsx b/src/app/pages/send/send-crypto-asset-form/send-crypto-asset-form.routes.tsx index 79219a3908d..4db89f85939 100644 --- a/src/app/pages/send/send-crypto-asset-form/send-crypto-asset-form.routes.tsx +++ b/src/app/pages/send/send-crypto-asset-form/send-crypto-asset-form.routes.tsx @@ -6,7 +6,8 @@ import { RouteUrls } from '@shared/route-urls'; import { BroadcastErrorDrawer } from '@app/components/broadcast-error-drawer/broadcast-error-drawer'; import { FullPageWithHeaderLoadingSpinner } from '@app/components/loading-spinner'; import { EditNonceDrawer } from '@app/features/edit-nonce-drawer/edit-nonce-drawer'; -import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes'; +import { ledgerBitcoinTxSigningRoutes } from '@app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container'; +import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-stacks-tx-container'; import { AccountGate } from '@app/routes/account-gate'; import { BroadcastError } from '../broadcast-error/broadcast-error'; @@ -58,12 +59,15 @@ export const sendCryptoAssetFormRoutes = ( path={RouteUrls.SendCryptoAssetForm.replace(':symbol', 'btc')} element={} > + {ledgerBitcoinTxSigningRoutes} {recipientAccountsDrawerRoute}
} /> } /> } /> - } /> + }> + {ledgerBitcoinTxSigningRoutes} + } /> } /> diff --git a/src/app/pages/send/sent-summary/brc20-sent-symmary.tsx b/src/app/pages/send/sent-summary/brc20-sent-symmary.tsx index 9581e32032d..30e2b428439 100644 --- a/src/app/pages/send/sent-summary/brc20-sent-symmary.tsx +++ b/src/app/pages/send/sent-summary/brc20-sent-symmary.tsx @@ -1,7 +1,6 @@ -import { FiExternalLink } from 'react-icons/fi'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { HStack, Stack } from 'leather-styles/jsx'; import get from 'lodash.get'; import { createMoney } from '@shared/models/money.model'; @@ -19,8 +18,9 @@ import { InfoCardSeparator, } from '@app/components/info-card/info-card'; import { InfoLabel } from '@app/components/info-label'; -import { Link } from '@app/components/link'; import { ModalHeader } from '@app/components/modal-header'; +import { LeatherButton } from '@app/ui/components/button'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; import { TxDone } from '../send-crypto-asset-form/components/tx-done'; @@ -53,23 +53,24 @@ export function Brc20SentSummary() { - + - - + + {`You'll need to send the transfer inscription to your recipient of choice from the home screen once its status changes to "Ready to send"`}

- { openInNewTab('https://leather.gitbook.io/guides/bitcoin/sending-brc-20-tokens'); }} + variant="link" > {'Learn more'} - +
@@ -81,13 +82,13 @@ export function Brc20SentSummary() {
- + } label="Pending BRC-20 transfers" + onClick={onClickLink} /> - +
); diff --git a/src/app/pages/send/sent-summary/btc-sent-summary.tsx b/src/app/pages/send/sent-summary/btc-sent-summary.tsx index 5f9aa8b6254..e37b851f8c8 100644 --- a/src/app/pages/send/sent-summary/btc-sent-summary.tsx +++ b/src/app/pages/send/sent-summary/btc-sent-summary.tsx @@ -1,8 +1,7 @@ import { toast } from 'react-hot-toast'; -import { FiCopy, FiExternalLink } from 'react-icons/fi'; import { useLocation } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { HStack, Stack } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; @@ -18,6 +17,8 @@ import { InfoCardSeparator, } from '@app/components/info-card/info-card'; import { ModalHeader } from '@app/components/modal-header'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; import { TxDone } from '../send-crypto-asset-form/components/tx-done'; @@ -44,7 +45,7 @@ export function BtcSentSummary() { function onClickLink() { void analytics.track('view_transaction_confirmation', { symbol: 'BTC' }); - handleOpenTxLink({ blockchain: txLink.blockchain, txId: txLink.txid }); + handleOpenTxLink({ blockchain: txLink.blockchain, txid: txLink.txid }); } function onClickCopy() { @@ -58,14 +59,14 @@ export function BtcSentSummary() { - + } /> @@ -76,10 +77,14 @@ export function BtcSentSummary() { - - - - + + } + label="View details" + onClick={onClickLink} + /> + } label="Copy ID" onClick={onClickCopy} /> + ); diff --git a/src/app/pages/send/sent-summary/stx-sent-summary.tsx b/src/app/pages/send/sent-summary/stx-sent-summary.tsx index ea895df4b70..426e866b68b 100644 --- a/src/app/pages/send/sent-summary/stx-sent-summary.tsx +++ b/src/app/pages/send/sent-summary/stx-sent-summary.tsx @@ -1,13 +1,13 @@ import { toast } from 'react-hot-toast'; -import { FiCopy, FiExternalLink } from 'react-icons/fi'; import { useLocation } from 'react-router-dom'; -import { Stack } from '@stacks/ui'; +import { HStack, Stack } from 'leather-styles/jsx'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { useClipboard } from '@app/common/hooks/use-copy-to-clipboard'; import { useExplorerLink } from '@app/common/hooks/use-explorer-link'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; +import { whenPageMode } from '@app/common/utils'; import { FormAddressDisplayer } from '@app/components/address-displayer/form-address-displayer'; import { InfoCard, @@ -18,6 +18,8 @@ import { InfoCardSeparator, } from '@app/components/info-card/info-card'; import { ModalHeader } from '@app/components/modal-header'; +import { CopyIcon } from '@app/ui/components/icons/copy-icon'; +import { ExternalLinkIcon } from '@app/ui/components/icons/external-link-icon'; import { TxDone } from '../send-crypto-asset-form/components/tx-done'; @@ -55,18 +57,23 @@ export function StxSentSummary() { useRouteHeader(); return ( - + - + } /> @@ -77,10 +84,14 @@ export function StxSentSummary() { - - - - + + } + label="View details" + onClick={onClickLink} + /> + } label="Copy ID" onClick={onClickCopy} /> + ); diff --git a/src/app/pages/sign-out-confirm/sign-out-confirm.layout.tsx b/src/app/pages/sign-out-confirm/sign-out-confirm.layout.tsx index 52e1dc9d5db..b26078e739e 100644 --- a/src/app/pages/sign-out-confirm/sign-out-confirm.layout.tsx +++ b/src/app/pages/sign-out-confirm/sign-out-confirm.layout.tsx @@ -1,14 +1,12 @@ -import { Flex } from '@stacks/ui'; import { SettingsSelectors } from '@tests/selectors/settings.selectors'; import { useFormik } from 'formik'; import { Box, HStack, styled } from 'leather-styles/jsx'; -import { token } from 'leather-styles/tokens'; import { useWalletType } from '@app/common/use-wallet-type'; -import { LeatherButton } from '@app/components/button/button'; import { BaseDrawer } from '@app/components/drawer/base-drawer'; -import { ErrorIcon } from '@app/components/icons/error-icon'; import { Flag } from '@app/components/layout/flag'; +import { LeatherButton } from '@app/ui/components/button'; +import { ErrorIcon } from '@app/ui/components/icons/error-icon'; interface SignOutConfirmLayoutProps { onUserDeleteWallet(): void; @@ -43,17 +41,16 @@ export function SignOutConfirmLayout(props: SignOutConfirmLayoutProps) { {whenWallet({ software: ( - } spacing="tight"> + } spacing="space.02"> If you haven't backed up your Secret Key, you will lose all your funds. ), ledger: <>, })} - @@ -67,11 +64,10 @@ export function SignOutConfirmLayout(props: SignOutConfirmLayoutProps) { I've backed up my Secret Key - - + @@ -85,7 +81,7 @@ export function SignOutConfirmLayout(props: SignOutConfirmLayoutProps) { I understand my password will no longer work for accessing my wallet upon signing out - + ); } diff --git a/src/app/pages/stacks-message-signing-request/components/nested-tuple-displayer.tsx b/src/app/pages/stacks-message-signing-request/components/nested-tuple-displayer.tsx index 7d55e4598cb..99885ef234b 100644 --- a/src/app/pages/stacks-message-signing-request/components/nested-tuple-displayer.tsx +++ b/src/app/pages/stacks-message-signing-request/components/nested-tuple-displayer.tsx @@ -1,5 +1,5 @@ import { ClarityType } from '@stacks/transactions'; -import { Box, BoxProps, Flex, FlexProps } from '@stacks/ui'; +import { Box, BoxProps, Flex, FlexProps } from 'leather-styles/jsx'; import { figmaTheme } from '@app/common/utils/figma-theme'; @@ -15,7 +15,7 @@ export function TupleDisplayer({ isRoot, ...rest }: TupleDisplayerProps) { fontFamily: 'Fira Code', } : {}; - return ; + return ; } interface TupleNodeDisplayerProps { @@ -26,7 +26,7 @@ export function TupleNodeDisplayer({ clarityType, ...props }: TupleNodeDisplayer return clarityType === ClarityType.Tuple ? : ; } export function TupleNodeLabelDisplayer(props: BoxProps) { - return ; + return ; } export function TupleNodeValueDisplayer(props: FlexProps) { diff --git a/src/app/pages/stacks-message-signing-request/components/structured-data-box.tsx b/src/app/pages/stacks-message-signing-request/components/structured-data-box.tsx index 073607df8d6..0dad0d7764e 100644 --- a/src/app/pages/stacks-message-signing-request/components/structured-data-box.tsx +++ b/src/app/pages/stacks-message-signing-request/components/structured-data-box.tsx @@ -1,8 +1,7 @@ import { useEffect, useState } from 'react'; import { ClarityValue } from '@stacks/transactions'; -import { Stack, color } from '@stacks/ui'; -import { Box, Divider, HStack, styled } from 'leather-styles/jsx'; +import { Box, Divider, HStack, Stack, styled } from 'leather-styles/jsx'; import { StructuredMessageDataDomain } from '@shared/signature/signature-types'; @@ -42,12 +41,12 @@ export function StructuredDataBox(props: { - + {domainName} diff --git a/src/app/pages/swap/components/select-asset-trigger-button.tsx b/src/app/pages/swap/components/select-asset-trigger-button.tsx index 22200a7a2c3..c46a7fdb3eb 100644 --- a/src/app/pages/swap/components/select-asset-trigger-button.tsx +++ b/src/app/pages/swap/components/select-asset-trigger-button.tsx @@ -1,8 +1,8 @@ import { useField } from 'formik'; import { HStack, styled } from 'leather-styles/jsx'; -import { LeatherButton } from '@app/components/button/button'; -import { ChevronDownIcon } from '@app/components/icons/chevron-down-icon'; +import { LeatherButton } from '@app/ui/components/button'; +import { ChevronDownIcon } from '@app/ui/components/icons/chevron-down-icon'; interface SelectAssetTriggerButtonProps { icon?: string; diff --git a/src/app/pages/swap/components/selected-asset.tsx b/src/app/pages/swap/components/selected-asset.tsx index 61454c32c23..c2ede5a1dc5 100644 --- a/src/app/pages/swap/components/selected-asset.tsx +++ b/src/app/pages/swap/components/selected-asset.tsx @@ -9,10 +9,10 @@ interface SelectedAssetProps { export function SelectedAsset({ contentLeft, contentRight, name, showError }: SelectedAssetProps) { return ( - + ); } diff --git a/src/app/pages/swap/generate-swap-routes.tsx b/src/app/pages/swap/generate-swap-routes.tsx index 8a84df1758f..eba6b0906db 100644 --- a/src/app/pages/swap/generate-swap-routes.tsx +++ b/src/app/pages/swap/generate-swap-routes.tsx @@ -2,7 +2,7 @@ import { Route } from 'react-router-dom'; import { RouteUrls } from '@shared/route-urls'; -import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes'; +import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-stacks-tx-container'; import { AccountGate } from '@app/routes/account-gate'; import { Swap } from './swap'; diff --git a/src/app/pages/swap/swap-error/swap-error.tsx b/src/app/pages/swap/swap-error/swap-error.tsx index bc38890803c..3d7d07c2ac7 100644 --- a/src/app/pages/swap/swap-error/swap-error.tsx +++ b/src/app/pages/swap/swap-error/swap-error.tsx @@ -5,12 +5,13 @@ import get from 'lodash.get'; import { RouteUrls } from '@shared/route-urls'; -import { GenericError } from '@app/components/generic-error/generic-error'; +import { GenericError, GenericErrorListItem } from '@app/components/generic-error/generic-error'; const helpTextList = [ - - Please report issue to swap protocol - , + Please report issue to swap protocol} + />, ]; export function SwapError() { diff --git a/src/app/pages/swap/swap-review/swap-review.tsx b/src/app/pages/swap/swap-review/swap-review.tsx index c238f7f737b..f4da62947bb 100644 --- a/src/app/pages/swap/swap-review/swap-review.tsx +++ b/src/app/pages/swap/swap-review/swap-review.tsx @@ -2,8 +2,8 @@ import { Outlet } from 'react-router-dom'; import { LoadingKeys, useLoading } from '@app/common/hooks/use-loading'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; -import { LeatherButton } from '@app/components/button/button'; import { ModalHeader } from '@app/components/modal-header'; +import { LeatherButton } from '@app/ui/components/button'; import { SwapAssetsPair } from '../components/swap-assets-pair/swap-assets-pair'; import { SwapContentLayout } from '../components/swap-content.layout'; diff --git a/src/app/pages/swap/swap.tsx b/src/app/pages/swap/swap.tsx index 90979a896fd..f876fae4b0e 100644 --- a/src/app/pages/swap/swap.tsx +++ b/src/app/pages/swap/swap.tsx @@ -6,9 +6,9 @@ import { useFormikContext } from 'formik'; import { isUndefined } from '@shared/utils'; import { useRouteHeader } from '@app/common/hooks/use-route-header'; -import { LeatherButton } from '@app/components/button/button'; import { LoadingSpinner } from '@app/components/loading-spinner'; import { ModalHeader } from '@app/components/modal-header'; +import { LeatherButton } from '@app/ui/components/button'; import { SwapContentLayout } from './components/swap-content.layout'; import { SwapFooterLayout } from './components/swap-footer.layout'; diff --git a/src/app/pages/transaction-request/transaction-request.tsx b/src/app/pages/transaction-request/transaction-request.tsx index 36514eb0429..88c5fa001ec 100644 --- a/src/app/pages/transaction-request/transaction-request.tsx +++ b/src/app/pages/transaction-request/transaction-request.tsx @@ -1,8 +1,8 @@ import { memo } from 'react'; import { Outlet, useNavigate } from 'react-router-dom'; -import { Flex } from '@stacks/ui'; import { Formik } from 'formik'; +import { Flex } from 'leather-styles/jsx'; import get from 'lodash.get'; import * as yup from 'yup'; @@ -106,7 +106,7 @@ function TransactionRequestBase() { }; return ( - + navigate(RouteUrls.EditNonce)} /> diff --git a/src/app/pages/unauthorized-request/unauthorized-request.tsx b/src/app/pages/unauthorized-request/unauthorized-request.tsx index 9cd077a24b9..89406931f0d 100644 --- a/src/app/pages/unauthorized-request/unauthorized-request.tsx +++ b/src/app/pages/unauthorized-request/unauthorized-request.tsx @@ -1,14 +1,15 @@ -import { Box } from '@stacks/ui'; - -import { GenericError } from '@app/components/generic-error/generic-error'; +import { GenericError, GenericErrorListItem } from '@app/components/generic-error/generic-error'; const body = `The transaction request was not properly authorized by any of your Leather accounts. This typically happens if you've logged into this app before using another account.`; + const helpTextList = [ - - Sign out of the app and sign back in to re-authenticate into the application. This should help - you successfully sign your transaction with Leather. - , + , ]; + const title = 'Unauthorized request'; export function UnauthorizedRequest() { diff --git a/src/app/pages/unlock.tsx b/src/app/pages/unlock.tsx index f51c98a0011..85b5bc7127e 100644 --- a/src/app/pages/unlock.tsx +++ b/src/app/pages/unlock.tsx @@ -41,7 +41,13 @@ export function Unlock() { )} + Your +
+ session is locked + + } caption="Enter the password you set on this device" onSuccess={handleSuccess} /> diff --git a/src/app/pages/update-profile-request/components/page-top.tsx b/src/app/pages/update-profile-request/components/page-top.tsx index 59e1ecd05a0..b697ba81f4d 100644 --- a/src/app/pages/update-profile-request/components/page-top.tsx +++ b/src/app/pages/update-profile-request/components/page-top.tsx @@ -1,12 +1,13 @@ import { memo } from 'react'; -import { Flex, Stack } from '@stacks/ui'; +import { Flex, Stack } from 'leather-styles/jsx'; import { getProfileDataContentFromToken } from '@app/common/profiles/requests'; import { addPortSuffix, getUrlHostname } from '@app/common/utils'; -import { Caption, Title } from '@app/components/typography'; import { useCurrentNetworkState } from '@app/store/networks/networks.hooks'; import { useProfileUpdateRequestSearchParams } from '@app/store/profiles/requests.hooks'; +import { Caption } from '@app/ui/components/typography/caption'; +import { Title } from '@app/ui/components/typography/title'; function PageTopBase() { const { isTestnet, chain } = useCurrentNetworkState(); @@ -25,10 +26,8 @@ function PageTopBase() { const avatarUrl = profileUpdaterPayload?.profile?.image?.[0]?.contentUrl; return ( - - - Update Profile - + + Update Profile {caption && {caption}} {avatarUrl && ( diff --git a/src/app/pages/update-profile-request/components/profile-box.tsx b/src/app/pages/update-profile-request/components/profile-box.tsx index 3606fb053b2..776eb631905 100644 --- a/src/app/pages/update-profile-request/components/profile-box.tsx +++ b/src/app/pages/update-profile-request/components/profile-box.tsx @@ -1,9 +1,13 @@ import { Profile } from '@stacks/profile'; -import { Box, Stack, color } from '@stacks/ui'; +import { Box, Stack, styled } from 'leather-styles/jsx'; function Value({ v }: { v: any }) { if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') { - return {v}; + return ( + + {v} + + ); } else if (v instanceof Array) { return ( <> @@ -35,8 +39,8 @@ function Properties({ p }: { p: any }) { .filter(k => !k.startsWith('@')) .map(k => { return ( - - {k}: + + {k}: ); })} @@ -46,18 +50,18 @@ function Properties({ p }: { p: any }) { export function ProfileBox({ profile }: { profile: Profile }): React.JSX.Element | null { return ( - + - - + + - +
diff --git a/src/app/pages/update-profile-request/components/update-action.layout.tsx b/src/app/pages/update-profile-request/components/update-action.layout.tsx index 0932f169626..e6e80dd5ac1 100644 --- a/src/app/pages/update-profile-request/components/update-action.layout.tsx +++ b/src/app/pages/update-profile-request/components/update-action.layout.tsx @@ -1,32 +1,32 @@ -import { Button, Stack } from '@stacks/ui'; import { UpdateProfileRequestSelectors } from '@tests/selectors/requests.selectors'; +import { HStack } from 'leather-styles/jsx'; -interface UpdateActionProfileProps { +import { LeatherButton } from '@app/ui/components/button'; + +interface UpdateActionLayoutProps { onUpdateProfile: () => Promise; onCancel: () => void; isLoading: boolean; } - export function UpdateActionLayout({ onUpdateProfile, onCancel, isLoading, -}: UpdateActionProfileProps) { +}: UpdateActionLayoutProps) { return ( - - - - +
+
); } diff --git a/src/app/pages/update-profile-request/components/update-profile-error-msg.tsx b/src/app/pages/update-profile-request/components/update-profile-error-msg.tsx index 681d409eab4..004f4c24060 100644 --- a/src/app/pages/update-profile-request/components/update-profile-error-msg.tsx +++ b/src/app/pages/update-profile-request/components/update-profile-error-msg.tsx @@ -1,8 +1,7 @@ -import { FiAlertTriangle } from 'react-icons/fi'; +import { HStack } from 'leather-styles/jsx'; -import { Box, Stack, color } from '@stacks/ui'; - -import { Caption } from '@app/components/typography'; +import { ErrorIcon } from '@app/ui/components/icons/error-icon'; +import { Caption } from '@app/ui/components/typography/caption'; interface ErrorMessageProps { errorMessage: string; @@ -12,9 +11,9 @@ export function ErrorMessage(props: ErrorMessageProps) { if (!errorMessage) return null; return ( - - - {errorMessage} - + + + {errorMessage} + ); } diff --git a/src/app/pages/update-profile-request/components/update-profile-request.layout.tsx b/src/app/pages/update-profile-request/components/update-profile-request.layout.tsx index ab424f18fde..497691e1420 100644 --- a/src/app/pages/update-profile-request/components/update-profile-request.layout.tsx +++ b/src/app/pages/update-profile-request/components/update-profile-request.layout.tsx @@ -1,4 +1,4 @@ -import { Stack } from '@stacks/ui'; +import { Stack } from 'leather-styles/jsx'; import { PageTop } from './page-top'; @@ -7,7 +7,7 @@ interface ProfileUpdateRequestLayoutProps { } export function ProfileUpdateRequestLayout({ children }: ProfileUpdateRequestLayoutProps) { return ( - + {children} diff --git a/src/app/pages/view-secret-key/view-secret-key.tsx b/src/app/pages/view-secret-key/view-secret-key.tsx index fcb3fc19c4c..5921326d62b 100644 --- a/src/app/pages/view-secret-key/view-secret-key.tsx +++ b/src/app/pages/view-secret-key/view-secret-key.tsx @@ -37,7 +37,13 @@ export function ViewSecretKey() { return ( <> + View +
+ Secret Key + + } caption="Enter the password you set on this device" onSuccess={() => setShowSecretKey(true)} /> diff --git a/src/app/query/bitcoin/address/utxos-by-address.query.ts b/src/app/query/bitcoin/address/utxos-by-address.query.ts index df64ef345a8..ced1322e951 100644 --- a/src/app/query/bitcoin/address/utxos-by-address.query.ts +++ b/src/app/query/bitcoin/address/utxos-by-address.query.ts @@ -56,7 +56,7 @@ export function useTaprootAccountUtxosQuery() { const address = getTaprootAddress({ index: addressIndexCounter.getValue(), keychain: account?.keychain, - network: network.chain.bitcoin.network, + network: network.chain.bitcoin.bitcoinNetwork, }); const unspentTransactions = await client.addressApi.getUtxosByAddress(address); diff --git a/src/app/query/bitcoin/bitcoin-client.ts b/src/app/query/bitcoin/bitcoin-client.ts index ae6c519326b..e11a141655d 100644 --- a/src/app/query/bitcoin/bitcoin-client.ts +++ b/src/app/query/bitcoin/bitcoin-client.ts @@ -18,10 +18,6 @@ export interface UtxoResponseItem { value: number; } -export interface NativeSegwitUtxo extends UtxoResponseItem { - addressIndex: number; -} - export interface TaprootUtxo extends UtxoResponseItem { addressIndex: number; } @@ -80,10 +76,10 @@ interface FeeResult { class FeeEstimatesApi { constructor(public configuration: Configuration) {} - async getFeeEstimatesFromBlockcypherApi(): Promise { + async getFeeEstimatesFromBlockcypherApi(network: string): Promise { return fetchData({ errorMsg: 'No fee estimates fetched', - url: `https://api.blockcypher.com/v1/btc/main`, + url: `https://api.blockcypher.com/v1/btc/${network}`, }).then((resp: FeeEstimateEarnApiResponse) => { const { low_fee_per_kb, medium_fee_per_kb, high_fee_per_kb } = resp; // These fees are in satoshis per kb @@ -118,6 +114,13 @@ class TransactionsApi { return resp.data; } + async getBitcoinTransactionHex(txid: string) { + const resp = await axios.get(`${this.configuration.baseUrl}/tx/${txid}/hex`, { + responseType: 'text', + }); + return resp.data; + } + async broadcastTransaction(tx: string) { // TODO: refactor to use `axios` // https://github.com/leather-wallet/extension/issues/4521 diff --git a/src/app/query/bitcoin/fees/fee-estimates.query.ts b/src/app/query/bitcoin/fees/fee-estimates.query.ts index 8244d78a290..bc87277a868 100644 --- a/src/app/query/bitcoin/fees/fee-estimates.query.ts +++ b/src/app/query/bitcoin/fees/fee-estimates.query.ts @@ -1,16 +1,22 @@ import { useQuery } from '@tanstack/react-query'; +import { BitcoinNetworkModes } from '@shared/constants'; + import { AppUseQueryConfig } from '@app/query/query-config'; import { useBitcoinClient } from '@app/store/common/api-clients.hooks'; +import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { BitcoinClient } from '../bitcoin-client'; -function fetchAllBitcoinFeeEstimates(client: BitcoinClient) { +function fetchAllBitcoinFeeEstimates(client: BitcoinClient, network: BitcoinNetworkModes) { return async () => - Promise.allSettled([ - client.feeEstimatesApi.getFeeEstimatesFromMempoolSpaceApi(), - client.feeEstimatesApi.getFeeEstimatesFromBlockcypherApi(), - ]); + network === 'mainnet' + ? Promise.allSettled([ + client.feeEstimatesApi.getFeeEstimatesFromMempoolSpaceApi(), + client.feeEstimatesApi.getFeeEstimatesFromBlockcypherApi('main'), + ]) + : // Using `allSettled` so we can add more testnet apis to the array + Promise.allSettled([client.feeEstimatesApi.getFeeEstimatesFromBlockcypherApi('test3')]); } type FetchAllBitcoinFeeEstimatesResp = Awaited< @@ -21,9 +27,11 @@ export function useGetAllBitcoinFeeEstimatesQuery< T extends unknown = FetchAllBitcoinFeeEstimatesResp, >(options?: AppUseQueryConfig) { const client = useBitcoinClient(); + const network = useCurrentNetwork(); + return useQuery({ - queryKey: ['average-bitcoin-fee-estimates'], - queryFn: fetchAllBitcoinFeeEstimates(client), + queryKey: ['average-bitcoin-fee-estimates', network.chain.bitcoin.bitcoinNetwork], + queryFn: fetchAllBitcoinFeeEstimates(client, network.chain.bitcoin.bitcoinNetwork), refetchInterval: 2000 * 60, ...options, }); diff --git a/src/app/query/bitcoin/ordinals/brc20/use-brc-20.ts b/src/app/query/bitcoin/ordinals/brc20/use-brc-20.ts index c56d230c91c..0add7a01da7 100644 --- a/src/app/query/bitcoin/ordinals/brc20/use-brc-20.ts +++ b/src/app/query/bitcoin/ordinals/brc20/use-brc-20.ts @@ -20,8 +20,8 @@ export function useBrc20FeatureFlag() { } const supportedNetwork = - currentNetwork.chain.bitcoin.network === 'mainnet' || - currentNetwork.chain.bitcoin.network === 'signet'; + currentNetwork.chain.bitcoin.bitcoinNetwork === 'mainnet' || + currentNetwork.chain.bitcoin.bitcoinNetwork === 'signet'; if (!supportedNetwork) return { enabled: false, reason: 'Unsupported network' } as const; diff --git a/src/app/query/bitcoin/ordinals/inscriptions.query.ts b/src/app/query/bitcoin/ordinals/inscriptions.query.ts index 6769c5c9cd3..2759b6feee0 100644 --- a/src/app/query/bitcoin/ordinals/inscriptions.query.ts +++ b/src/app/query/bitcoin/ordinals/inscriptions.query.ts @@ -64,7 +64,7 @@ export function useGetInscriptionsInfiniteQuery() { const address = getTaprootAddress({ index: i, keychain: account?.keychain, - network: network.chain.bitcoin.network, + network: network.chain.bitcoin.bitcoinNetwork, }); acc[address] = i; return acc; @@ -72,7 +72,7 @@ export function useGetInscriptionsInfiniteQuery() { {} ); }, - [account, network.chain.bitcoin.network] + [account, network.chain.bitcoin.bitcoinNetwork] ); const query = useInfiniteQuery({ diff --git a/src/app/query/bitcoin/ordinalsbot-client.ts b/src/app/query/bitcoin/ordinalsbot-client.ts index 1c763ebb775..5ef39fcaf1d 100644 --- a/src/app/query/bitcoin/ordinalsbot-client.ts +++ b/src/app/query/bitcoin/ordinalsbot-client.ts @@ -142,7 +142,8 @@ function useOrdinalsbotApiUrl() { const currentNetwork = useCurrentNetwork(); const ordinalsbotConfig = useConfigOrdinalsbot(); - if (currentNetwork.chain.bitcoin.network === 'mainnet') return ordinalsbotConfig.mainnetApiUrl; + if (currentNetwork.chain.bitcoin.bitcoinNetwork === 'mainnet') + return ordinalsbotConfig.mainnetApiUrl; return ordinalsbotConfig.signetApiUrl; } diff --git a/src/app/query/common/remote-config/remote-config.query.ts b/src/app/query/common/remote-config/remote-config.query.ts index 12a6df3a7c1..f17993f0acb 100644 --- a/src/app/query/common/remote-config/remote-config.query.ts +++ b/src/app/query/common/remote-config/remote-config.query.ts @@ -3,13 +3,7 @@ import axios from 'axios'; import get from 'lodash.get'; import { GITHUB_ORG, GITHUB_REPO } from '@shared/constants'; -import { - BRANCH_NAME, - IS_DEV_ENV, - IS_TEST_ENV, - LEDGER_BITCOIN_ENABLED, - WALLET_ENVIRONMENT, -} from '@shared/environment'; +import { BRANCH_NAME, IS_DEV_ENV, IS_TEST_ENV, WALLET_ENVIRONMENT } from '@shared/environment'; import { createMoney } from '@shared/models/money.model'; import { isUndefined } from '@shared/utils'; @@ -74,14 +68,15 @@ const githubWalletConfigRawUrl = `https://raw.githubusercontent.com/${GITHUB_ORG BRANCH_NAME || defaultBranch }/config/wallet-config.json`; -async function fetchHiroMessages(): Promise { +async function fetchLeatherMessages(): Promise { if ((!BRANCH_NAME && WALLET_ENVIRONMENT !== 'production') || IS_TEST_ENV) return localConfig as RemoteConfig; - return axios.get(githubWalletConfigRawUrl); + const resp = await axios.get(githubWalletConfigRawUrl); + return resp.data; } function useRemoteConfig() { - const { data } = useQuery(['walletConfig'], fetchHiroMessages, { + const { data } = useQuery(['walletConfig'], fetchLeatherMessages, { // As we're fetching from Github, a third-party, we want // to avoid any unnecessary stress on their services, so // we use quite slow stale/retry times @@ -91,7 +86,7 @@ function useRemoteConfig() { return data; } -export function useRemoteHiroMessages(): HiroMessage[] { +export function useRemoteLeatherMessages(): HiroMessage[] { const config = useRemoteConfig(); return get(config, 'messages.global', []); } @@ -118,7 +113,7 @@ export function useConfigBitcoinEnabled() { const config = useRemoteConfig(); const hasBitcoinAccount = useHasCurrentBitcoinAccount(); return whenWallet({ - ledger: (config?.bitcoinEnabled ?? true) && LEDGER_BITCOIN_ENABLED && hasBitcoinAccount, + ledger: (config?.bitcoinEnabled ?? true) && hasBitcoinAccount, software: config?.bitcoinEnabled ?? true, }); } diff --git a/src/app/query/stacks/balance/stacks-ft-balances.utils.ts b/src/app/query/stacks/balance/stacks-ft-balances.utils.ts index 45350efebd4..ec183803008 100644 --- a/src/app/query/stacks/balance/stacks-ft-balances.utils.ts +++ b/src/app/query/stacks/balance/stacks-ft-balances.utils.ts @@ -1,5 +1,4 @@ import { FtMetadataResponse } from '@hirosystems/token-metadata-api-client'; -import { getAssetStringParts } from '@stacks/ui-utils'; import BigNumber from 'bignumber.js'; import { STX_DECIMALS } from '@shared/constants'; @@ -12,6 +11,7 @@ import type { import { createMoney } from '@shared/models/money.model'; import { isTransferableStacksFungibleTokenAsset } from '@app/common/crypto-assets/stacks-crypto-asset.utils'; +import { getAssetStringParts } from '@app/ui/utils/get-asset-string-parts'; export function createStacksCryptoCurrencyAssetTypeWrapper( balance: BigNumber diff --git a/src/app/routes/app-routes.tsx b/src/app/routes/app-routes.tsx index 8c9997c0536..4f1668dc512 100644 --- a/src/app/routes/app-routes.tsx +++ b/src/app/routes/app-routes.tsx @@ -17,10 +17,11 @@ import { IncreaseBtcFeeDrawer } from '@app/features/increase-fee-drawer/increase import { IncreaseFeeSentDrawer } from '@app/features/increase-fee-drawer/increase-fee-sent-drawer'; import { IncreaseStxFeeDrawer } from '@app/features/increase-fee-drawer/increase-stx-fee-drawer'; import { leatherIntroDialogRoutes } from '@app/features/leather-intro-dialog/leather-intro-dialog'; +import { ledgerBitcoinTxSigningRoutes } from '@app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container'; import { ledgerJwtSigningRoutes } from '@app/features/ledger/flows/jwt-signing/ledger-sign-jwt.routes'; import { requestBitcoinKeysRoutes } from '@app/features/ledger/flows/request-bitcoin-keys/ledger-request-bitcoin-keys'; import { requestStacksKeysRoutes } from '@app/features/ledger/flows/request-stacks-keys/ledger-request-stacks-keys'; -import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes'; +import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-stacks-tx-container'; import { UnsupportedBrowserLayout } from '@app/features/ledger/generic-steps'; import { ConnectLedgerStart } from '@app/features/ledger/generic-steps/connect-device/connect-ledger-start'; import { RetrieveTaprootToNativeSegwit } from '@app/features/retrieve-taproot-to-native-segwit/retrieve-taproot-to-native-segwit'; @@ -38,13 +39,13 @@ import { RequestError } from '@app/pages/request-error/request-error'; import { RpcSignStacksTransaction } from '@app/pages/rpc-sign-stacks-transaction/rpc-sign-stacks-transaction'; import { BroadcastError } from '@app/pages/send/broadcast-error/broadcast-error'; import { LockBitcoinSummary } from '@app/pages/send/locked-bitcoin-summary/locked-bitcoin-summary'; +import { sendOrdinalRoutes } from '@app/pages/send/ordinal-inscription/ordinal-routes'; import { sendCryptoAssetFormRoutes } from '@app/pages/send/send-crypto-asset-form/send-crypto-asset-form.routes'; import { alexSwapRoutes } from '@app/pages/swap/alex-swap-container'; import { UnauthorizedRequest } from '@app/pages/unauthorized-request/unauthorized-request'; import { Unlock } from '@app/pages/unlock'; import { ViewSecretKey } from '@app/pages/view-secret-key/view-secret-key'; import { AccountGate } from '@app/routes/account-gate'; -import { sendOrdinalRoutes } from '@app/routes/ordinal-routes'; import { receiveRoutes } from '@app/routes/receive-routes'; import { legacyRequestRoutes } from '@app/routes/request-routes'; import { rpcRequestRoutes } from '@app/routes/rpc-routes'; @@ -63,10 +64,11 @@ export function AppRoutes() { export const homePageModalRoutes = ( <> + {sendOrdinalRoutes} {settingsRoutes} {receiveRoutes} {ledgerStacksTxSigningRoutes} - {sendOrdinalRoutes} + {ledgerBitcoinTxSigningRoutes} {requestBitcoinKeysRoutes} {requestStacksKeysRoutes} @@ -77,7 +79,7 @@ function useAppRoutes() { createRoutesFromElements( }> @@ -91,7 +93,9 @@ function useAppRoutes() { }> {ledgerStacksTxSigningRoutes} - } /> + }> + {ledgerBitcoinTxSigningRoutes} + } /> {ledgerStacksTxSigningRoutes} @@ -105,7 +109,7 @@ function useAppRoutes() { } - > + /> } /> } /> } /> @@ -233,12 +237,13 @@ function useAppRoutes() { ); return { Component: RpcSignBip322MessageRoute }; }} - /> + > + {ledgerBitcoinTxSigningRoutes} + {alexSwapRoutes} {/* Catch-all route redirects to onboarding */} - } /> ) diff --git a/src/app/routes/components/modal-background-wrapper.tsx b/src/app/routes/components/modal-background-wrapper.tsx index a42b7da4664..751076b13be 100644 --- a/src/app/routes/components/modal-background-wrapper.tsx +++ b/src/app/routes/components/modal-background-wrapper.tsx @@ -1,5 +1,4 @@ -import { Route } from 'react-router-dom'; -import { Outlet, Routes, useLocation } from 'react-router-dom'; +import { Outlet, Route, Routes, useLocation } from 'react-router-dom'; import { useLocationState } from '@app/common/hooks/use-location-state'; diff --git a/src/app/routes/request-routes.tsx b/src/app/routes/request-routes.tsx index 9f4cbeccdbc..2551baaae4b 100644 --- a/src/app/routes/request-routes.tsx +++ b/src/app/routes/request-routes.tsx @@ -6,7 +6,7 @@ import { RouteUrls } from '@shared/route-urls'; import { BroadcastErrorDrawer } from '@app/components/broadcast-error-drawer/broadcast-error-drawer'; import { EditNonceDrawer } from '@app/features/edit-nonce-drawer/edit-nonce-drawer'; import { ledgerStacksMessageSigningRoutes } from '@app/features/ledger/flows/stacks-message-signing/ledger-stacks-sign-msg.routes'; -import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-tx.routes'; +import { ledgerStacksTxSigningRoutes } from '@app/features/ledger/flows/stacks-tx-signing/ledger-sign-stacks-tx-container'; import { PsbtRequest } from '@app/pages/psbt-request/psbt-request'; import { StacksMessageSigningRequest } from '@app/pages/stacks-message-signing-request/stacks-message-signing-request'; import { TransactionRequest } from '@app/pages/transaction-request/transaction-request'; diff --git a/src/app/routes/rpc-routes.tsx b/src/app/routes/rpc-routes.tsx index 8f8387cebf7..391fa035fd0 100644 --- a/src/app/routes/rpc-routes.tsx +++ b/src/app/routes/rpc-routes.tsx @@ -2,6 +2,7 @@ import { Route } from 'react-router-dom'; import { RouteUrls } from '@shared/route-urls'; +import { ledgerBitcoinTxSigningRoutes } from '@app/features/ledger/flows/bitcoin-tx-signing/ledger-bitcoin-sign-tx-container'; import { RpcGetAddresses } from '@app/pages/rpc-get-addresses/rpc-get-addresses'; import { rpcSendTransferRoutes } from '@app/pages/rpc-send-transfer/rpc-send-transfer.routes'; import { RpcSignPsbt } from '@app/pages/rpc-sign-psbt/rpc-sign-psbt'; @@ -27,7 +28,9 @@ export const rpcRequestRoutes = ( ); return { Component: RpcSignBip322MessageRoute }; }} - /> + > + {ledgerBitcoinTxSigningRoutes} + } - /> + > + {ledgerBitcoinTxSigningRoutes} + - whenWallet({ + return useMemo(() => { + // whenWallet throws if it's neither. As whenWallet is also called on + // SetPassword page, we need to catch because it's neither at that point + try { + return whenWallet({ software: undefined, ledger: getHdKeyVersionsFromNetwork( - bitcoinNetworkModeToCoreNetworkMode(network.chain.bitcoin.network) + bitcoinNetworkModeToCoreNetworkMode(network.chain.bitcoin.bitcoinNetwork) ), - }), - [network, whenWallet] - ); + }); + } catch (e) { + return undefined; + } + }, [network, whenWallet]); } diff --git a/src/app/store/accounts/blockchain/bitcoin/bitcoin-signer.ts b/src/app/store/accounts/blockchain/bitcoin/bitcoin-signer.ts index 5049ac5bf51..e7e2b1dec25 100644 --- a/src/app/store/accounts/blockchain/bitcoin/bitcoin-signer.ts +++ b/src/app/store/accounts/blockchain/bitcoin/bitcoin-signer.ts @@ -13,6 +13,8 @@ import { getTaprootAddressIndexDerivationPath } from '@shared/crypto/bitcoin/p2t import { getNativeSegwitAddressIndexDerivationPath } from '@shared/crypto/bitcoin/p2wpkh-address-gen'; import { AllowedSighashTypes } from '@shared/rpc/methods/sign-psbt'; +import { useBitcoinExtendedPublicKeyVersions } from './bitcoin-keychain'; + export interface Signer { network: BitcoinNetworkModes; payment: Payment; @@ -105,17 +107,16 @@ interface CreateSignersForAllNetworkTypesArgs { paymentFn: (keychain: HDKey, network: BitcoinNetworkModes) => unknown; mainnetKeychainFn: (accountIndex: number) => BitcoinAccount | undefined; testnetKeychainFn: (accountIndex: number) => BitcoinAccount | undefined; + extendedPublicKeyVersions?: Versions; } function createSignersForAllNetworkTypes({ mainnetKeychainFn, testnetKeychainFn, paymentFn, + extendedPublicKeyVersions, }: T) { return ({ accountIndex, addressIndex }: { accountIndex: number; addressIndex: number }) => { - const mainnetAccount = mainnetKeychainFn(accountIndex); - const testnetAccount = testnetKeychainFn(accountIndex); - - if (!mainnetAccount || !testnetAccount) throw new Error('No account found'); + const networkMap = new Map(); function makeNetworkSigner(keychain: HDKey, network: BitcoinNetworkModes) { return bitcoinAddressIndexSignerFactory({ @@ -123,15 +124,23 @@ function createSignersForAllNetworkTypes( testnetKeychainFn: (index: number) => BitcoinAccount | undefined, paymentFn: (keychain: HDKey, network: BitcoinNetworkModes) => T ) { + const extendedPublicKeyVersions = useBitcoinExtendedPublicKeyVersions(); + return useCallback( (accountIndex: number) => { const zeroIndex = 0; @@ -148,8 +159,9 @@ export function useMakeBitcoinNetworkSignersForPaymentType( mainnetKeychainFn, testnetKeychainFn, paymentFn, + extendedPublicKeyVersions, })({ accountIndex, addressIndex: zeroIndex }); }, - [mainnetKeychainFn, paymentFn, testnetKeychainFn] + [extendedPublicKeyVersions, mainnetKeychainFn, paymentFn, testnetKeychainFn] ); } diff --git a/src/app/store/accounts/blockchain/bitcoin/bitcoin.hooks.ts b/src/app/store/accounts/blockchain/bitcoin/bitcoin.hooks.ts index 9c7e4e0c3f5..138396fd4e8 100644 --- a/src/app/store/accounts/blockchain/bitcoin/bitcoin.hooks.ts +++ b/src/app/store/accounts/blockchain/bitcoin/bitcoin.hooks.ts @@ -1,11 +1,42 @@ +import { PaymentTypes } from '@btckit/types'; +import { bytesToHex } from '@noble/hashes/utils'; +import * as btc from '@scure/btc-signer'; +import { Psbt } from 'bitcoinjs-lib'; +import AppClient from 'ledger-bitcoin'; + +import { getBitcoinJsLibNetworkConfigByMode } from '@shared/crypto/bitcoin/bitcoin.network'; import { getTaprootAddress } from '@shared/crypto/bitcoin/bitcoin.utils'; +import { getInputPaymentType } from '@shared/crypto/bitcoin/bitcoin.utils'; +import { getTaprootAccountDerivationPath } from '@shared/crypto/bitcoin/p2tr-address-gen'; +import { getNativeSegwitAccountDerivationPath } from '@shared/crypto/bitcoin/p2wpkh-address-gen'; +import { logger } from '@shared/logger'; +import { allSighashTypes } from '@shared/rpc/methods/sign-psbt'; +import { makeNumberRange } from '@shared/utils'; -import { useCurrentAccountIndex } from '@app/store/accounts/account'; -import { useTaprootAccount } from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; +import { useWalletType } from '@app/common/use-wallet-type'; +import { listenForBitcoinTxLedgerSigning } from '@app/features/ledger/flows/bitcoin-tx-signing/bitcoin-tx-signing-event-listeners'; +import { useLedgerNavigate } from '@app/features/ledger/hooks/use-ledger-navigate'; +import { + addNativeSegwitSignaturesToPsbt, + addTaprootInputSignaturesToPsbt, + createNativeSegwitDefaultWalletPolicy, + createTaprootDefaultWalletPolicy, +} from '@app/features/ledger/utils/bitcoin-ledger-utils'; +import { + useCurrentAccountTaprootSigner, + useTaprootAccount, +} from '@app/store/accounts/blockchain/bitcoin/taproot-account.hooks'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; -import { useCurrentNativeSegwitAccount } from './native-segwit-account.hooks'; +import { useCurrentAccountIndex } from '../../account'; +import { + useCurrentAccountNativeSegwitSigner, + useCurrentNativeSegwitAccount, + useUpdateLedgerSpecificNativeSegwitBip32DerivationForAdddressIndexZero, +} from './native-segwit-account.hooks'; +import { useUpdateLedgerSpecificNativeSegwitUtxoHexForAdddressIndexZero } from './native-segwit-account.hooks'; import { useCurrentTaprootAccount } from './taproot-account.hooks'; +import { useUpdateLedgerSpecificTaprootInputPropsForAdddressIndexZero } from './taproot-account.hooks'; // Checks for both TR and NativeSegwit hooks export function useHasCurrentBitcoinAccount() { @@ -25,8 +56,186 @@ export function useZeroIndexTaprootAddress(accIndex?: number) { const address = getTaprootAddress({ index: 0, keychain: account.keychain, - network: network.chain.bitcoin.network, + network: network.chain.bitcoin.bitcoinNetwork, }); return address; } + +// This implementation assumes address re-use of the 0 index. Funds spread +// across multiple address indexes does not work here. +function useSignBitcoinSoftwareTx() { + const createNativeSegwitSigner = useCurrentAccountNativeSegwitSigner(); + const createTaprootSigner = useCurrentAccountTaprootSigner(); + const network = useCurrentNetwork(); + return async (psbt: Uint8Array, inputsToSign?: number[]) => { + const nativeSegwitSigner = createNativeSegwitSigner?.(0); + const taprootSigner = createTaprootSigner?.(0); + + if (!nativeSegwitSigner || !taprootSigner) throw new Error('Signers not available'); + + const tx = btc.Transaction.fromPSBT(psbt); + + const inputIndexes = inputsToSign ?? makeNumberRange(tx.inputsLength); + + inputIndexes.forEach(index => { + const input = tx.getInput(index); + const addressType = getInputPaymentType(index, input, network.chain.bitcoin.bitcoinNetwork); + + switch (addressType) { + case 'p2tr': { + taprootSigner.signIndex(tx, index, allSighashTypes); + break; + } + case 'p2wpkh': { + nativeSegwitSigner.signIndex(tx, index, allSighashTypes); + break; + } + default: + logger.warn('Cannot sign input of address type ' + addressType); + } + }); + + return tx; + }; +} + +export function useSignLedgerBitcoinTx() { + const accountIndex = useCurrentAccountIndex(); + const network = useCurrentNetwork(); + + const addNativeSegwitUtxoHexLedgerProps = + useUpdateLedgerSpecificNativeSegwitUtxoHexForAdddressIndexZero(); + + const addNativeSegwitBip32Derivation = + useUpdateLedgerSpecificNativeSegwitBip32DerivationForAdddressIndexZero(); + + const updateTaprootLedgerInputs = useUpdateLedgerSpecificTaprootInputPropsForAdddressIndexZero(); + + return async (app: AppClient, rawPsbt: Uint8Array, inputsToSign?: number[]) => { + const fingerprint = await app.getMasterFingerprint(); + + // BtcSigner not compatible with Ledger. Encoded format returns more terse + // version. BitcoinJsLib works. + const psbt = Psbt.fromBuffer(Buffer.from(rawPsbt), { + network: getBitcoinJsLibNetworkConfigByMode(network.chain.bitcoin.bitcoinNetwork), + }); + + const btcSignerPsbtClone = btc.Transaction.fromPSBT(psbt.toBuffer()); + + const inputByPaymentType = ( + inputsToSign ?? makeNumberRange(btcSignerPsbtClone.inputsLength) + ).map(index => [ + index, + getInputPaymentType( + index, + btcSignerPsbtClone.getInput(index), + network.chain.bitcoin.bitcoinNetwork + ), + ]) as readonly [number, PaymentTypes][]; + + // + // Taproot + const taprootInputsToSign = inputByPaymentType + .filter(([_, paymentType]) => paymentType === 'p2tr') + .map(([index]) => index); + + if (taprootInputsToSign.length) { + await updateTaprootLedgerInputs(psbt, fingerprint, taprootInputsToSign); + + const taprootExtendedPublicKey = await app.getExtendedPubkey( + getTaprootAccountDerivationPath(network.chain.bitcoin.bitcoinNetwork, accountIndex) + ); + + const taprootPolicy = createTaprootDefaultWalletPolicy({ + fingerprint, + accountIndex, + network: network.chain.bitcoin.bitcoinNetwork, + xpub: taprootExtendedPublicKey, + }); + + const taprootSignatures = await app.signPsbt(psbt.toBase64(), taprootPolicy, null); + + addTaprootInputSignaturesToPsbt(psbt, taprootSignatures); + } + + // + // Native Segwit + const nativeSegwitInputsToSign = inputByPaymentType + .filter(([_, paymentType]) => paymentType === 'p2wpkh') + .map(([index]) => index); + + if (nativeSegwitInputsToSign.length) { + const nativeSegwitExtendedPublicKey = await app.getExtendedPubkey( + getNativeSegwitAccountDerivationPath(network.chain.bitcoin.bitcoinNetwork, accountIndex) + ); + + // Without adding the full non-witness data, the Ledger will present a + // warning. In some cases, e.g. bip322, the original witness data doesn't + // exist, and we want the user to proceed, despite the warning. + try { + await addNativeSegwitUtxoHexLedgerProps(psbt, nativeSegwitInputsToSign); + } catch (e) {} + + await addNativeSegwitBip32Derivation(psbt, fingerprint, nativeSegwitInputsToSign); + + const nativeSegwitPolicy = createNativeSegwitDefaultWalletPolicy({ + fingerprint, + accountIndex, + network: network.chain.bitcoin.bitcoinNetwork, + xpub: nativeSegwitExtendedPublicKey, + }); + + const nativeSegwitSignatures = await app.signPsbt(psbt.toBase64(), nativeSegwitPolicy, null); + + addNativeSegwitSignaturesToPsbt(psbt, nativeSegwitSignatures); + } + + // Turn back into BtcSigner lib format + // REMINDER: this tx is not finalized + return btc.Transaction.fromPSBT(psbt.toBuffer()); + }; +} + +export function useAddTapInternalKeysIfMissing() { + const createTaprootSigner = useCurrentAccountTaprootSigner(); + return (tx: btc.Transaction, inputIndexes?: number[]) => { + const taprootSigner = createTaprootSigner?.(0); + if (!taprootSigner) throw new Error('Taproot signer not found'); + + (inputIndexes ?? makeNumberRange(tx.inputsLength)).forEach(index => { + const input = tx.getInput(index); + const witnessOutputScript = + input.witnessUtxo?.script && btc.OutScript.decode(input.witnessUtxo.script); + + if (taprootSigner && witnessOutputScript?.type === 'tr' && !input.tapInternalKey) + tx.updateInput(index, { ...input, tapInternalKey: taprootSigner.payment.tapInternalKey }); + }); + }; +} + +export function useSignBitcoinTx() { + const { whenWallet } = useWalletType(); + const ledgerNavigate = useLedgerNavigate(); + const signSoftwareTx = useSignBitcoinSoftwareTx(); + + /** + * Don't forget to finalize the tx once it's returned. You can broadcast with + * the hex value from `tx.hex` TODO: add support for signing specific inputs + */ + return (psbt: Uint8Array, inputsToSign?: number[]) => + whenWallet({ + async ledger() { + // Because Ledger signing is a multi-step process that takes place over + // many routes, in order to achieve a consistent API between + // Ledger/software, we subscribe to the event that occurs when the + // unsigned tx is signed + ledgerNavigate.toConnectAndSignBitcoinTransactionStep(psbt, inputsToSign); + // ledgerNavigate.toConnectAndSignBitcoinTransactionStep(psbt, inputsToSign); + return listenForBitcoinTxLedgerSigning(bytesToHex(psbt)); + }, + async software() { + return signSoftwareTx(psbt, inputsToSign); + }, + })(); +} diff --git a/src/app/store/accounts/blockchain/bitcoin/bitcoin.ledger.ts b/src/app/store/accounts/blockchain/bitcoin/bitcoin.ledger.ts index d3d22e40fe8..e1647fe0bbb 100644 --- a/src/app/store/accounts/blockchain/bitcoin/bitcoin.ledger.ts +++ b/src/app/store/accounts/blockchain/bitcoin/bitcoin.ledger.ts @@ -1,8 +1,35 @@ import { useSelector } from 'react-redux'; -import { selectDefaultWalletBitcoinKeyEntities } from '@app/store/ledger/bitcoin/bitcoin-key.slice'; +import { + bitcoinNetworkModeToCoreNetworkMode, + inferNetworkFromPath, +} from '@shared/crypto/bitcoin/bitcoin.utils'; + +import { selectDefaultWalletBitcoinKeys } from '@app/store/ledger/bitcoin/bitcoin-key.slice'; +import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; export function useHasBitcoinLedgerKeychain() { - const bitcoinEntities = useSelector(selectDefaultWalletBitcoinKeyEntities); - return Object.keys(bitcoinEntities).length > 0; + const network = useCurrentNetwork(); + const accounts = useSelector(selectDefaultWalletBitcoinKeys); + + const hasNetworkKeys = accounts.some(v => { + return ( + inferNetworkFromPath(v.path) === + bitcoinNetworkModeToCoreNetworkMode(network.chain.bitcoin.bitcoinNetwork) + ); + }); + + return hasNetworkKeys; +} + +export function useFilteredBitcoinAccounts() { + const accounts = useSelector(selectDefaultWalletBitcoinKeys); + const network = useCurrentNetwork(); + + return accounts.filter(v => { + return ( + inferNetworkFromPath(v.path) === + bitcoinNetworkModeToCoreNetworkMode(network.chain.bitcoin.bitcoinNetwork) + ); + }); } diff --git a/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts b/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts index 1500d3ead0d..aa4f5616ca6 100644 --- a/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts +++ b/src/app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks.ts @@ -2,6 +2,7 @@ import { useMemo } from 'react'; import { useSelector } from 'react-redux'; import { createSelector } from '@reduxjs/toolkit'; +import { Psbt } from 'bitcoinjs-lib'; import { deriveAddressIndexZeroFromAccount, @@ -12,8 +13,10 @@ import { getNativeSegWitPaymentFromAddressIndex, getNativeSegwitAccountDerivationPath, } from '@shared/crypto/bitcoin/p2wpkh-address-gen'; +import { makeNumberRange, reverseBytes } from '@shared/utils'; import { mnemonicToRootNode } from '@app/common/keychain/keychain'; +import { useBitcoinClient } from '@app/store/common/api-clients.hooks'; import { selectCurrentNetwork } from '@app/store/networks/networks.selectors'; import { selectCurrentAccountIndex } from '@app/store/software-keys/software-key.selectors'; @@ -35,7 +38,7 @@ const selectNativeSegwitAccountBuilder = bitcoinAccountBuilderFactory( const selectCurrentNetworkNativeSegwitAccountBuilder = createSelector( selectNativeSegwitAccountBuilder, selectCurrentNetwork, - (nativeSegwitKeychains, network) => nativeSegwitKeychains[network.chain.bitcoin.network] + (nativeSegwitKeychains, network) => nativeSegwitKeychains[network.chain.bitcoin.bitcoinNetwork] ); export function useNativeSegwitAccountBuilder() { @@ -119,3 +122,47 @@ export function getNativeSegwitMainnetAddressFromMnemonic(secretKey: string) { ); }; } + +export function useUpdateLedgerSpecificNativeSegwitUtxoHexForAdddressIndexZero() { + const bitcoinClient = useBitcoinClient(); + + return async (tx: Psbt, inputsToUpdate: number[] = []) => { + const inputsTxHex = await Promise.all( + tx.txInputs.map(input => + bitcoinClient.transactionsApi.getBitcoinTransactionHex( + // txids are encoded onchain in reverse byte order + reverseBytes(input.hash).toString('hex') + ) + ) + ); + + const inputsToSign = + inputsToUpdate.length > 0 ? inputsToUpdate : makeNumberRange(tx.inputCount); + + inputsToSign.forEach(inputIndex => { + tx.updateInput(inputIndex, { + nonWitnessUtxo: Buffer.from(inputsTxHex[inputIndex], 'hex'), + }); + }); + }; +} +export function useUpdateLedgerSpecificNativeSegwitBip32DerivationForAdddressIndexZero() { + const nativeSegwitSigner = useCurrentAccountNativeSegwitIndexZeroSigner(); + + return async (tx: Psbt, fingerprint: string, inputsToUpdate: number[] = []) => { + const inputsToSign = + inputsToUpdate.length > 0 ? inputsToUpdate : makeNumberRange(tx.inputCount); + + inputsToSign.forEach(inputIndex => { + tx.updateInput(inputIndex, { + bip32Derivation: [ + { + masterFingerprint: Buffer.from(fingerprint, 'hex'), + pubkey: Buffer.from(nativeSegwitSigner.publicKey), + path: nativeSegwitSigner.derivationPath, + }, + ], + }); + }); + }; +} diff --git a/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts b/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts index 7164f198adf..9a6aec363bf 100644 --- a/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts +++ b/src/app/store/accounts/blockchain/bitcoin/taproot-account.hooks.ts @@ -2,14 +2,19 @@ import { useMemo } from 'react'; import { useSelector } from 'react-redux'; import { createSelector } from '@reduxjs/toolkit'; +import { Psbt } from 'bitcoinjs-lib'; import { BitcoinNetworkModes } from '@shared/constants'; -import { lookUpLedgerKeysByPath } from '@shared/crypto/bitcoin/bitcoin.utils'; +import { + ecdsaPublicKeyToSchnorr, + lookUpLedgerKeysByPath, +} from '@shared/crypto/bitcoin/bitcoin.utils'; import { deriveTaprootAccount, getTaprootAccountDerivationPath, getTaprootPaymentFromAddressIndex, } from '@shared/crypto/bitcoin/p2tr-address-gen'; +import { makeNumberRange } from '@shared/utils'; import { selectCurrentNetwork, useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { selectCurrentAccountIndex } from '@app/store/software-keys/software-key.selectors'; @@ -32,7 +37,7 @@ const selectTaprootAccountBuilder = bitcoinAccountBuilderFactory( const selectCurrentNetworkTaprootAccountBuilder = createSelector( selectTaprootAccountBuilder, selectCurrentNetwork, - (taprootKeychains, network) => taprootKeychains[network.chain.bitcoin.network] + (taprootKeychains, network) => taprootKeychains[network.chain.bitcoin.bitcoinNetwork] ); const selectCurrentTaprootAccount = createSelector( selectCurrentNetworkTaprootAccountBuilder, @@ -90,5 +95,27 @@ export function useCurrentAccountTaprootIndexZeroSigner() { export function useCurrentAccountTaprootSigner() { const currentAccountIndex = useCurrentAccountIndex(); const network = useCurrentNetwork(); - return useTaprootSigner(currentAccountIndex, network.chain.bitcoin.network); + return useTaprootSigner(currentAccountIndex, network.chain.bitcoin.bitcoinNetwork); +} + +export function useUpdateLedgerSpecificTaprootInputPropsForAdddressIndexZero() { + const taprootSigner = useCurrentAccountTaprootIndexZeroSigner(); + + return async (tx: Psbt, fingerprint: string, inputsToUpdate: number[] = []) => { + const inputsToSign = + inputsToUpdate.length > 0 ? inputsToUpdate : makeNumberRange(tx.inputCount); + + inputsToSign.forEach(inputIndex => { + tx.updateInput(inputIndex, { + tapBip32Derivation: [ + { + masterFingerprint: Buffer.from(fingerprint, 'hex'), + pubkey: Buffer.from(ecdsaPublicKeyToSchnorr(taprootSigner.publicKey)), + path: taprootSigner.derivationPath, + leafHashes: [], + }, + ], + }); + }); + }; } diff --git a/src/app/store/common/api-clients.hooks.ts b/src/app/store/common/api-clients.hooks.ts index cb0dc96414a..90482ad8885 100644 --- a/src/app/store/common/api-clients.hooks.ts +++ b/src/app/store/common/api-clients.hooks.ts @@ -18,7 +18,7 @@ import { useCurrentNetworkState } from '../networks/networks.hooks'; export function useBitcoinClient() { const network = useCurrentNetworkState(); - return new BitcoinClient(network.chain.bitcoin.url); + return new BitcoinClient(network.chain.bitcoin.bitcoinUrl); } // Unanchored by default (microblocks) diff --git a/src/app/store/ledger/bitcoin/bitcoin-key.slice.ts b/src/app/store/ledger/bitcoin/bitcoin-key.slice.ts index 63051a99fc4..de7d3aff484 100644 --- a/src/app/store/ledger/bitcoin/bitcoin-key.slice.ts +++ b/src/app/store/ledger/bitcoin/bitcoin-key.slice.ts @@ -14,3 +14,4 @@ export const { slice: bitcoinKeysSlice, adapter } = const selectors = adapter.getSelectors(selectBitcoinKeysSlice); export const selectDefaultWalletBitcoinKeyEntities = selectors.selectEntities; +export const selectDefaultWalletBitcoinKeys = selectors.selectAll; diff --git a/src/app/store/networks/networks.hooks.ts b/src/app/store/networks/networks.hooks.ts index 2df503a673c..0b962b54fea 100644 --- a/src/app/store/networks/networks.hooks.ts +++ b/src/app/store/networks/networks.hooks.ts @@ -50,8 +50,26 @@ export function useNetworksActions() { return useMemo( () => ({ - addNetwork({ chainId, subnetChainId, id, name, url }: PersistedNetworkConfiguration) { - dispatch(networksActions.addNetwork({ chainId, subnetChainId, id, name, url })); + addNetwork({ + id, + name, + chainId, + subnetChainId, + url, + bitcoinNetwork, + bitcoinUrl, + }: PersistedNetworkConfiguration) { + dispatch( + networksActions.addNetwork({ + id, + name, + chainId, + subnetChainId, + url, + bitcoinNetwork, + bitcoinUrl, + }) + ); dispatch(networksActions.changeNetwork(id)); return; }, diff --git a/src/app/store/networks/networks.slice.ts b/src/app/store/networks/networks.slice.ts index 2ce6d1fe3f6..8be7e67b1f8 100644 --- a/src/app/store/networks/networks.slice.ts +++ b/src/app/store/networks/networks.slice.ts @@ -11,6 +11,7 @@ export type PersistedNetworkConfiguration = Omit< Pick['chain']['stacks'], 'blockchain' > & + Omit['chain']['bitcoin'], 'blockchain'> & Pick; export const networksAdapter = createEntityAdapter(); diff --git a/src/app/store/networks/networks.utils.ts b/src/app/store/networks/networks.utils.ts index 4f8a05cf413..d6bab7c74cf 100644 --- a/src/app/store/networks/networks.utils.ts +++ b/src/app/store/networks/networks.utils.ts @@ -7,8 +7,6 @@ import { NetworkConfiguration, } from '@shared/constants'; -import { whenStacksChainId } from '@app/common/utils'; - import { PersistedNetworkConfiguration } from './networks.slice'; interface FindMatchingNetworkKeyArgs { @@ -43,6 +41,27 @@ export function findMatchingNetworkKey({ return null; } +function checkBitcoinNetworkProperties( + network: PersistedNetworkConfiguration +): PersistedNetworkConfiguration { + if (!network.bitcoinNetwork || !network.bitcoinUrl) { + return { + id: network.id, + name: network.name, + chainId: network.chainId, + subnetChainId: network.subnetChainId, + url: network.url, + bitcoinNetwork: network.chainId === ChainID.Mainnet ? 'mainnet' : 'testnet', + bitcoinUrl: + network.chainId === ChainID.Mainnet + ? BITCOIN_API_BASE_URL_MAINNET + : BITCOIN_API_BASE_URL_TESTNET, + }; + } else { + return network; + } +} + export function transformNetworkStateToMultichainStucture( state: Dictionary ) { @@ -50,7 +69,9 @@ export function transformNetworkStateToMultichainStucture( Object.entries(state) .map(([key, network]) => { if (!network) return ['', null]; - const { id, name, chainId, subnetChainId, url } = network; + const { id, name, chainId, subnetChainId, url, bitcoinNetwork, bitcoinUrl } = + checkBitcoinNetworkProperties(network); + return [ key, { @@ -59,18 +80,14 @@ export function transformNetworkStateToMultichainStucture( chain: { stacks: { blockchain: 'stacks', - url, + url: url, chainId, subnetChainId, }, bitcoin: { blockchain: 'bitcoin', - network: ChainID[chainId] ? ChainID[chainId].toLowerCase() : 'testnet', - url: - whenStacksChainId(chainId)({ - [ChainID.Mainnet]: BITCOIN_API_BASE_URL_MAINNET, - [ChainID.Testnet]: BITCOIN_API_BASE_URL_TESTNET, - }) || BITCOIN_API_BASE_URL_TESTNET, + bitcoinNetwork: bitcoinNetwork ? bitcoinNetwork : 'testnet', + bitcoinUrl: bitcoinUrl ? bitcoinUrl : 'https://blockstream.info/testnet/api', }, }, }, diff --git a/src/app/store/transactions/transaction.hooks.ts b/src/app/store/transactions/transaction.hooks.ts index 21c884e5dba..b1286fb5e06 100644 --- a/src/app/store/transactions/transaction.hooks.ts +++ b/src/app/store/transactions/transaction.hooks.ts @@ -207,7 +207,7 @@ export function useSignStacksTransaction() { return (tx: StacksTransaction) => whenWallet({ async ledger(tx: StacksTransaction) { - ledgerNavigate.toConnectAndSignTransactionStep(tx); + ledgerNavigate.toConnectAndSignStacksTransactionStep(tx); return listenForStacksTxLedgerSigning(bytesToHex(tx.serialize())); }, async software(tx: StacksTransaction) { diff --git a/src/app/components/button/button.tsx b/src/app/ui/components/button.tsx similarity index 100% rename from src/app/components/button/button.tsx rename to src/app/ui/components/button.tsx diff --git a/src/app/ui/components/codeblock.tsx b/src/app/ui/components/codeblock.tsx new file mode 100644 index 00000000000..d7f78f7d601 --- /dev/null +++ b/src/app/ui/components/codeblock.tsx @@ -0,0 +1,38 @@ +import { forwardRef } from 'react'; + +import { Box, BoxProps } from 'leather-styles/jsx'; + +import { Highlighter, HighlighterProps } from './highlighter'; + +type CodeBlockProps = HighlighterProps & BoxProps; + +export const CodeBlock = forwardRef( + ( + { code, showLineNumbers, hideLineHover, style = {}, language, prism, ...rest }: CodeBlockProps, + ref: React.Ref + ) => ( + + + + ) +); diff --git a/src/app/ui/components/dynamic-color-circle.tsx b/src/app/ui/components/dynamic-color-circle.tsx new file mode 100644 index 00000000000..e0d62e71db4 --- /dev/null +++ b/src/app/ui/components/dynamic-color-circle.tsx @@ -0,0 +1,29 @@ +import { Circle, CircleProps, styled } from 'leather-styles/jsx'; + +interface DynamicColorCircleProps extends CircleProps { + sizeParam?: string; + value: string; +} +export function DynamicColorCircle({ + children, + sizeParam = '36', + value, + ...props +}: DynamicColorCircleProps) { + return ( + + + {children} + + ); +} diff --git a/src/app/ui/components/highlighter.tsx b/src/app/ui/components/highlighter.tsx new file mode 100644 index 00000000000..1fac3f2b1a5 --- /dev/null +++ b/src/app/ui/components/highlighter.tsx @@ -0,0 +1,162 @@ +import { memo } from 'react'; + +import { Box, Flex } from 'leather-styles/jsx'; +import { Highlight } from 'prism-react-renderer'; + +import { + GetGrammaticalTokenProps, + GrammaticalToken, + Language, + RenderProps, + theme, +} from '../utils/prism'; +import { startPad } from '../utils/start-pad'; + +const lineNumberWidth = 60; +const getLineNumber = (n: number, length: number) => startPad(n + 1, length.toString().length); + +function Tokens({ + tokens, + getTokenProps, + showLineNumbers, + ...rest +}: { + tokens: GrammaticalToken[]; + getTokenProps: GetGrammaticalTokenProps; + showLineNumbers?: boolean; +}) { + const pl = `calc(${showLineNumbers ? lineNumberWidth : '0'}px + 16px`; + + return ( + + {tokens.map((token, i) => ( + + ))} + + ); +} + +function LineNumber({ number, length, ...rest }: { number: number; length: number }) { + return ( + + {getLineNumber(number, length)} + + ); +} + +function Line({ + tokens, + getTokenProps, + index, + length, + showLineNumbers, + hideLineHover, + ...rest +}: { + tokens: GrammaticalToken[]; + index: number; + length: number; + getTokenProps: GetGrammaticalTokenProps; + showLineNumbers?: boolean; + hideLineHover?: boolean; +}) { + return ( + + {showLineNumbers ? : null} + + + ); +} + +function Lines({ + tokens: lines, + getLineProps, + getTokenProps, + className, + showLineNumbers, + hideLineHover, +}: { showLineNumbers?: boolean; hideLineHover?: boolean } & RenderProps) { + return ( + + + {lines.map((tokens: GrammaticalToken[], i: number) => ( + + ))} + + + ); +} + +interface PrismToken { + type: string; + content: (PrismToken | string)[] | string; +} + +interface PrismGrammar { + [key: string]: any; +} + +type LanguageDict = { [lang in Language]: PrismGrammar }; + +interface PrismLib { + languages: LanguageDict; + tokenize: (code: string, grammar: PrismGrammar, language: Language) => PrismToken[] | string[]; + highlight: (code: string, grammar: PrismGrammar, language: Language) => string; +} + +export interface HighlighterProps { + code: string; + language?: Language; + showLineNumbers?: boolean; + hideLineHover?: boolean; + prism: PrismLib; +} + +export const Highlighter = memo( + ({ code, language = 'clarity', showLineNumbers, hideLineHover, prism }: HighlighterProps) => { + return ( + + {props => ( + + )} + + ); + } +); diff --git a/src/app/ui/components/hr.tsx b/src/app/ui/components/hr.tsx new file mode 100644 index 00000000000..17edfccef97 --- /dev/null +++ b/src/app/ui/components/hr.tsx @@ -0,0 +1,19 @@ +import { styled } from 'leather-styles/jsx'; +import { HTMLStyledProps } from 'leather-styles/types'; + +export type HrProps = HTMLStyledProps<'hr'>; + +export function Hr(props: HrProps) { + return ; +} + +export function DashedHr(props: HrProps) { + return ( + + ); +} diff --git a/src/app/ui/components/icons/alert-octagon-icon.tsx b/src/app/ui/components/icons/alert-octagon-icon.tsx new file mode 100644 index 00000000000..7040e1ad2e1 --- /dev/null +++ b/src/app/ui/components/icons/alert-octagon-icon.tsx @@ -0,0 +1,25 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function AlertOctagonIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/animated-tick-icon.tsx b/src/app/ui/components/icons/animated-tick-icon.tsx new file mode 100644 index 00000000000..ac1484d7143 --- /dev/null +++ b/src/app/ui/components/icons/animated-tick-icon.tsx @@ -0,0 +1,36 @@ +import { HTMLStyledProps, styled } from 'leather-styles/jsx'; +import { SizeToken } from 'leather-styles/tokens'; + +import { LiteralUnion } from '@shared/utils/type-utils'; + +const defaultSize = '20px'; + +interface AnimatedTickIconProps extends HTMLStyledProps<'svg'> { + size?: LiteralUnion; +} +export function AnimatedTickIcon({ size = defaultSize, ...props }: AnimatedTickIconProps) { + return ( + + + + ); +} diff --git a/src/app/ui/components/icons/arrow-down-icon.tsx b/src/app/ui/components/icons/arrow-down-icon.tsx new file mode 100644 index 00000000000..c32f1cd73e3 --- /dev/null +++ b/src/app/ui/components/icons/arrow-down-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function ArrowDownIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/arrow-left-icon.tsx b/src/app/ui/components/icons/arrow-left-icon.tsx new file mode 100644 index 00000000000..fb48e38983b --- /dev/null +++ b/src/app/ui/components/icons/arrow-left-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ArrowLeftIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/arrow-up-icon.tsx b/src/app/ui/components/icons/arrow-up-icon.tsx new file mode 100644 index 00000000000..97e25c24853 --- /dev/null +++ b/src/app/ui/components/icons/arrow-up-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function ArrowUpIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/bitcoin-contract-icon.tsx b/src/app/ui/components/icons/bitcoin-contract-icon.tsx new file mode 100644 index 00000000000..9cdab8f2fc5 --- /dev/null +++ b/src/app/ui/components/icons/bitcoin-contract-icon.tsx @@ -0,0 +1,52 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function BitcoinContractIcon({ size = 'xl', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/brc20-token-icon.tsx b/src/app/ui/components/icons/brc20-token-icon.tsx new file mode 100644 index 00000000000..5cdca3b25f5 --- /dev/null +++ b/src/app/ui/components/icons/brc20-token-icon.tsx @@ -0,0 +1,58 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function Brc20TokenIcon({ size = 'xl', ...rest }: SquareProps) { + return ( + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/btc-icon.tsx b/src/app/ui/components/icons/btc-icon.tsx new file mode 100644 index 00000000000..2ddd2605f12 --- /dev/null +++ b/src/app/ui/components/icons/btc-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function BtcIcon({ size = 'xl', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/btc-ledger-icon.tsx b/src/app/ui/components/icons/btc-ledger-icon.tsx new file mode 100644 index 00000000000..81c337e3c57 --- /dev/null +++ b/src/app/ui/components/icons/btc-ledger-icon.tsx @@ -0,0 +1,22 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function BtcLedgerIcon({ size = 'md', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/checkmark-icon.tsx b/src/app/ui/components/icons/checkmark-icon.tsx new file mode 100644 index 00000000000..665199d6583 --- /dev/null +++ b/src/app/ui/components/icons/checkmark-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function CheckmarkIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/chevron-down-icon.tsx b/src/app/ui/components/icons/chevron-down-icon.tsx new file mode 100644 index 00000000000..e77e1a17168 --- /dev/null +++ b/src/app/ui/components/icons/chevron-down-icon.tsx @@ -0,0 +1,19 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ChevronDownIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/chevron-up-icon.tsx b/src/app/ui/components/icons/chevron-up-icon.tsx new file mode 100644 index 00000000000..283a9494e8c --- /dev/null +++ b/src/app/ui/components/icons/chevron-up-icon.tsx @@ -0,0 +1,27 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ChevronUpIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/chevrons-right-icon.tsx b/src/app/ui/components/icons/chevrons-right-icon.tsx new file mode 100644 index 00000000000..b48fc34b41c --- /dev/null +++ b/src/app/ui/components/icons/chevrons-right-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ChevronsRightIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/circle-icon.tsx b/src/app/ui/components/icons/circle-icon.tsx new file mode 100644 index 00000000000..4d0fb5e6230 --- /dev/null +++ b/src/app/ui/components/icons/circle-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function CircleIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/close-icon.tsx b/src/app/ui/components/icons/close-icon.tsx new file mode 100644 index 00000000000..7da3a42504c --- /dev/null +++ b/src/app/ui/components/icons/close-icon.tsx @@ -0,0 +1,20 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function CloseIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/cloud-off-icon.tsx b/src/app/ui/components/icons/cloud-off-icon.tsx new file mode 100644 index 00000000000..470a7eefcb9 --- /dev/null +++ b/src/app/ui/components/icons/cloud-off-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +// TODO: This svg was copied from react-icons temporarily +export function CloudOffIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/code-icon.tsx b/src/app/ui/components/icons/code-icon.tsx new file mode 100644 index 00000000000..277b39f3a2a --- /dev/null +++ b/src/app/ui/components/icons/code-icon.tsx @@ -0,0 +1,30 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function CodeIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/copy-icon.tsx b/src/app/ui/components/icons/copy-icon.tsx new file mode 100644 index 00000000000..a65b9cc647e --- /dev/null +++ b/src/app/ui/components/icons/copy-icon.tsx @@ -0,0 +1,25 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function CopyIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/ellipses-h-icon.tsx b/src/app/ui/components/icons/ellipses-h-icon.tsx new file mode 100644 index 00000000000..ab92b351ec3 --- /dev/null +++ b/src/app/ui/components/icons/ellipses-h-icon.tsx @@ -0,0 +1,39 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function EllipsesHorizontalIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/error-circle-icon.tsx b/src/app/ui/components/icons/error-circle-icon.tsx new file mode 100644 index 00000000000..53a326e04e1 --- /dev/null +++ b/src/app/ui/components/icons/error-circle-icon.tsx @@ -0,0 +1,31 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ErrorCircleIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/error-icon.tsx b/src/app/ui/components/icons/error-icon.tsx new file mode 100644 index 00000000000..3529797462d --- /dev/null +++ b/src/app/ui/components/icons/error-icon.tsx @@ -0,0 +1,31 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ErrorIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/external-link-icon.tsx b/src/app/ui/components/icons/external-link-icon.tsx new file mode 100644 index 00000000000..3492cab68df --- /dev/null +++ b/src/app/ui/components/icons/external-link-icon.tsx @@ -0,0 +1,24 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function ExternalLinkIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/eye-icon.tsx b/src/app/ui/components/icons/eye-icon.tsx new file mode 100644 index 00000000000..47db9446324 --- /dev/null +++ b/src/app/ui/components/icons/eye-icon.tsx @@ -0,0 +1,31 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function EyeIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/eye-slash-icon.tsx b/src/app/ui/components/icons/eye-slash-icon.tsx new file mode 100644 index 00000000000..d73d408aa11 --- /dev/null +++ b/src/app/ui/components/icons/eye-slash-icon.tsx @@ -0,0 +1,37 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function EyeSlashIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/function-icon.tsx b/src/app/ui/components/icons/function-icon.tsx new file mode 100644 index 00000000000..8d99b24618d --- /dev/null +++ b/src/app/ui/components/icons/function-icon.tsx @@ -0,0 +1,14 @@ +import { Square } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +// TODO: This svg was copied from mdi-react temporarily +export function FunctionIcon({ size = 'xs', ...props }) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/hamburger-icon.tsx b/src/app/ui/components/icons/hamburger-icon.tsx new file mode 100644 index 00000000000..736d580369f --- /dev/null +++ b/src/app/ui/components/icons/hamburger-icon.tsx @@ -0,0 +1,32 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function HamburgerIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/info-icon.tsx b/src/app/ui/components/icons/info-icon.tsx new file mode 100644 index 00000000000..f612c781c61 --- /dev/null +++ b/src/app/ui/components/icons/info-icon.tsx @@ -0,0 +1,38 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function InfoIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/src/app/components/icons/leather-icon.tsx b/src/app/ui/components/icons/leather-icon.tsx similarity index 97% rename from src/app/components/icons/leather-icon.tsx rename to src/app/ui/components/icons/leather-icon.tsx index 7907d500d49..1f2d501e7ec 100644 --- a/src/app/components/icons/leather-icon.tsx +++ b/src/app/ui/components/icons/leather-icon.tsx @@ -1,6 +1,8 @@ -export function LeatherIcon(props: React.SVGProps) { +import { Svg, SvgProps } from '../svg'; + +export function LeatherIcon({ ...props }: SvgProps) { return ( - ) { d="M71.4224 11.6426C70.7367 12.9362 69.7311 13.7305 68.954 13.7305C68.3597 13.7305 67.9026 13.2312 67.9026 12.0511C67.9026 10.2128 68.8168 7.35319 69.2511 5.85532H62.4399L61.7771 8.14752C60.7714 11.6652 59.1943 13.7305 56.703 13.7305C56.3373 13.7305 55.903 13.6624 55.6745 13.5262C57.5487 12.1872 59.4458 10.0539 59.4458 7.94326C59.4458 6.19574 58.1658 5.51489 57.0001 5.51489C53.3431 5.51489 50.7375 10.2809 51.7203 13.2766C51.1261 13.4809 50.5775 13.7305 49.9147 13.7305C49.2519 13.7305 48.8862 13.2766 49.0233 12.6638C49.1833 11.9376 50.0975 9.50922 50.0975 8.19291C50.0975 6.58156 48.8405 5.4922 46.9434 5.4922C46.5091 5.4922 46.0291 5.60567 45.5492 5.78723L46.7605 1.54326H44.3835L41.5493 11.4383C41.115 12.9816 39.8122 13.7305 38.738 13.7305C37.3895 13.7305 36.8866 12.6638 37.2066 11.5972L38.2123 8.12482H40.7951L41.4579 5.85532H38.8523L40.0865 1.54326H37.7095L34.6239 12.3007C34.3267 13.322 33.6182 13.7305 33.0011 13.7305C32.0183 13.7305 31.7211 12.9362 31.9268 12.2099L33.7553 5.85532C33.1154 5.65106 32.2011 5.4922 31.4926 5.4922C27.4013 5.4922 23.5386 9.10071 23.5386 12.6638C23.5386 12.667 23.5386 12.6704 23.5386 12.6736C22.4442 13.3703 21.1746 13.7305 20.0644 13.7305C19.2873 13.7305 18.8531 13.6624 18.5102 13.4809C20.4301 12.2326 22.4186 10.1447 22.4186 7.94326C22.4186 6.19574 21.1387 5.51489 19.973 5.51489C16.3389 5.51489 13.8018 10.1674 14.6475 13.1404C13.8475 13.5489 13.1161 13.7532 12.3162 13.7532C11.0591 13.7532 9.87055 13.2312 8.9563 12.1872L10.122 8.12482C12.9561 7.89787 16.7046 5.58298 16.7046 2.7461C16.7046 0.975887 15.516 0 14.0075 0C11.3334 0 9.322 2.56454 8.3849 5.85532C6.64782 5.65106 5.71072 3.79007 7.08209 1.54326H4.61362C3.08225 4.92482 4.63647 7.28511 7.74492 8.12482L6.99067 10.7348C5.84785 10.0312 4.95646 9.75887 3.90507 9.75887C-1.14616 9.75887 -1.35187 16 3.60794 16C5.04788 16 6.78496 15.2511 7.69921 14.2525C9.00202 15.3872 10.282 16 11.9276 16C13.1847 16 14.4647 15.6369 15.7903 14.8652C16.6817 15.5915 17.8474 16 19.5159 16C20.9977 16 22.4797 15.6945 24.0058 14.6297C24.4579 15.4197 25.2827 16 26.6699 16C27.8356 16 29.1155 15.5007 30.0755 14.434C30.784 15.4553 31.8583 16 32.9554 16C33.8696 16 34.8067 15.6369 35.6067 14.9106C36.2467 15.5915 37.4123 16 38.6923 16C40.6808 16 42.8978 14.956 43.6749 12.2553L44.5663 9.1234C44.8406 8.19291 45.572 7.7617 46.4177 7.7617C47.1491 7.7617 47.5377 8.12482 47.5377 8.76028C47.5377 9.94043 46.4863 12.7546 46.4863 13.7532C46.4863 15.4326 47.6291 16 49.1604 16C50.1204 16 50.8747 15.9773 53.0231 15.0241C53.8917 15.6596 55.2402 16 56.7716 16C60.1772 16 62.5542 13.6851 64.177 8.12482H66.2341C65.8455 9.41844 65.5712 10.8482 65.5712 12.1191C65.5712 14.2525 66.3483 16 68.7483 16C70.6225 16 73.2281 14.1163 73.8909 11.6426H71.4224ZM13.6647 2.2695C14.099 2.2695 14.3961 2.51915 14.3961 2.88227C14.3961 4.08511 12.2476 5.62837 10.7619 5.85532C11.4476 3.49504 12.8419 2.2695 13.6647 2.2695ZM3.72222 13.7305C1.77944 13.7305 1.93943 11.8241 3.88222 11.8241C4.7279 11.8241 5.39073 12.0965 6.1907 12.7773C5.64215 13.3901 4.59076 13.7305 3.72222 13.7305ZM19.2873 7.7617C19.7673 7.7617 20.0644 8.05674 20.0644 8.53333C20.0644 9.80426 18.3959 11.3702 16.9788 12.1645C16.476 10.7121 17.916 7.7617 19.2873 7.7617ZM27.0813 13.7305C26.3728 13.7305 26.0299 13.2312 26.0299 12.505C26.0299 10.7574 27.927 7.80709 30.8297 7.7617C29.7783 11.4156 29.0698 13.7305 27.0813 13.7305ZM56.3144 7.7617C56.7944 7.7617 57.0916 8.05674 57.0916 8.53333C57.0916 9.80426 55.3545 11.4383 54.0288 12.2553C53.4574 10.8936 54.9202 7.7617 56.3144 7.7617Z" fill="currentColor" /> - + ); } diff --git a/src/app/ui/components/icons/leather-l-icon.tsx b/src/app/ui/components/icons/leather-l-icon.tsx new file mode 100644 index 00000000000..6b7d22d4376 --- /dev/null +++ b/src/app/ui/components/icons/leather-l-icon.tsx @@ -0,0 +1,22 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function LeatherLIcon({ size = '18px', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/components/icons/leather-lettermark.tsx b/src/app/ui/components/icons/leather-lettermark-icon.tsx similarity index 79% rename from src/app/components/icons/leather-lettermark.tsx rename to src/app/ui/components/icons/leather-lettermark-icon.tsx index 8d3a5f40ca3..eab79efece9 100644 --- a/src/app/components/icons/leather-lettermark.tsx +++ b/src/app/ui/components/icons/leather-lettermark-icon.tsx @@ -1,12 +1,12 @@ -import { styled } from 'leather-styles/jsx'; +import { Svg, SvgProps } from '@app/ui/components/svg'; -export function LeatherLettermark(props: React.ComponentProps) { +export function LeatherLettermarkIcon(props: SvgProps) { return ( - + - + ); } diff --git a/src/app/ui/components/icons/ledger-icon.tsx b/src/app/ui/components/icons/ledger-icon.tsx new file mode 100644 index 00000000000..3c32ad81396 --- /dev/null +++ b/src/app/ui/components/icons/ledger-icon.tsx @@ -0,0 +1,22 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function LedgerIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/list-icon.tsx b/src/app/ui/components/icons/list-icon.tsx new file mode 100644 index 00000000000..90984a35d70 --- /dev/null +++ b/src/app/ui/components/icons/list-icon.tsx @@ -0,0 +1,28 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function ListIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/lock-icon.tsx b/src/app/ui/components/icons/lock-icon.tsx new file mode 100644 index 00000000000..b92958613f6 --- /dev/null +++ b/src/app/ui/components/icons/lock-icon.tsx @@ -0,0 +1,33 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function LockIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/ordinal-icon.tsx b/src/app/ui/components/icons/ordinal-icon.tsx new file mode 100644 index 00000000000..99d61910412 --- /dev/null +++ b/src/app/ui/components/icons/ordinal-icon.tsx @@ -0,0 +1,21 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function OrdinalIcon({ size = 'xl', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/plus-icon.tsx b/src/app/ui/components/icons/plus-icon.tsx new file mode 100644 index 00000000000..12c4e511ee1 --- /dev/null +++ b/src/app/ui/components/icons/plus-icon.tsx @@ -0,0 +1,30 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function PlusIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/qr-code-icon.tsx b/src/app/ui/components/icons/qr-code-icon.tsx new file mode 100644 index 00000000000..b93bbc7be6c --- /dev/null +++ b/src/app/ui/components/icons/qr-code-icon.tsx @@ -0,0 +1,27 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function QrCodeIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/refresh-icon.tsx b/src/app/ui/components/icons/refresh-icon.tsx new file mode 100644 index 00000000000..f67f76f79ff --- /dev/null +++ b/src/app/ui/components/icons/refresh-icon.tsx @@ -0,0 +1,37 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function RefreshIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/rotate-left-icon.tsx b/src/app/ui/components/icons/rotate-left-icon.tsx new file mode 100644 index 00000000000..f3d1a981bb8 --- /dev/null +++ b/src/app/ui/components/icons/rotate-left-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function RotateLeftIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/stamps-icon.tsx b/src/app/ui/components/icons/stamps-icon.tsx new file mode 100644 index 00000000000..61badaf54ca --- /dev/null +++ b/src/app/ui/components/icons/stamps-icon.tsx @@ -0,0 +1,10 @@ +import StampsIconImg from '@assets/images/stamps-icon.png'; +import { Circle, CircleProps, styled } from 'leather-styles/jsx'; + +export function StampsIcon({ size = 'xl', ...props }: CircleProps) { + return ( + + + + ); +} diff --git a/src/app/ui/components/icons/star-icon.tsx b/src/app/ui/components/icons/star-icon.tsx new file mode 100644 index 00000000000..73c59bee940 --- /dev/null +++ b/src/app/ui/components/icons/star-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function StarIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/icons/stx-icon.tsx b/src/app/ui/components/icons/stx-icon.tsx new file mode 100644 index 00000000000..d56c07c0bc6 --- /dev/null +++ b/src/app/ui/components/icons/stx-icon.tsx @@ -0,0 +1,27 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '@app/ui/components/svg'; + +export function StxIcon({ size = 'xl', ...props }: SquareProps) { + return ( + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/stx-ledger-icon.tsx b/src/app/ui/components/icons/stx-ledger-icon.tsx new file mode 100644 index 00000000000..1f95eb3138c --- /dev/null +++ b/src/app/ui/components/icons/stx-ledger-icon.tsx @@ -0,0 +1,26 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function StxLedgerIcon({ size = 'md', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/swap-icon.tsx b/src/app/ui/components/icons/swap-icon.tsx new file mode 100644 index 00000000000..228a3fe408f --- /dev/null +++ b/src/app/ui/components/icons/swap-icon.tsx @@ -0,0 +1,31 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function SwapIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/trash-icon.tsx b/src/app/ui/components/icons/trash-icon.tsx new file mode 100644 index 00000000000..0014efe57ee --- /dev/null +++ b/src/app/ui/components/icons/trash-icon.tsx @@ -0,0 +1,26 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function TrashIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/unlock-icon.tsx b/src/app/ui/components/icons/unlock-icon.tsx new file mode 100644 index 00000000000..1c839ca0fc5 --- /dev/null +++ b/src/app/ui/components/icons/unlock-icon.tsx @@ -0,0 +1,33 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function UnlockIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + + ); +} diff --git a/src/app/ui/components/icons/wallet-type-ledger-icon.tsx b/src/app/ui/components/icons/wallet-type-ledger-icon.tsx new file mode 100644 index 00000000000..dc52b9eafa5 --- /dev/null +++ b/src/app/ui/components/icons/wallet-type-ledger-icon.tsx @@ -0,0 +1,54 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +export function WalletTypeLedgerIcon({ size = 'md', ...props }: SquareProps) { + return ( + + + + + + + + + + + ); +} diff --git a/src/app/ui/components/icons/zap-icon.tsx b/src/app/ui/components/icons/zap-icon.tsx new file mode 100644 index 00000000000..ac9aaf8183a --- /dev/null +++ b/src/app/ui/components/icons/zap-icon.tsx @@ -0,0 +1,23 @@ +import { Square, SquareProps } from 'leather-styles/jsx'; + +import { Svg } from '../svg'; + +// TODO: This svg was copied from react-icons temporarily +export function ZapIcon({ size = 'sm', ...props }: SquareProps) { + return ( + + + + + + ); +} diff --git a/src/app/ui/components/input.tsx b/src/app/ui/components/input.tsx new file mode 100644 index 00000000000..09ec6190015 --- /dev/null +++ b/src/app/ui/components/input.tsx @@ -0,0 +1,19 @@ +import { HTMLStyledProps, styled } from 'leather-styles/jsx'; + +type InputProps = HTMLStyledProps<'input'>; + +export function Input(props: InputProps) { + return ( + + ); +} diff --git a/src/app/ui/components/spinner.tsx b/src/app/ui/components/spinner.tsx new file mode 100644 index 00000000000..800268302a8 --- /dev/null +++ b/src/app/ui/components/spinner.tsx @@ -0,0 +1,35 @@ +import { Square, SquareProps, VisuallyHidden } from 'leather-styles/jsx'; + +interface SpinnerProps extends SquareProps { + emptyColor?: string; + label?: string; + speed?: string; + thickness?: string; +} + +export function Spinner({ + emptyColor = 'transparent', + size = '1.5rem', + label = 'Loading...', + thickness = '2px', + speed = '0.85s', + color = 'accent.text-subdued', + ...props +}: SpinnerProps) { + return ( + + {label && {label}} + + ); +} diff --git a/src/app/ui/components/svg.tsx b/src/app/ui/components/svg.tsx new file mode 100644 index 00000000000..9118a4caa10 --- /dev/null +++ b/src/app/ui/components/svg.tsx @@ -0,0 +1,8 @@ +import { styled } from 'leather-styles/jsx'; +import { HTMLStyledProps } from 'leather-styles/types'; + +export type SvgProps = HTMLStyledProps<'svg'>; + +export function Svg(props: SvgProps) { + return ; +} diff --git a/src/app/ui/components/typography/caption.tsx b/src/app/ui/components/typography/caption.tsx new file mode 100644 index 00000000000..a9f2a9c33cf --- /dev/null +++ b/src/app/ui/components/typography/caption.tsx @@ -0,0 +1,15 @@ +import { forwardRef } from 'react'; + +import { BoxProps, styled } from 'leather-styles/jsx'; + +export const Caption = forwardRef(({ children, ...props }, ref) => ( + + {children} + +)); diff --git a/src/app/ui/components/typography/title.tsx b/src/app/ui/components/typography/title.tsx new file mode 100644 index 00000000000..0129f184d97 --- /dev/null +++ b/src/app/ui/components/typography/title.tsx @@ -0,0 +1,15 @@ +import { forwardRef } from 'react'; + +import { BoxProps, styled } from 'leather-styles/jsx'; + +export const Title = forwardRef(({ children, ...props }, ref) => ( + + {children} + +)); diff --git a/src/app/ui/utils/README.md b/src/app/ui/utils/README.md new file mode 100644 index 00000000000..cedad0310cb --- /dev/null +++ b/src/app/ui/utils/README.md @@ -0,0 +1,80 @@ +# Stacks UI Utils + +Legacy utils taken from [Stacks UI](https://github.com/hirosystems/ui). Moved here initially but can be moved to monorepo + +## Transactions + +### getContractName + +This will parse a string and return the contract name. + +```ts +const contract = + 'ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV.market' || + 'ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV.market::asset-name'; + +const name = getContractName(contract); + +// market +``` + +### getAssetName + +This will parse a fully qualified asset name string and pull out the name of the asset. + +```ts +const contract = 'ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV.market::asset-name'; + +const asset = getAssetName(contract); + +// asset-name +``` + +### getAssetStringParts + +This will parse a fully qualified asset name string and return the various parts: `address`, `contractName`, `assetName`. + +```ts +const contract = 'ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV.market::asset-name'; + +const { address, contractName, assetName } = getAssetStringParts(contract); + +// ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV +// market +// asset-name +``` + +## Strings + +### truncateHex + +This will truncate a hex, keeping the 0x out of the offset amount. + +```ts +const hex = `0x33cc9a437e704e790958f7bb66492f5ad3a863ab3bcbef47138069725549a353`; + +const shortened = truncateHex(hex, 4); +// 0x33cc...a353 +``` + +### truncateMiddle + +This will truncate any string in the middle, given an offset amount. + +```ts +const hex = `0x33cc9a437e704e790958f7bb66492f5ad3a863ab3bcbef47138069725549a353`; + +const shortened = truncateHex(hex, 4); +// 0x33cc...a353 + +const contract = 'ST12EY99GS4YKP0CP2CFW6SEPWQ2CGVRWK5GHKDRV.market'; + +const shortenedContract = truncateHex(contract, 4); +// ST12...KDRV.market +``` + +## Units + +### microStxToStx + +Converts uSTX to STX. diff --git a/src/app/components/text/capitalize.tsx b/src/app/ui/utils/capitalize.tsx similarity index 100% rename from src/app/components/text/capitalize.tsx rename to src/app/ui/utils/capitalize.tsx diff --git a/src/app/ui/utils/get-asset-name.ts b/src/app/ui/utils/get-asset-name.ts new file mode 100644 index 00000000000..e178340fb14 --- /dev/null +++ b/src/app/ui/utils/get-asset-name.ts @@ -0,0 +1,21 @@ +/** + * getAssetName + * + * Gets the asset name from a string. + * + * @param fullyQualifiedName - the fully qualified name of the asset: [principal].[contract-name]::[asset-name] + */ +export const getAssetName = (fullyQualifiedName: string): string => { + if (!fullyQualifiedName.includes('::')) { + // console.warn( + // 'getAssetName: does not contain "::", does not appear to be a fully qualified name of an asset.', + // { + // fullyQualifiedName, + // } + // ); + return fullyQualifiedName; + } + return fullyQualifiedName.split('::')[1]; +}; + +// get rebasing this then get to work on the next list diff --git a/src/app/ui/utils/get-asset-string-parts.ts b/src/app/ui/utils/get-asset-string-parts.ts new file mode 100644 index 00000000000..a82b44ed3fb --- /dev/null +++ b/src/app/ui/utils/get-asset-string-parts.ts @@ -0,0 +1,41 @@ +import { getAssetName } from './get-asset-name'; +import { getContractName } from './get-contract-name'; + +/** + * getAssetStringParts + * + * Gets the parts that make up a fully qualified name of an asset + * + * @param fullyQualifiedName - the fully qualified name of the asset: [principal].[contract-name]::[asset-name] + */ +export const getAssetStringParts = ( + fullyQualifiedName: string +): { + address: string; + contractName: string; + assetName: string; +} => { + if (!fullyQualifiedName.includes('.') || !fullyQualifiedName.includes('::')) { + // console.warn( + // 'getAssetStringParts: does not contain a period or "::", does not appear to be a fully qualified name of an asset.', + // { + // fullyQualifiedName, + // } + // ); + return { + address: fullyQualifiedName, + contractName: fullyQualifiedName, + assetName: fullyQualifiedName, + }; + } + + const address = fullyQualifiedName.split('.')[0]; + const contractName = getContractName(fullyQualifiedName); + const assetName = getAssetName(fullyQualifiedName); + + return { + address, + contractName, + assetName, + }; +}; diff --git a/src/app/ui/utils/get-contract-name.ts b/src/app/ui/utils/get-contract-name.ts new file mode 100644 index 00000000000..59efe32a85e --- /dev/null +++ b/src/app/ui/utils/get-contract-name.ts @@ -0,0 +1,21 @@ +/** + * getContractName + * + * Gets the contract name of a string: contract_id or fully qualified asset name. + * + * @param value - the source string: [principal].[contract-name] or [principal].[contract-name]::[asset-name] + */ +export const getContractName = (value: string): string => { + if (value.includes('.')) { + const parts = value?.split('.'); + if (value.includes('::')) { + return parts[1].split('::')[0]; + } + return parts[1]; + } + // #4476 TODO: migrate to log in Sentry + // console.warn('getContractName: does not contain a period, does not appear to be a contract_id.', { + // value, + // }); + return value; +}; diff --git a/src/app/ui/utils/micro-stx-to-stx.ts b/src/app/ui/utils/micro-stx-to-stx.ts new file mode 100644 index 00000000000..f6738e401ab --- /dev/null +++ b/src/app/ui/utils/micro-stx-to-stx.ts @@ -0,0 +1,3 @@ +export function microStxToStx(microStx: string | number): number | string { + return Number(Number(microStx) / Math.pow(10, 6)); +} diff --git a/src/app/ui/utils/prism.tsx b/src/app/ui/utils/prism.tsx new file mode 100644 index 00000000000..881a64061d7 --- /dev/null +++ b/src/app/ui/utils/prism.tsx @@ -0,0 +1,163 @@ +import { CSSProperties } from 'react'; + +import { PrismTheme } from 'prism-react-renderer'; + +export interface GrammaticalToken { + types: string[]; + content: string; + empty?: boolean; +} + +interface GrammaticalTokenOutputProps { + key?: React.Key; + style?: CSSProperties; + className: string; + children: string; + [otherProp: string]: any; +} + +interface GrammaticalTokenInputProps { + key?: React.Key; + style?: CSSProperties; + className?: string; + token: GrammaticalToken; + [otherProp: string]: any; +} + +interface LineInputProps { + key?: React.Key; + style?: CSSProperties; + className?: string; + line: GrammaticalToken[]; + [otherProp: string]: any; +} + +interface LineOutputProps { + key?: React.Key; + style?: CSSProperties; + className: string; + [otherProps: string]: any; +} + +export interface RenderProps { + tokens: GrammaticalToken[][]; + className: string; + style: CSSProperties; + getLineProps: (input: LineInputProps) => LineOutputProps; + getTokenProps: (input: GrammaticalTokenInputProps) => GrammaticalTokenOutputProps; +} + +export type GetGrammaticalTokenProps = ( + input: GrammaticalTokenInputProps +) => GrammaticalTokenOutputProps; + +export type Language = + | 'markup' + | 'bash' + | 'clarity' + | 'clike' + | 'c' + | 'cpp' + | 'css' + | 'javascript' + | 'jsx' + | 'coffeescript' + | 'actionscript' + | 'css-extr' + | 'diff' + | 'git' + | 'go' + | 'graphql' + | 'handlebars' + | 'json' + | 'less' + | 'lisp' + | 'makefile' + | 'markdown' + | 'objectivec' + | 'ocaml' + | 'python' + | 'reason' + | 'sass' + | 'scss' + | 'sql' + | 'stylus' + | 'tsx' + | 'typescript' + | 'wasm' + | 'yaml'; + +export const theme: PrismTheme = { + plain: { + color: '#fff', + backgroundColor: 'transparent', + }, + styles: [ + { + types: ['prolog'], + style: { + color: 'rgb(0, 0, 128)', + }, + }, + { + types: ['comment', 'punctuation'], + style: { + color: 'rgb(106, 153, 85)', + }, + }, + { + types: ['builtin', 'tag', 'changed', 'function', 'keyword'], + style: { + color: 'rgb(86, 156, 214)', + }, + }, + { + types: ['number', 'variable', 'inserted'], + style: { + color: '#A58FFF', + }, + }, + { + types: ['operator'], + style: { + color: 'rgb(212, 212, 212)', + }, + }, + { + types: ['constant'], + style: { + color: 'rgb(100, 102, 149)', + }, + }, + { + types: ['attr-name'], + style: { + color: 'rgb(156, 220, 254)', + }, + }, + { + types: ['car'], + style: { + color: 'rgb(156, 220, 254)', + }, + }, + { + types: ['deleted', 'string'], + style: { + color: '#FF7B48', + }, + }, + { + types: ['class-name'], + style: { + color: 'rgb(78, 201, 176)', + }, + }, + { + types: ['char'], + style: { + color: '#FF7B48', + }, + }, + ], +}; diff --git a/src/app/ui/utils/start-pad.tsx b/src/app/ui/utils/start-pad.tsx new file mode 100644 index 00000000000..e65286a56c5 --- /dev/null +++ b/src/app/ui/utils/start-pad.tsx @@ -0,0 +1,2 @@ +export const startPad = (n: number, z = 2, s = '0') => + (n + '').length <= z ? ['', '-'][+(n < 0)] + (s.repeat(z) + Math.abs(n)).slice(-1 * z) : n + ''; diff --git a/src/app/ui/utils/truncate-middle.ts b/src/app/ui/utils/truncate-middle.ts new file mode 100644 index 00000000000..d83d60c625c --- /dev/null +++ b/src/app/ui/utils/truncate-middle.ts @@ -0,0 +1,23 @@ +function truncateHex(hex: string, offset = 5): string { + return `${hex.substring(0, offset + 2)}…${hex.substring(hex.length - offset)}`; +} + +export function truncateMiddle(input: string, offset = 5): string { + if (!input) return ''; + // Hex + if (input.startsWith('0x')) { + return truncateHex(input, offset); + } + // For contracts + if (input.includes('.')) { + const parts = input.split('.'); + const start = parts[0]?.substring(0, offset); + const end = parts[0]?.substring(parts[0].length - offset, parts[0].length); + return `${start}…${end}.${parts[1]}`; + } else { + // Everything else + const start = input?.substring(0, offset); + const end = input?.substring(input.length - offset, input.length); + return `${start}…${end}`; + } +} diff --git a/src/background/messaging/rpc-methods/accept-bitcoin-contract.ts b/src/background/messaging/rpc-methods/accept-bitcoin-contract.ts index 95bde039065..ecbdee03111 100644 --- a/src/background/messaging/rpc-methods/accept-bitcoin-contract.ts +++ b/src/background/messaging/rpc-methods/accept-bitcoin-contract.ts @@ -20,7 +20,7 @@ export async function rpcAcceptBitcoinContractOffer( if ( !message.params || !message.params.bitcoinContractOffer || - !message.params.attestorURLs || + !message.params.bitcoinNetwork || !message.params.counterpartyWalletDetails ) { chrome.tabs.sendMessage( @@ -38,7 +38,7 @@ export async function rpcAcceptBitcoinContractOffer( const params: RequestParams = [ ['bitcoinContractOffer', message.params.bitcoinContractOffer], - ['attestorURLs', message.params.attestorURLs], + ['bitcoinNetwork', message.params.bitcoinNetwork], ['counterpartyWalletDetails', message.params.counterpartyWalletDetails], ['requestId', message.id], ]; diff --git a/src/content-scripts/content-script.ts b/src/content-scripts/content-script.ts index bf37c932eb2..cdd87fb5c26 100755 --- a/src/content-scripts/content-script.ts +++ b/src/content-scripts/content-script.ts @@ -131,7 +131,7 @@ document.addEventListener(DomEventName.psbtRequest, ((event: PsbtRequestEvent) = function addLeatherToPage() { const inpage = document.createElement('script'); inpage.src = chrome.runtime.getURL('inpage.js'); - inpage.id = 'hiro-wallet-provider'; + inpage.id = 'leather-provider'; document.body.appendChild(inpage); } diff --git a/src/shared/constants.ts b/src/shared/constants.ts index 9c19c09aa60..cb052ff54bf 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -57,8 +57,8 @@ interface BaseChainConfig { interface BitcoinChainConfig extends BaseChainConfig { blockchain: 'bitcoin'; - url: string; - network: BitcoinNetworkModes; + bitcoinUrl: string; + bitcoinNetwork: BitcoinNetworkModes; } interface StacksChainConfig extends BaseChainConfig { @@ -100,8 +100,8 @@ const networkMainnet: NetworkConfiguration = { }, bitcoin: { blockchain: 'bitcoin', - network: 'mainnet', - url: BITCOIN_API_BASE_URL_MAINNET, + bitcoinNetwork: 'mainnet', + bitcoinUrl: BITCOIN_API_BASE_URL_MAINNET, }, }, }; @@ -117,8 +117,8 @@ const networkTestnet: NetworkConfiguration = { }, bitcoin: { blockchain: 'bitcoin', - network: 'testnet', - url: BITCOIN_API_BASE_URL_TESTNET, + bitcoinNetwork: 'testnet', + bitcoinUrl: BITCOIN_API_BASE_URL_TESTNET, }, }, }; @@ -134,8 +134,8 @@ const networkSignet: NetworkConfiguration = { }, bitcoin: { blockchain: 'bitcoin', - network: 'signet', - url: BITCOIN_API_BASE_URL_SIGNET, + bitcoinNetwork: 'signet', + bitcoinUrl: BITCOIN_API_BASE_URL_SIGNET, }, }, }; @@ -151,8 +151,8 @@ const networkSbtcDevenv: NetworkConfiguration = { }, bitcoin: { blockchain: 'bitcoin', - network: 'regtest', - url: 'http://localhost:3002', + bitcoinNetwork: 'regtest', + bitcoinUrl: 'http://localhost:8999/api', }, }, }; @@ -168,8 +168,8 @@ const networkDevnet: NetworkConfiguration = { }, bitcoin: { blockchain: 'bitcoin', - network: 'regtest', - url: 'http://localhost:18443', + bitcoinNetwork: 'regtest', + bitcoinUrl: 'http://localhost:18443', }, }, }; diff --git a/src/shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs.ts b/src/shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs.ts index 11307c53c9a..37015d7402b 100644 --- a/src/shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs.ts +++ b/src/shared/crypto/bitcoin/bip322/sign-message-bip322-bitcoinjs.ts @@ -1,4 +1,5 @@ import { base64 } from '@scure/base'; +import * as btc from '@scure/btc-signer'; import * as bitcoin from 'bitcoinjs-lib'; import { BitcoinNetworkModes } from '@shared/constants'; @@ -44,7 +45,7 @@ function createToSignTx(toSpendTxHex: Buffer, script: Buffer, network: BitcoinNe virtualToSign.setVersion(0); const prevTxHash = toSpendTxHex; const prevOutIndex = 0; - const toSignScriptSig = bitcoin.script.compile([106]); + const toSignScriptSig = bitcoin.script.compile([bitcoin.script.OPS.OP_RETURN]); virtualToSign.addInput({ hash: prevTxHash, @@ -61,23 +62,25 @@ interface SignBip322MessageSimple { address: string; message: string; network: BitcoinNetworkModes; - signPsbt(psbt: bitcoin.Psbt): void; + signPsbt(psbt: bitcoin.Psbt): Promise; } -export function signBip322MessageSimple(args: SignBip322MessageSimple) { +export async function signBip322MessageSimple(args: SignBip322MessageSimple) { const { address, message, network, signPsbt } = args; const { virtualToSpend, script } = createToSpendTx(address, message, network); const virtualToSign = createToSignTx(virtualToSpend.getHash(), script, network); - signPsbt(virtualToSign); + const signedTx = await signPsbt(virtualToSign); - virtualToSign.finalizeInput(0); + const asBitcoinJsTransaction = bitcoin.Psbt.fromBuffer(Buffer.from(signedTx.toPSBT())); + + asBitcoinJsTransaction.finalizeInput(0); // sign the tx // section 5.1 // github.com/LegReq/bip0322-signatures/blob/master/BIP0322_signing.ipynb - const toSignTx = virtualToSign.extractTransaction(); + const toSignTx = asBitcoinJsTransaction.extractTransaction(); const result = encodeMessageWitnessData(toSignTx.ins[0].witness); diff --git a/src/shared/crypto/bitcoin/bip322/sign-message-bip322.spec.ts b/src/shared/crypto/bitcoin/bip322/sign-message-bip322.spec.ts index 74c4de5695c..049aeabd89f 100644 --- a/src/shared/crypto/bitcoin/bip322/sign-message-bip322.spec.ts +++ b/src/shared/crypto/bitcoin/bip322/sign-message-bip322.spec.ts @@ -36,8 +36,9 @@ describe(signBip322MessageSimple.name, () => { const nativeSegwitAddress = btc.getAddress('wpkh', testVectorKey); const payment = btc.p2wpkh(secp.getPublicKey(testVectorKey, true)); - function signPsbt(psbt: bitcoin.Psbt) { + async function signPsbt(psbt: bitcoin.Psbt) { psbt.signAllInputs(createNativeSegwitBitcoinJsSigner(Buffer.from(testVectorKey))); + return btc.Transaction.fromPSBT(psbt.toBuffer()); } if (!nativeSegwitAddress) throw new Error('nativeSegwitAddress is undefined'); @@ -47,16 +48,16 @@ describe(signBip322MessageSimple.name, () => { expect(payment.address).toEqual('bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l'); }); - test('Signature: "" (empty string)', () => { + test('Signature: "" (empty string)', async () => { const { virtualToSpend: emptyStringToSpend, virtualToSign: emptyStringToSign, signature: emptyStringSig, - } = signBip322MessageSimple({ + } = await signBip322MessageSimple({ address: nativeSegwitAddress, message: '', - signPsbt, network: 'mainnet', + signPsbt, }); expect(emptyStringToSpend.getId()).toEqual( 'c5680aa69bb8d860bf82d4e9cd3504b55dde018de765a91bb566283c545a99a7' @@ -74,13 +75,14 @@ describe(signBip322MessageSimple.name, () => { }); const helloWorld = 'Hello World'; - test(`Signature: "${helloWorld}"`, () => { - const { virtualToSpend, virtualToSign, unencodedSig, signature } = signBip322MessageSimple({ - address: nativeSegwitAddress, - message: helloWorld, - signPsbt, - network: 'mainnet', - }); + test(`Signature: "${helloWorld}"`, async () => { + const { virtualToSpend, virtualToSign, unencodedSig, signature } = + await signBip322MessageSimple({ + address: nativeSegwitAddress, + message: helloWorld, + network: 'mainnet', + signPsbt, + }); // section 3 expect(virtualToSpend.getId()).toEqual( @@ -120,11 +122,12 @@ describe(signBip322MessageSimple.name, () => { ecdsaPublicKeyToSchnorr(secp.getPublicKey(Buffer.from(testVectorKey), true)) ); - function signPsbt(psbt: bitcoin.Psbt) { + async function signPsbt(psbt: bitcoin.Psbt) { psbt.data.inputs.forEach( input => (input.tapInternalKey = Buffer.from(payment.tapInternalKey)) ); psbt.signAllInputs(createTaprootBitcoinJsSigner(Buffer.from(testVectorKey))); + return btc.Transaction.fromPSBT(psbt.toBuffer()); } test('Addresses against taproot test vectors', () => { @@ -137,8 +140,8 @@ describe(signBip322MessageSimple.name, () => { }); // Taproot signatures verified with verifymessage request to node - test('Signature: "" (empty string)', () => { - const { signature } = signBip322MessageSimple({ + test('Signature: "" (empty string)', async () => { + const { signature } = await signBip322MessageSimple({ address: taprootAddress, message: '', network: 'mainnet', @@ -150,16 +153,16 @@ describe(signBip322MessageSimple.name, () => { ); }); - test('Signature: "HiroWalletIsTheBest"', () => { - const { signature } = signBip322MessageSimple({ + test('Signature: "WearLeather"', async () => { + const { signature } = await signBip322MessageSimple({ address: taprootAddress, - message: 'HiroWalletIsTheBest', + message: 'WearLeather', network: 'mainnet', signPsbt, }); expect(signature).toEqual( - 'AUAJNdp5SEAFCDYrIR8TQRkgbNo6P+dUeL97eadGjPWC8iPrhngZSBZvcImVk/HEb3zq3xuyGqyP0dqR7CH2HCa7' + 'AUDjK8SJX34boek3m3EKXI94AMBZynJUmdqgO7i4z6JKG6gkUgp+brkWl0ylzWb+8enM4s4B4TWel0iCmcQrKNWS' ); }); }); diff --git a/src/shared/crypto/bitcoin/bitcoin.utils.ts b/src/shared/crypto/bitcoin/bitcoin.utils.ts index e9e6b1ab914..beacbeaf40b 100644 --- a/src/shared/crypto/bitcoin/bitcoin.utils.ts +++ b/src/shared/crypto/bitcoin/bitcoin.utils.ts @@ -4,11 +4,12 @@ import { HDKey, Versions } from '@scure/bip32'; import * as btc from '@scure/btc-signer'; import { BitcoinNetworkModes, NetworkModes } from '@shared/constants'; -import { whenNetwork } from '@shared/utils'; +import { logger } from '@shared/logger'; import { defaultWalletKeyId } from '@shared/utils'; +import { isDefined, whenNetwork } from '@shared/utils'; import { DerivationPathDepth } from '../derivation-path.utils'; -import { BtcSignerNetwork } from './bitcoin.network'; +import { BtcSignerNetwork, getBtcSignerLibNetworkConfigByMode } from './bitcoin.network'; import { getTaprootPayment } from './p2tr-address-gen'; export interface BitcoinAccount { @@ -66,32 +67,51 @@ export function decodeBitcoinTx(tx: string) { export function getAddressFromOutScript(script: Uint8Array, bitcoinNetwork: BtcSignerNetwork) { const outputScript = btc.OutScript.decode(script); - if (outputScript.type === 'pk' || outputScript.type === 'tr') { - return btc.Address(bitcoinNetwork).encode({ - type: outputScript.type, - pubkey: outputScript.pubkey, - }); + switch (outputScript.type) { + case 'pkh': + case 'sh': + case 'wpkh': + case 'wsh': + return btc.Address(bitcoinNetwork).encode({ + type: outputScript.type, + hash: outputScript.hash, + }); + case 'tr': + return btc.Address(bitcoinNetwork).encode({ + type: outputScript.type, + pubkey: outputScript.pubkey, + }); + case 'ms': + return btc.p2ms(outputScript.m, outputScript.pubkeys).address ?? ''; + case 'pk': + return btc.p2pk(outputScript.pubkey, bitcoinNetwork).address ?? ''; + case 'tr_ms': + case 'tr_ns': + logger.error(`Cannot currently handle script type ${outputScript.type}`); + return ''; + case 'unknown': + return 'unknown'; + default: + return ''; } - if (outputScript.type === 'ms' || outputScript.type === 'tr_ms') { - return btc.Address(bitcoinNetwork).encode({ - type: outputScript.type, - pubkeys: outputScript.pubkeys, - m: outputScript.m, - }); - } - if (outputScript.type === 'tr_ns') { - return btc.Address(bitcoinNetwork).encode({ - type: outputScript.type, - pubkeys: outputScript.pubkeys, - }); - } - if (outputScript.type === 'unknown') { - return 'unknown'; - } - return btc.Address(bitcoinNetwork).encode({ - type: outputScript.type, - hash: outputScript.hash, - }); +} + +export function getBitcoinInputAddress( + index: number, + input: btc.TransactionInput, + bitcoinNetwork: BtcSignerNetwork +) { + if (isDefined(input.witnessUtxo)) + return getAddressFromOutScript(input.witnessUtxo.script, bitcoinNetwork); + if (isDefined(input.nonWitnessUtxo)) + return getAddressFromOutScript(input.nonWitnessUtxo.outputs[index]?.script, bitcoinNetwork); + return ''; +} + +export function getBitcoinInputValue(index: number, input: btc.TransactionInput) { + if (isDefined(input.witnessUtxo)) return Number(input.witnessUtxo.amount); + if (isDefined(input.nonWitnessUtxo)) return Number(input.nonWitnessUtxo.outputs[index]?.amount); + return 0; } type BtcSignerLibPaymentTypeIdentifers = 'wpkh' | 'wsh' | 'tr' | 'pkh' | 'sh'; @@ -131,7 +151,7 @@ function inferPaymentTypeFromPath(path: string): PaymentTypes { throw new Error(`Unable to infer payment type from path=${path}`); } -function inferNetworkFromPath(path: string): NetworkModes { +export function inferNetworkFromPath(path: string): NetworkModes { return path.split('/')[2].startsWith('0') ? 'mainnet' : 'testnet'; } @@ -225,3 +245,35 @@ export function getTaprootAddress({ index, keychain, network }: GetTaprootAddres return payment.address; } + +export function getPsbtTxInputs(psbtTx: btc.Transaction) { + const inputsLength = psbtTx.inputsLength; + const inputs: btc.TransactionInput[] = []; + if (inputsLength === 0) return inputs; + for (let i = 0; i < inputsLength; i++) { + inputs.push(psbtTx.getInput(i)); + } + return inputs; +} + +export function getPsbtTxOutputs(psbtTx: btc.Transaction) { + const outputsLength = psbtTx.outputsLength; + const outputs: btc.TransactionOutput[] = []; + if (outputsLength === 0) return outputs; + for (let i = 0; i < outputsLength; i++) { + outputs.push(psbtTx.getOutput(i)); + } + return outputs; +} + +export function getInputPaymentType( + index: number, + input: btc.TransactionInput, + network: BitcoinNetworkModes +): PaymentTypes { + const address = getBitcoinInputAddress(index, input, getBtcSignerLibNetworkConfigByMode(network)); + if (address === '') throw new Error('Input address cannot be empty'); + if (address.startsWith('bc1p') || address.startsWith('tb1p')) return 'p2tr'; + if (address.startsWith('bc1q') || address.startsWith('tb1q')) return 'p2wpkh'; + throw new Error('Unable to infer payment type from input address'); +} diff --git a/src/shared/environment.ts b/src/shared/environment.ts index 3ffc230a812..6b7140de0fe 100644 --- a/src/shared/environment.ts +++ b/src/shared/environment.ts @@ -10,7 +10,6 @@ export const SEGMENT_WRITE_KEY = process.env.SEGMENT_WRITE_KEY ?? ''; export const SENTRY_DSN = process.env.SENTRY_DSN ?? ''; export const TRANSAK_API_KEY = process.env.TRANSAK_API_KEY ?? ''; export const WALLET_ENVIRONMENT = process.env.WALLET_ENVIRONMENT ?? 'unknown'; -export const LEDGER_BITCOIN_ENABLED = process.env.LEDGER_BITCOIN_ENABLED === 'true'; // ts-unused-exports:disable-next-line export const SWAP_ENABLED = process.env.SWAP_ENABLED === 'true'; diff --git a/src/shared/route-urls.ts b/src/shared/route-urls.ts index 8e827fe7a31..c2c9a64ff8f 100644 --- a/src/shared/route-urls.ts +++ b/src/shared/route-urls.ts @@ -79,7 +79,6 @@ export enum RouteUrls { SendOrdinalInscription = 'send/ordinal-inscription', SendOrdinalInscriptionChooseFee = 'choose-fee', SendOrdinalInscriptionReview = 'review', - SendOrdinalInscriptionSummary = 'send/ordinal-inscription/', SendOrdinalInscriptionSent = 'sent', SendOrdinalInscriptionError = 'error', diff --git a/src/shared/rpc/methods/accept-bitcoin-contract.ts b/src/shared/rpc/methods/accept-bitcoin-contract.ts index ae2397c911e..ebc6208ab12 100644 --- a/src/shared/rpc/methods/accept-bitcoin-contract.ts +++ b/src/shared/rpc/methods/accept-bitcoin-contract.ts @@ -1,9 +1,11 @@ import { DefineRpcMethod, RpcRequest, RpcResponse } from '@btckit/types'; import { AllowAdditionalProperties } from '@btckit/types/dist/types/utils'; +import { BitcoinNetworkModes } from '@shared/constants'; + interface BitcoinContractResponseParams extends AllowAdditionalProperties { bitcoinContractOffer: string; - attestorURLs: string; + bitcoinNetwork: BitcoinNetworkModes; counterpartyWalletDetails: string; } @@ -16,7 +18,7 @@ export enum BitcoinContractResponseStatus { SUCCESS = 'Accepting Bitcoin Contract offer was successful', BROADCAST_ERROR = 'There was an error while broadcasting the Bitcoin Contract transaction', INTERFACE_ERROR = 'There was an error while interacting with the Bitcoin Contract interface', - NETWORK_ERROR = "The wallet's current selected network is not supported", + NETWORK_ERROR = "The wallet's current network does not match the one in the Bitcoin Contract offer", REJECTED = 'Bitcoin Contract offer was rejected', } diff --git a/src/shared/utils.ts b/src/shared/utils.ts index 5d525aaac8f..125843d74df 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -70,3 +70,14 @@ export function closeWindow() { // eslint-disable-next-line no-restricted-properties window.close(); } + +export function reverseBytes(bytes: Buffer): Buffer; +export function reverseBytes(bytes: Uint8Array): Uint8Array; +export function reverseBytes(bytes: Buffer | Uint8Array) { + if (Buffer.isBuffer(bytes)) return Buffer.from(bytes).reverse(); + return new Uint8Array(bytes.slice().reverse()); +} + +export function makeNumberRange(num: number) { + return [...Array(num).keys()]; +} diff --git a/test-app/src/components/app.tsx b/test-app/src/components/app.tsx index 93bf0ce9269..6fc725e1f05 100755 --- a/test-app/src/components/app.tsx +++ b/test-app/src/components/app.tsx @@ -5,24 +5,22 @@ import { useAuth } from '@common/use-auth'; import { Header } from '@components/header'; import { Home } from '@components/home'; import { Connect } from '@stacks/connect-react'; -import { Flex, ThemeProvider, theme } from '@stacks/ui'; +import { Flex } from 'leather-styles/jsx'; export const App: React.FC = () => { const { authOptions, state, authResponse, appPrivateKey, handleSignOut } = useAuth(); return ( - - - - - {/*These are for tests*/} - {authResponse && } - {appPrivateKey && } -
- - - - - + + + + {/*These are for tests*/} + {authResponse && } + {appPrivateKey && } +
+ + + + ); }; diff --git a/test-app/src/components/auth.tsx b/test-app/src/components/auth.tsx index cf73082cebe..f5c65271122 100644 --- a/test-app/src/components/auth.tsx +++ b/test-app/src/components/auth.tsx @@ -1,26 +1,17 @@ import React from 'react'; import { useConnect } from '@stacks/connect-react'; -import { Box, Button, ButtonGroup, Text } from '@stacks/ui'; import { OnboardingSelectors } from '@tests/selectors/onboarding.selectors'; +import { Box, styled } from 'leather-styles/jsx'; export const Auth: React.FC = () => { const { doOpenAuth } = useConnect(); return ( - - Sign in with your Leather to try out a demo of the Stacks 2.0 blockchain. - - - - + Sign in with your Leather to try out a demo of the Stacks 2.0 blockchain. + doOpenAuth()} data-testid={OnboardingSelectors.SignUpBtn}> + Sign up + ); }; diff --git a/test-app/src/components/bitcoin.tsx b/test-app/src/components/bitcoin.tsx index f1236c115ad..a3da6b67f5b 100644 --- a/test-app/src/components/bitcoin.tsx +++ b/test-app/src/components/bitcoin.tsx @@ -7,7 +7,7 @@ import { bytesToHex, hexToBytes } from '@stacks/common'; import { PsbtData, PsbtRequestOptions } from '@stacks/connect'; import { useConnect } from '@stacks/connect-react'; import { StacksNetwork } from '@stacks/network'; -import { Box, Button, Text } from '@stacks/ui'; +import { Box, styled } from 'leather-styles/jsx'; interface BitcoinNetwork { bech32: string; @@ -20,16 +20,12 @@ const bitcoinTestnet: BitcoinNetwork = { bech32: 'tb', pubKeyHash: 0x6f, scriptHash: 0xc4, - wif: 0xef, + wif: 0xef, }; // For testing sBTC w/ OP_RETURN in script -const tempHex1 = - '70736274ff0100a00200000001782ba5d65b8551a99228b8d77e4989cf6ef6a197827d13b6d1dc3e8ba3d8e77f0100000000ffffffff0300000000000000001a6a1858323c1a7010183fd1a76976e7b2bb67acdf57cdfe704882dd89000000000000225120b8c8b0652cb2851a52374c7acd47181eb031e8fa5c62883f636e0d4fe695d6caecd70c000000000016001409c7efcd51a08da9b4e38345645866c2a270eb39000000000001011fb7700d00000000001600141c902345da2f93aa6045034c381a0f64684082de00000000'; - -// For testing mainnet -const tempHex2 = - '70736274ff0100fd36010200000004350db8bb43dc351cf4f611aab22363c1fcfb27c61f2f7e55f3e38a1384248c660100000000ffffffff8fcf2bcf05c76ef86595c3bbe2f944064b34eede0c4c3c5dce4f1f94e663183d0000000000ffffffff8391b15b124ad2276c13916a61efabbfcc34f4211b3e6123829eaeab8096b8420000000000ffffffffe4653717d3c1544b073f97978998558be6c8e8aa7e51922303ec4814551fa16e0000000000ffffffff041027000000000000225120e25ef2545bce7dd7bd4215cdc76d16fe72c63163dca3f7a0757efa928841c96b7c920000000000001600146a9d9d7679bfeaf45c3a7d5b88826ec657ea91e2c4090000000000001600146a9d9d7679bfeaf45c3a7d5b88826ec657ea91e2983a0000000000001600149c1a4f6160d35ffada2e230f8bf1c4cfaf6ff52f00000000000100fdaa0301000000000102371586ae4679b5e411fced4b36ec421f65527447be8e3d0206419f979214fdf20000000000fdffffff5466bdc917b6a13f1db9429ee649a08b6b3860366e87202e0934d193e07a0d5b0100000000fdffffff02102700000000000022512044cab551f8178996c12870fcfd0399e3b0e4b9bb0312fc1c8b07b02e2dc17b0af92a0000000000002251207f4d47576eeaaa79a4cf320bf0b1876e50d943bdbbfc2823d99df37e642a37880140c6dff1e2084c2ae245c8b4b7751b9a5b1145f347d9d0ae06b8e2ec4591a2ab53fea2e5c6a356dfc6a54f51a7f15f1d1db8f056e8713842bfed58a1e063841c090341b00ba699988211aaa2e2464290bbc7db231765c5eaff65e0a7c2be27315093caa4009f2b302912f125d6bc28680bc1cfca7796647259e003a601f12683c1808081fd4c02204878d26dbb1678c06558222e1fd68e9ed68783fbb68d9f2bcb7ace09b225149dac0063036f726401032468eb6429a613f2564a36ce39589cda9ae404605267c4e0908c27ad1f144a0de900000000010117746578742f68746d6c3b636861727365743d7574662d38004dde013c626f64792f3e3c7363726970743e6a3d323b643d646f63756d656e743b623d642e626f64790a636c6173732055524c536561726368506172616d737b6765743d6b3d3e6b3d3d22746f6b656e4944223f6a3a307d286173796e6328293d3e7b713d225c6e220a6a3d393532302b282b617761697428617761697420666574636828222f636f6e74656e742f6463656538306631316133313034616233326633313665623763656466323839653436616531313533353362383165376432343362643431616462343734376669302229292e7465787428292b6a29253330300a69662869734e614e286a292972657475726e3b0a683d28617761697428617761697420666574636828222f636f6e74656e742f6539306434613134316661643237386339306530633436373532363030346534396164613963353833396365333634613536663231336136323936346562363869302229292e746578742829292e73706c69742871290a622e696e6e657248544d4c3d685b305d3b0a7a3d646f63756d656e742e637265617465456c656d656e74282273637269707422290a7a2e696e6e657248544d4c3d682e736c69636528322c34292e6a6f696e2871290a622e617070656e644368696c64287a297d2928293c2f7363726970743e0a6821c04878d26dbb1678c06558222e1fd68e9ed68783fbb68d9f2bcb7ace09b225149d0000000001012bf92a0000000000002251207f4d47576eeaaa79a4cf320bf0b1876e50d943bdbbfc2823d99df37e642a3788011720937077dcbafef4c74be898fbf723c628787f0d9922c384e6e80eded948d033ee000100df01000000000101e4653717d3c1544b073f97978998558be6c8e8aa7e51922303ec4814551fa16e0100000000fdffffff0260ea0000000000001600149c1a4f6160d35ffada2e230f8bf1c4cfaf6ff52fc81adf01000000001600143c2a59281416c1a9e9dc55170be53c5577d420e202483045022100bac8690acbd849d57687f889854f8abaf688f0b5e02eafa555ff3d86e62a8aad022071439d2bbae03118a0dc8fdb3e85405a459e0e7279f6f4659491fbfe11f1ce6601210234943fdac5b5d4d6c28e03b89a6adb6c7a3f55e782e718af3a251764a320da7500000000000100de0100000000010113edda3c24c6c3e0bdd37418ff173c558075010d763bb037773968e8f5f8da3f0000000000fdffffff0230750000000000001600149c1a4f6160d35ffada2e230f8bf1c4cfaf6ff52f712df800000000001600142547a6fb036a168e7cfb3359e7553c63e4252170024730440220060f1f5614a368bc319531050b043af5aa2d87222dc8cf134dc2b209588c6dfc0220069f1c978ed6cc68f5eef40e319697215a7f0f4ce5c5411a40d6bd08c69b3430012102567b081243c6b8439932d52e2f8a8bd2133ce18c4e63b6ee4a40e09dc73d897300000000000100de010000000001016c21dd4dc9508a4383dd364f5249d7f9c126093845dc9186e18bae449ff13e7a0000000000fdffffff02a8610000000000001600149c1a4f6160d35ffada2e230f8bf1c4cfaf6ff52fdf32e001000000001600142547a6fb036a168e7cfb3359e7553c63e4252170024730440220703a99388b1d04c7c1d22e79994e04100f19abb165105710bbe12a338930e45902204d8ed7eae8be52d06912911a0d3ad1dd2bf9d2f9ef0acf2e56293c3213d726e5012102d5369b8460ed3e38d6313bc308a207c7eed33ac6d18ced08ece56f885ce54657000000000000000000'; +// const tempHex = +// '70736274ff0100a00200000001782ba5d65b8551a99228b8d77e4989cf6ef6a197827d13b6d1dc3e8ba3d8e77f0100000000ffffffff0300000000000000001a6a1858323c1a7010183fd1a76976e7b2bb67acdf57cdfe704882dd89000000000000225120b8c8b0652cb2851a52374c7acd47181eb031e8fa5c62883f636e0d4fe695d6caecd70c000000000016001409c7efcd51a08da9b4e38345645866c2a270eb39000000000001011fb7700d00000000001600141c902345da2f93aa6045034c381a0f64684082de00000000'; const ecdsaPublicKeyLength = 33; const TEST_TESTNET_ACCOUNT_1_PUBKEY_P2WPKH = @@ -76,8 +72,8 @@ function buildTestNativeSegwitPsbtRequest(pubKey: Uint8Array): PsbtRequestOption const psbt = tx.toPSBT(); // For testing mainnet - return { hex: tempHex1 }; - // return { hex: bytesToHex(psbt) }; + // return { hex: tempHex }; + return { hex: bytesToHex(psbt) }; } function buildTestNativeSegwitPsbtRequestWithIndexes(pubKey: Uint8Array): PsbtRequestOptions { @@ -88,7 +84,7 @@ function buildTestNativeSegwitPsbtRequestWithIndexes(pubKey: Uint8Array): PsbtRe tx.addInput({ index: 0, txid: '5be910a6557bae29b8ff2dbf4607dbf783eaf82802896d13f61d975c133ccce7', - sighashType: 1, + sighashType: 2, witnessUtxo: { amount: BigInt(1268294), script: p2wpkh.script, @@ -184,19 +180,15 @@ export const Bitcoin = () => { return ( - - Bitcoin Testnet - - - Try testing Partially Signed Bitcoin Transactions. - - - - - - + ); }; diff --git a/test-app/src/components/bns.tsx b/test-app/src/components/bns.tsx index 646922cf91d..50e30a3065d 100644 --- a/test-app/src/components/bns.tsx +++ b/test-app/src/components/bns.tsx @@ -1,19 +1,15 @@ import React from 'react'; -import { Box, Button, Text } from '@stacks/ui'; +import { Box, styled } from 'leather-styles/jsx'; export const Bns = () => { return ( - - BNS - - - Use the testnet version of btc.us to QA BNS names. - - + ); }; diff --git a/test-app/src/components/counter-actions.tsx b/test-app/src/components/counter-actions.tsx index 505aca011a0..50590867e84 100644 --- a/test-app/src/components/counter-actions.tsx +++ b/test-app/src/components/counter-actions.tsx @@ -1,10 +1,11 @@ import React from 'react'; -import { Button, ButtonGroup, Box, Text } from '@stacks/ui'; + +import { IntCV, deserializeCV } from '@blockstack/stacks-transactions'; import { AppContext } from '@common/context'; import { getRPCClient, stacksTestnetNetwork as network } from '@common/utils'; -import { deserializeCV, IntCV } from '@blockstack/stacks-transactions'; -import { useConnect } from '@stacks/connect-react'; import { ExplorerLink } from '@components/explorer-link'; +import { useConnect } from '@stacks/connect-react'; +import { Box, styled } from 'leather-styles/jsx'; export const CounterActions: React.FC = () => { const { userData } = React.useContext(AppContext); diff --git a/test-app/src/components/counter.tsx b/test-app/src/components/counter.tsx index 4112e9ff0da..05ecec2b1f3 100644 --- a/test-app/src/components/counter.tsx +++ b/test-app/src/components/counter.tsx @@ -1,18 +1,18 @@ import React from 'react'; -import { Box, Text } from '@stacks/ui'; -import { ExplorerLink } from './explorer-link'; + +import { Box, styled } from 'leather-styles/jsx'; + import { CounterActions } from './counter-actions'; +import { ExplorerLink } from './explorer-link'; export const Counter = () => { return ( - - Counter smart contract - - + Counter smart contract + Try a smart contract that keeps a single "counter" state variable. The public methods "increment" and "decrement" change the value of the counter. - + { }; return ( - - Debugger - - + Debugger + Try out a bunch of different transactions on the Stacks blockchain testnet. - + {txId && ( - - + + Successfully broadcasted "{txType}" - + - + )} - - - - - - - - - - - - - - - - - + - - + + ); diff --git a/test-app/src/components/deploy.tsx b/test-app/src/components/deploy.tsx index 997168436d4..5746eca4e8b 100644 --- a/test-app/src/components/deploy.tsx +++ b/test-app/src/components/deploy.tsx @@ -1,7 +1,9 @@ import React from 'react'; -import { useConnect } from '@stacks/connect-react'; + import { SampleContracts } from '@common/contracts'; -import { Box, Button, Text } from '@stacks/ui'; +import { useConnect } from '@stacks/connect-react'; +import { Box, styled } from 'leather-styles/jsx'; + import { ExplorerLink } from './explorer-link'; export const Deploy = () => { @@ -19,15 +21,15 @@ export const Deploy = () => { }); return ( - + Contract Deploy - - + + Deploy a Clarity smart contract. To keep things simple, we'll provide a contract for you. - + {tx && } - + Deploy ); diff --git a/test-app/src/components/explorer-link.tsx b/test-app/src/components/explorer-link.tsx index 49564136f91..a4d728d1e77 100644 --- a/test-app/src/components/explorer-link.tsx +++ b/test-app/src/components/explorer-link.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link } from '@components/link'; -import { Box } from '@stacks/ui'; +import { Box } from 'leather-styles/jsx'; interface LinkProps { txId: string; diff --git a/test-app/src/components/header.tsx b/test-app/src/components/header.tsx index 4338efbeb35..d98839c4e4f 100644 --- a/test-app/src/components/header.tsx +++ b/test-app/src/components/header.tsx @@ -1,8 +1,8 @@ import React, { useContext } from 'react'; -import { Flex, Box } from '@stacks/ui'; -import { StacksLogo } from '@stacks/ui'; + import { AppContext } from '@common/context'; import { Link } from '@components/link'; +import { Box, styled } from 'leather-styles/jsx'; interface HeaderProps { signOut: () => void; @@ -11,10 +11,7 @@ interface HeaderProps { export const Header: React.FC = ({ signOut }) => { const state = useContext(AppContext); return ( - - - - + {state.userData ? ( = ({ signOut }) => { ) : null} - + ); }; diff --git a/test-app/src/components/home.tsx b/test-app/src/components/home.tsx index 2bcb66f62ab..d2d25365137 100644 --- a/test-app/src/components/home.tsx +++ b/test-app/src/components/home.tsx @@ -1,7 +1,7 @@ import React, { useContext, useState } from 'react'; import { AppContext } from '@common/context'; -import { Box, BoxProps, Flex, Text } from '@stacks/ui'; +import { Box, BoxProps, Flex, styled } from 'leather-styles/jsx'; import { Auth } from './auth'; import { Bitcoin } from './bitcoin'; @@ -31,25 +31,25 @@ const Page: React.FC<{ tab: Tabs; setTab: (value: Tabs) => void }> = ({ tab, set - setTab('debug')}>Debugger + setTab('debug')}>Debugger - setTab('status')}>Status smart contract + setTab('status')}>Status smart contract - setTab('counter')}>Counter smart contract + setTab('counter')}>Counter smart contract - setTab('bns')}>BNS + setTab('bns')}>BNS - setTab('signature')}>Signature + setTab('signature')}>Signature - setTab('profile')}>Profile + setTab('profile')}>Profile - setTab('bitcoin')}>Bitcoin + setTab('bitcoin')}>Bitcoin @@ -72,9 +72,9 @@ export const Home: React.FC = () => { return ( - + Testnet Demo - + {state.userData ? : } ); diff --git a/test-app/src/components/link.tsx b/test-app/src/components/link.tsx index 492c418a90a..cb12eca0420 100644 --- a/test-app/src/components/link.tsx +++ b/test-app/src/components/link.tsx @@ -1,9 +1,13 @@ -import React from 'react'; -import { Text, Box, BoxProps } from '@stacks/ui'; +import React, { ReactNode } from 'react'; -interface LinkProps extends BoxProps { +import { Box, BoxProps, styled } from 'leather-styles/jsx'; + +interface LinkProps { _hover?: BoxProps; onClick: () => void; + children: ReactNode; + fontSize: string; + textStyle: string; } export const buildEnterKeyEvent = (onClick: () => void) => { @@ -23,13 +27,13 @@ export const Link: React.FC = ({ ...rest }) => ( - {children} - + ); diff --git a/test-app/src/components/profile.tsx b/test-app/src/components/profile.tsx index 543e1eed305..5940cf53a69 100644 --- a/test-app/src/components/profile.tsx +++ b/test-app/src/components/profile.tsx @@ -5,8 +5,8 @@ import { stacksMainnetNetwork } from '@common/utils'; import { openProfileUpdateRequestPopup } from '@stacks/connect'; import { StacksNetwork } from '@stacks/network'; import { PublicPersonProfile, PublicProfile } from '@stacks/profile'; -import { Box, Button, ButtonGroup, Text } from '@stacks/ui'; import { TestAppSelectors } from '@tests/selectors/test-app.selectors'; +import { Box, Flex, styled } from 'leather-styles/jsx'; export const Profile = () => { const name = 'Name ' + new Date().getTime().toString(); @@ -38,15 +38,17 @@ export const Profile = () => { return ( {updatedProfile && ( - - + + Profile {updatedProfile.profile ? 'successfully ' : 'not'} updated - - {updatedProfile.profile && JSON.stringify(updatedProfile.profile)} - + + + {updatedProfile.profile && JSON.stringify(updatedProfile.profile)} + + )} - - + - - + + ); }; diff --git a/test-app/src/components/signature.tsx b/test-app/src/components/signature.tsx index 87c30456d5e..6999a1667eb 100644 --- a/test-app/src/components/signature.tsx +++ b/test-app/src/components/signature.tsx @@ -31,7 +31,7 @@ import { tupleCV, uintCV, } from '@stacks/transactions'; -import { Box, Button, Text } from '@stacks/ui'; +import { Box, styled } from 'leather-styles/jsx'; export const Signature = () => { const [signature, setSignature] = useState(); @@ -163,36 +163,43 @@ export const Signature = () => { return ( {(signature || signatureStructured) && ( - - + + {' '} Signature {signatureIsVerified ? 'successfully ' : 'not'} verified - - + + )} - - +
- +
- +
- +

- +
expected hash : '1bfdab6d4158313ce34073fbb8d6b0fc32c154d439def12247a0f44bb2225259' diff --git a/test-app/src/components/status.tsx b/test-app/src/components/status.tsx index 8213c1a7d03..a6c7bd4e887 100644 --- a/test-app/src/components/status.tsx +++ b/test-app/src/components/status.tsx @@ -1,19 +1,21 @@ import React, { useState } from 'react'; -import { Box, Text, Button, Input, Flex } from '@stacks/ui'; -import { ExplorerLink } from './explorer-link'; -import { useConnect } from '@stacks/connect-react'; + import { - PostConditionMode, - standardPrincipalCV, BufferCV, - deserializeCV, ClarityType, + PostConditionMode, bufferCV, + deserializeCV, + standardPrincipalCV, } from '@blockstack/stacks-transactions'; +import { useSTXAddress } from '@common/use-stx-address'; import { getRPCClient, stacksTestnetNetwork as network } from '@common/utils'; -import type { ContractCallTransaction } from '@stacks/stacks-blockchain-api-types'; import { TxCard } from '@components/tx-card'; -import { useSTXAddress } from '@common/use-stx-address'; +import { useConnect } from '@stacks/connect-react'; +import type { ContractCallTransaction } from '@stacks/stacks-blockchain-api-types'; +import { Box, Flex, styled } from 'leather-styles/jsx'; + +import { ExplorerLink } from './explorer-link'; export const Status = () => { const stxAddress = useSTXAddress(); @@ -92,13 +94,11 @@ export const Status = () => { return ( - - Status smart contract - - + Status smart contract + Try a smart contract where anyone can write their public status, like a decentralized Twitter. You can read someone else's status by entering their address. - + { {transactions.length > 0 && ( <> - + Latest statuses - + {transactions.slice(0, 3).map(t => ( @@ -118,12 +118,12 @@ export const Status = () => { )} - + Write a status - + - { /> {txId && } - + - + Read a status - + {stxAddress && ( - + If you want to read your own status, your address is {stxAddress}. - + )} - { {readStatus && ( - + {readStatus} - + )} {error && ( - + {error} - + )} - + ); }; diff --git a/test-app/src/components/tab.tsx b/test-app/src/components/tab.tsx index f6fa1cfa5af..d92c8caa0c9 100644 --- a/test-app/src/components/tab.tsx +++ b/test-app/src/components/tab.tsx @@ -1,7 +1,12 @@ import React from 'react'; -import { Box, BoxProps } from '@stacks/ui'; -export const InactiveTab: React.FC = ({ children }) => { +import { Box } from 'leather-styles/jsx'; + +interface Props { + children: React.ReactNode; +} + +export const InactiveTab: React.FC = ({ children }) => { return ( {children} @@ -9,7 +14,7 @@ export const InactiveTab: React.FC = ({ children }) => { ); }; -export const ActiveTab: React.FC = ({ children }) => { +export const ActiveTab: React.FC = ({ children }) => { return ( {children} @@ -17,7 +22,7 @@ export const ActiveTab: React.FC = ({ children }) => { ); }; -interface TabProps extends BoxProps { +interface TabProps extends Props { active: boolean; } diff --git a/test-app/src/components/tx-card.tsx b/test-app/src/components/tx-card.tsx index 8bfdcc5bdb8..31fa26a9bf3 100644 --- a/test-app/src/components/tx-card.tsx +++ b/test-app/src/components/tx-card.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { Box, Flex, Text } from '@stacks/ui'; -import type { ContractCallTransaction } from '@stacks/stacks-blockchain-api-types'; import { toRelativeTime } from '@common/utils'; +import type { ContractCallTransaction } from '@stacks/stacks-blockchain-api-types'; +import { Box, Flex, styled } from 'leather-styles/jsx'; interface TxCardProps { tx: ContractCallTransaction; @@ -18,7 +18,7 @@ export const TxCard: React.FC = ({ tx, label }) => { mt={3} borderColor="#F0F0F5" borderWidth="1px" - borderRadius="12px" + borderRadius="md" p={6} _hover={{ borderColor: 'ink.400', @@ -31,15 +31,15 @@ export const TxCard: React.FC = ({ tx, label }) => { > - {shortAddr} + {shortAddr} - {toRelativeTime(tx.burn_block_time * 1000)} + {toRelativeTime(tx.burn_block_time * 1000)} - + {label} - + ); }; diff --git a/test-app/tsconfig.json b/test-app/tsconfig.json index 92d0a6a03f2..a46c662126b 100644 --- a/test-app/tsconfig.json +++ b/test-app/tsconfig.json @@ -32,7 +32,8 @@ "@containers/*": ["./containers/*"], "@common/*": ["./common/*"], "@cards/*": ["./components/cards/*"], - "@tests/*": ["../../tests/*"] + "@tests/*": ["../../tests/*"], + "leather-styles/*": ["../../leather-styles/*"] }, "baseUrl": "./src", "allowSyntheticDefaultImports": true, diff --git a/test-app/webpack/webpack.config.base.js b/test-app/webpack/webpack.config.base.js index 2f51b0e5e17..48f71680da3 100755 --- a/test-app/webpack/webpack.config.base.js +++ b/test-app/webpack/webpack.config.base.js @@ -75,6 +75,7 @@ const aliases = { '@stacks/network': '@stacks/network/dist/esm', '@stacks/profile': '@stacks/profile/dist/esm', '@stacks/auth': '@stacks/auth/dist/esm', + 'leather-styles': path.resolve('leather-styles'), }; const config = { diff --git a/tests/page-object-models/network.page.ts b/tests/page-object-models/network.page.ts index 6a7f08440fb..386d48b537f 100644 --- a/tests/page-object-models/network.page.ts +++ b/tests/page-object-models/network.page.ts @@ -4,7 +4,10 @@ import { createTestSelector } from '@tests/utils'; export class NetworkPage { readonly networkNameSelector = createTestSelector(NetworkSelectors.NetworkName); - readonly networkAddressSelector = createTestSelector(NetworkSelectors.NetworkAddress); + readonly networkStacksAddressSelector = createTestSelector(NetworkSelectors.NetworkStacksAddress); + readonly networkBitcoinAddressSelector = createTestSelector( + NetworkSelectors.NetworkBitcoinAddress + ); readonly networkKeySelector = createTestSelector(NetworkSelectors.NetworkKey); readonly btnAddNetworkSelector = createTestSelector(NetworkSelectors.BtnAddNetwork); readonly errorTextSelector = createTestSelector(NetworkSelectors.ErrorText); @@ -13,17 +16,22 @@ export class NetworkPage { async inputNetworkNameField(input: string) { const field = this.page.locator(this.networkNameSelector); - await field?.type(input); + await field?.fill(input); } - async inputNetworkAddressField(input: string) { - const field = this.page.locator(this.networkAddressSelector); - await field?.type(input); + async inputNetworkStacksAddressField(input: string) { + const field = this.page.locator(this.networkStacksAddressSelector); + await field?.fill(input); + } + + async inputNetworkBitcoinAddressField(input: string) { + const field = this.page.locator(this.networkBitcoinAddressSelector); + await field?.fill(input); } async inputNetworkKeyField(input: string) { const field = this.page.locator(this.networkKeySelector); - await field?.type(input); + await field?.fill(input); } async waitForErrorMessage() { diff --git a/tests/selectors/network.selectors.ts b/tests/selectors/network.selectors.ts index 38aa40ca29d..4908387c28f 100644 --- a/tests/selectors/network.selectors.ts +++ b/tests/selectors/network.selectors.ts @@ -1,9 +1,13 @@ export enum NetworkSelectors { NetworkName = 'network-name', - NetworkAddress = 'network-address', + NetworkStacksAddress = 'network-stacks-address', + NetworkBitcoinAddress = 'network-bitcoin-address', NetworkKey = 'network-key', BtnAddNetwork = 'btn-add-network', ErrorText = 'error-text', - EmptyAddressError = 'Enter a valid URL', - NoNodeFetch = 'Unable to fetch info from node.', + EmptyStacksAddressError = 'Enter a valid Stacks API URL', + EmptyBitcoinURLError = 'Enter a valid Bitcoin API URL', + EmptyKeyError = 'Enter a unique key', + NoStacksNodeFetch = 'Unable to fetch info from stacks node', + NoBitcoinNodeFetch = 'Unable to fetch mempool from bitcoin node', } diff --git a/tests/specs/bitcoin-contract-offer-accept/bitcoin-contract-offer-accept.spec.ts b/tests/specs/bitcoin-contract-offer-accept/bitcoin-contract-offer-accept.spec.ts index 21e168cb6ca..d54959b9550 100644 --- a/tests/specs/bitcoin-contract-offer-accept/bitcoin-contract-offer-accept.spec.ts +++ b/tests/specs/bitcoin-contract-offer-accept/bitcoin-contract-offer-accept.spec.ts @@ -34,7 +34,7 @@ test.describe('Bitcoin Contract Request Test', () => { }) => page.evaluate( async params => - (window as any).HiroWalletProvider.request('acceptBitcoinContractOffer', params).catch( + (window as any).LeatherProvider.request('acceptBitcoinContractOffer', params).catch( (e: unknown) => e ), requestParams @@ -51,12 +51,12 @@ test.describe('Bitcoin Contract Request Test', () => { await rejectButton.click(); } - test('that the bitcoin contract offer is properly displayed', async ({ page, context }) => { + test.skip('that the bitcoin contract offer is properly displayed', async ({ page, context }) => { const expectedOfferorName = 'DLC.Link'; const expectedLockAmount = '0.0001 BTC'; const expectedExpirationDate = '10/17/2023'; - initiateOfferRequest(page)(requestParams); + await initiateOfferRequest(page)(requestParams); const popup = await context.waitForEvent('page'); @@ -82,7 +82,7 @@ test.describe('Bitcoin Contract Request Test', () => { await popup.close(); }); - test('that user can reject a bitcoin contract offer', async ({ page, context }) => { + test.skip('that user can reject a bitcoin contract offer', async ({ page, context }) => { const [result] = await Promise.all([ initiateOfferRequest(page)(requestParams), clickReject(context), @@ -99,11 +99,11 @@ test.describe('Bitcoin Contract Request Test', () => { }); }); - test(`that user can't accept a bitcoin contract offer without sufficient bitcoin'`, async ({ + test.skip(`that user can't accept a bitcoin contract offer without sufficient bitcoin'`, async ({ page, context, }) => { - initiateOfferRequest(page)(requestParams); + await initiateOfferRequest(page)(requestParams); const popup = await context.waitForEvent('page'); await popup.waitForTimeout(500); diff --git a/tests/specs/message-signing/bip322-message-signing.spec.ts b/tests/specs/message-signing/bip322-message-signing.spec.ts index 49989c867c2..62a57088f1d 100644 --- a/tests/specs/message-signing/bip322-message-signing.spec.ts +++ b/tests/specs/message-signing/bip322-message-signing.spec.ts @@ -22,7 +22,7 @@ test.describe('Message signing', () => return async (message: string) => page.evaluate( async message => - (window as any).HiroWalletProvider.request('signMessage', { + (window as any).LeatherProvider.request('signMessage', { message, paymentType: 'p2wpkh', }).catch((e: unknown) => e), diff --git a/tests/specs/network/add-network.spec.ts b/tests/specs/network/add-network.spec.ts index fcb1220f579..fbc17ea928f 100644 --- a/tests/specs/network/add-network.spec.ts +++ b/tests/specs/network/add-network.spec.ts @@ -12,22 +12,57 @@ test.describe('Networks tests', () => { await page.getByTestId(SettingsSelectors.BtnAddNetwork).click(); }); - test('validation error when address is empty', async ({ networkPage }) => { + test('validation error when stacks api url is empty', async ({ networkPage }) => { + await networkPage.inputNetworkStacksAddressField(''); + await networkPage.inputNetworkBitcoinAddressField('https://mempool.space/testnet/api'); + await networkPage.inputNetworkKeyField('test-network'); await networkPage.clickAddNetwork(); await networkPage.waitForErrorMessage(); const errorMsgElement = await networkPage.getErrorMessage(); const errorMessage = await errorMsgElement.innerText(); - test.expect(errorMessage).toEqual(NetworkSelectors.EmptyAddressError); + test.expect(errorMessage).toEqual(NetworkSelectors.EmptyStacksAddressError); }); - test('unable to fetch info from node', async ({ networkPage }) => { - await networkPage.inputNetworkAddressField('https://www.google.com/'); + test('validation error when key is empty', async ({ networkPage }) => { + await networkPage.clickAddNetwork(); + await networkPage.waitForErrorMessage(); + + const errorMsgElement = await networkPage.getErrorMessage(); + const errorMessage = await errorMsgElement.innerText(); + test.expect(errorMessage).toEqual(NetworkSelectors.EmptyKeyError); + }); + + test('validation error when bitcoin api url is empty', async ({ networkPage }) => { + await networkPage.inputNetworkBitcoinAddressField(''); await networkPage.inputNetworkKeyField('test-network'); await networkPage.clickAddNetwork(); await networkPage.waitForErrorMessage(); + + const errorMsgElement = await networkPage.getErrorMessage(); + const errorMessage = await errorMsgElement.innerText(); + test.expect(errorMessage).toEqual(NetworkSelectors.EmptyBitcoinURLError); + }); + + test('unable to fetch info from stacks node', async ({ networkPage }) => { + await networkPage.inputNetworkStacksAddressField('https://www.google.com/'); + await networkPage.inputNetworkKeyField('test-network'); + await networkPage.clickAddNetwork(); + await networkPage.waitForErrorMessage(); + + const errorMsgElement = await networkPage.getErrorMessage(); + const errorMessage = await errorMsgElement.innerText(); + test.expect(errorMessage).toEqual(NetworkSelectors.NoStacksNodeFetch); + }); + + test('unable to fetch mempool from bitcoin node', async ({ networkPage }) => { + await networkPage.inputNetworkBitcoinAddressField('https://www.google.com/'); + await networkPage.inputNetworkKeyField('test-network'); + await networkPage.clickAddNetwork(); + await networkPage.waitForErrorMessage(); + const errorMsgElement = await networkPage.getErrorMessage(); const errorMessage = await errorMsgElement.innerText(); - test.expect(errorMessage).toEqual(NetworkSelectors.NoNodeFetch); + test.expect(errorMessage).toEqual(NetworkSelectors.NoBitcoinNodeFetch); }); }); diff --git a/tests/specs/rpc-stacks-transaction/transaction-signing.spec.ts b/tests/specs/rpc-stacks-transaction/transaction-signing.spec.ts index cd2d765472c..89eb41bdd55 100644 --- a/tests/specs/rpc-stacks-transaction/transaction-signing.spec.ts +++ b/tests/specs/rpc-stacks-transaction/transaction-signing.spec.ts @@ -37,7 +37,7 @@ test.describe('Transaction signing', () => { return async (txHex: string) => page.evaluate( async txHex => - (window as any).HiroWalletProvider.request('stx_signTransaction', { + (window as any).LeatherProvider.request('stx_signTransaction', { txHex, network: 'mainnet', }).catch((e: unknown) => e), diff --git a/tests/specs/settings/settings-menu.spec.ts b/tests/specs/settings/settings-menu.spec.ts index de19296581c..48c7bb71d37 100644 --- a/tests/specs/settings/settings-menu.spec.ts +++ b/tests/specs/settings/settings-menu.spec.ts @@ -64,7 +64,7 @@ test.describe('Settings menu', () => { test.expect(currentNetwork).toContain('mainnet'); await page.getByTestId(SettingsSelectors.ChangeNetworkAction).click(); - await page.waitForTimeout(850); + await page.waitForTimeout(1000); const networkListItems = await page.getByTestId(SettingsSelectors.NetworkListItem).all(); test.expect(networkListItems).toHaveLength(5); }); diff --git a/theme/colors.ts b/theme/colors.ts index 883dfb1adaf..69c182613b0 100644 --- a/theme/colors.ts +++ b/theme/colors.ts @@ -61,7 +61,7 @@ export const colors = defineTokens.colors({ 5: { value: '#E4DDD6' }, 6: { value: '#DED6CD' }, 7: { value: '#D8CEC4' }, - 8: { value: '#C6B9AD' }, + 8: { value: '#948677' }, 9: { value: '#948677' }, 10: { value: '#64594D' }, 11: { value: '#4A423B' }, @@ -75,7 +75,7 @@ export const colors = defineTokens.colors({ 5: { value: '#12100F' }, 6: { value: '#716A60' }, 7: { value: '#8F887D' }, - 8: { value: '#C6B9AD' }, + 8: { value: '#948677' }, 9: { value: '#F5F1ED' }, 10: { value: '#DED6CD' }, 11: { value: '#DED6CD' }, @@ -108,5 +108,8 @@ export const colors = defineTokens.colors({ 10: { value: '#818181' }, 11: { value: '#B1B1B1' }, 12: { value: '#EEEEEE' }, - } + }, + lightModeStacks: { value: '#5546FF' }, + darkModeStacks: { value: '#7F80FF' }, + overlay: { value: 'rgba(0,0,0,0.4)' }, }); diff --git a/theme/keyframes.ts b/theme/keyframes.ts index fbebb5392ce..be88dc91df2 100644 --- a/theme/keyframes.ts +++ b/theme/keyframes.ts @@ -2,6 +2,14 @@ import { CssKeyframes } from 'leather-styles/types/system-types'; // ts-unused-exports:disable-next-line export const keyframes: CssKeyframes = { + fadein: { + '0%': { opacity: '0' }, + '100%': { opacity: '1' }, + }, + fadeout: { + '0%': { opacity: '1' }, + '100%': { opacity: '0' }, + }, shine: { '0%': { backgroundPosition: '-50px', @@ -18,4 +26,21 @@ export const keyframes: CssKeyframes = { transform: 'rotate(360deg)', }, }, + // TODO: identical to above, remove + spin: { + '0%': { + transform: 'rotate(0deg)', + }, + '100%': { + transform: 'rotate(360deg)', + }, + }, + animatedTick: { + from: { + strokeDashoffset: 350, + }, + to: { + strokeDashoffset: 0, + }, + }, }; diff --git a/theme/semantic-tokens.ts b/theme/semantic-tokens.ts index e3043a3efd5..b6661b6b097 100644 --- a/theme/semantic-tokens.ts +++ b/theme/semantic-tokens.ts @@ -69,21 +69,42 @@ export const semanticTokens = defineSemanticTokens({ 'background-primary': { value: { base: '{colors.lightModeBrown.1}', _dark: '{colors.darkModeBrown.1}' }, }, - disabled: { - value: { base: '{colors.lightModeBlue.100}', _dark: '{colors.darkModeBlue.100}' }, - }, - focused: { - value: { base: '{colors.lightModeBlue.500}', _dark: '{colors.darkModeBlue.500}' }, - }, 'notification-text': { value: { base: '{colors.lightModeBrown.12}', _dark: '{colors.darkModeBrown.12}' }, }, }, - warning: { - value: { base: '{colors.lightModeYellow.100}', _dark: '{colors.darkModeYellow.100}' }, + disabled: { + value: { base: '{colors.lightModeBlue.100}', _dark: '{colors.darkModeBlue.100}' }, }, error: { - value: { base: '{colors.lightModeRed.600}', _dark: '{colors.darkModeRed.600}' }, + background: { + value: { base: '{colors.lightModeRed.100}', _dark: '{colors.darkModeRed.100}' }, + }, + label: { + value: { base: '{colors.lightModeRed.600}', _dark: '{colors.darkModeRed.600}' }, + }, + }, + invert: { + value: { base: '{colors.darkModeBrown.1}', _dark: '{colors.lightModeBrown.1}' }, + }, + stacks: { + value: { base: '{colors.lightModeStacks}', _dark: '{colors.darkModeStacks}' }, + }, + success: { + background: { + value: { base: '{colors.lightModeGreen.100}', _dark: '{colors.darkModeGreen.100}' }, + }, + label: { + value: { base: '{colors.lightModeGreen.600}', _dark: '{colors.darkModeGreen.600}' }, + }, + }, + warning: { + background: { + value: { base: '{colors.lightModeYellow.100}', _dark: '{colors.darkModeYellow.100}' }, + }, + label: { + value: { base: '{colors.lightModeYellow.600}', _dark: '{colors.darkModeYellow.600}' }, + }, }, }, }); diff --git a/theme/tokens.ts b/theme/tokens.ts index 252ffee29ff..d378bb359da 100644 --- a/theme/tokens.ts +++ b/theme/tokens.ts @@ -4,14 +4,27 @@ import { colors } from './colors'; // ts-unused-exports:disable-next-line export const tokens = defineTokens({ + animations: { + spin: { + value: 'spin 1s linear infinite', + }, + }, sizes: { centeredPageFullWidth: { value: '500px' }, desktopViewportMinWidth: { value: '480px' }, + xs: { value: '12px' }, + sm: { value: '16px' }, + md: { value: '24px' }, + lg: { value: '30px' }, + xl: { value: '36px' }, }, radii: { + xs: { value: '8px' }, sm: { value: '10px' }, md: { value: '12px' }, lg: { value: '16px' }, + xl: { value: '20px' }, + xxl: { value: '24px' }, }, spacing: { // Numbers are padded with 0 to ensure they are sorted correctly in TS @@ -29,20 +42,19 @@ export const tokens = defineTokens({ 'space.09': { value: '64px', description: '64px' }, 'space.10': { value: '72px', description: '72px' }, 'space.11': { value: '128px', description: '128px' }, - - // Legacy spacing units - 'extra-tight': { value: '4px' }, - tight: { value: '8px' }, - 'base-tight': { value: '12px' }, - base: { value: '16px' }, - 'base-loose': { value: '20px' }, - loose: { value: '24px' }, - 'extra-loose': { value: '32px' }, }, colors, borders: { + action: { value: '1px solid {colors.accent.action-primary-default}' }, + active: { value: '2px solid {colors.accent.border-default}' }, + background: { value: '2px solid {colors.accent.background-primary}' }, + dashed: { value: '2px dashed {colors.accent.component-background-default}' }, default: { value: '1px solid {colors.accent.border-default}' }, - error: { value: '1px solid {colors.error}' }, - 'action-primary-default': { value: '1px solid {colors.accent.action-primary-default}' }, + error: { value: '1px solid {colors.error.label}' }, + focus: { value: '2px solid {colors.accent.action-primary-default}' }, + invert: { value: '1px solid {colors.invert}' }, + subdued: { value: '1px solid {colors.accent.text-subdued}' }, + warning: { value: '1px solid {colors.warning.label}' }, }, + transition: { value: 'all 0.2s cubic-bezier(0.23, 1, 0.32, 1)' }, }); diff --git a/theme/typography.ts b/theme/typography.ts index 27835a236b3..0c01d54946e 100644 --- a/theme/typography.ts +++ b/theme/typography.ts @@ -90,11 +90,20 @@ export const textStyles = defineTextStyles({ }, 'caption.02': { description: 'caption.02', - value: { ...commonDiatypeStyles, fontSize: '0.8125rem', lineHeight: '1.25rem' }, + value: { ...commonDiatypeStyles, fontSize: '0.8125rem', lineHeight: '1rem' }, }, - mono: { - description: 'mono', - value: { fontFamily: firaCode }, + 'mono.01': { + description: 'mono.01', + value: { + fontFamily: firaCode, + fontSize: '1rem', + lineHeight: '1.5rem', + letterSpacing: '.08rem', + }, + }, + 'mono.02': { + description: 'mono.02', + value: { fontFamily: firaCode, fontSize: '0.6rem', lineHeight: '1rem' }, }, }); diff --git a/webpack/webpack.config.base.js b/webpack/webpack.config.base.js index 35871201bc0..5bf12260d39 100755 --- a/webpack/webpack.config.base.js +++ b/webpack/webpack.config.base.js @@ -144,21 +144,8 @@ const config = { { test: /\.(ts|tsx)$/, exclude: /node_modules/, - // #4164 TODO investigate removing babel - use: { - loader: 'babel-loader', - options: { - presets: [ - '@babel/preset-typescript', - [ - '@babel/preset-react', - { - runtime: 'automatic', - }, - ], - ], - }, - }, + loader: 'esbuild-loader', + options: { tsconfig: './tsconfig.json', target: 'es2020' }, }, { test: /\.(png|jpe?g|gif)$/i, diff --git a/yarn.lock b/yarn.lock index ae1cc523e1c..b63d244cf94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,11 +16,12 @@ uuid "^8.3.2" "@actions/http-client@^2.0.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.1.1.tgz#a8e97699c315bed0ecaeaaeb640948470d4586a0" - integrity sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.0.tgz#f8239f375be6185fcd07765efdcf0031ad5df1a0" + integrity sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg== dependencies: tunnel "^0.0.6" + undici "^5.25.4" "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -64,9 +65,9 @@ "@apollo/utils.logger" "^2.0.0" "@apollo/server@^4.9.3": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.9.3.tgz#d51fa1745a7e9f3b1d687c6df40256744aaa977a" - integrity sha512-U56Sx/UmzR3Es344hQ/Ptf2EJrH+kV4ZPoLmgGjWoiwf2wYQ/pRSvkSXgjOvoyE34wSa8Gh7f92ljfLfY+6q1w== + version "4.9.5" + resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.9.5.tgz#388b3e00bef370fbdb89dd22d5a56127afaf87ba" + integrity sha512-eDBfArYbZaTm1AGa82M1aL7lOscVhnZsH85+OWmHMIR98qntzEjNpWpQPYDTru63Qxs4kHcY29NUx/kMGZfGEA== dependencies: "@apollo/cache-control-types" "^1.0.3" "@apollo/server-gateway-interface" "^1.1.1" @@ -177,45 +178,6 @@ resolved "https://registry.yarnpkg.com/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz#e72bc512582a6f26af150439f7eb7473b46ba874" integrity sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA== -"@ark-ui/react@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@ark-ui/react/-/react-0.9.0.tgz#4f510801be71ed195c888cd9368afe0d605ca59f" - integrity sha512-lg9Sl9/SfVG9pqyCwjSFldNFGKMrs6aoFG7J83fk2ha8XKcpFIMNZwn9Hc3qkzeKLIYGhtED8vYG8UeNTT5psw== - dependencies: - "@zag-js/accordion" "0.12.0" - "@zag-js/anatomy" "0.12.0" - "@zag-js/avatar" "0.12.0" - "@zag-js/carousel" "0.12.0" - "@zag-js/checkbox" "0.12.0" - "@zag-js/color-picker" "0.12.0" - "@zag-js/color-utils" "0.12.0" - "@zag-js/combobox" "0.12.0" - "@zag-js/date-picker" "0.12.0" - "@zag-js/date-utils" "0.12.0" - "@zag-js/dialog" "0.12.0" - "@zag-js/editable" "0.12.0" - "@zag-js/hover-card" "0.12.0" - "@zag-js/menu" "0.12.0" - "@zag-js/number-input" "0.12.0" - "@zag-js/pagination" "0.12.0" - "@zag-js/pin-input" "0.12.0" - "@zag-js/popover" "0.12.0" - "@zag-js/presence" "0.12.0" - "@zag-js/pressable" "0.12.0" - "@zag-js/radio-group" "0.12.0" - "@zag-js/range-slider" "0.12.0" - "@zag-js/rating-group" "0.12.0" - "@zag-js/react" "0.12.0" - "@zag-js/select" "0.12.0" - "@zag-js/slider" "0.12.0" - "@zag-js/splitter" "0.12.0" - "@zag-js/switch" "0.12.0" - "@zag-js/tabs" "0.12.0" - "@zag-js/tags-input" "0.12.0" - "@zag-js/toast" "0.12.0" - "@zag-js/tooltip" "0.12.0" - "@zag-js/types" "0.12.0" - "@astrojs/compiler@^1.0.1", "@astrojs/compiler@^1.4.2", "@astrojs/compiler@^1.6.3": version "1.8.2" resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-1.8.2.tgz#f305d5724c45a9932a8ef4e87b2e7227d15d1c2b" @@ -308,34 +270,34 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/code-frame@^8.0.0-alpha.2": - version "8.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-8.0.0-alpha.3.tgz#b645081f9b24c9f873d062f22bb5b4facf8707fa" - integrity sha512-RShalplAqggyZed6TXbcTtT8hNRWFs8t13SPLVV302qZ/Pw3b84SVaDSVee4/JD1HXytUGh73Wdd6S0AgthZ0Q== +"@babel/code-frame@^8.0.0-alpha.4": + version "8.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-8.0.0-alpha.4.tgz#d1deb7be4b01c6a79f7a0c0da99faff66fbeb81d" + integrity sha512-qU5ng/Qu1+LtDPpYx/mwSnnfROMTcsMC+C7jdMmmjPujZDmEP4cdm6QhXJzq/Dz/SgnYGVxmn4holOnrkELS1Q== dependencies: - "@babel/highlight" "^8.0.0-alpha.3" + "@babel/highlight" "^8.0.0-alpha.4" chalk "^5.3.0" "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== -"@babel/core@7.23.0", "@babel/core@>=7.0.0-0 <8.0.0", "@babel/core@^7.12.3", "@babel/core@^7.22.5": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== +"@babel/core@>=7.0.0-0 <8.0.0", "@babel/core@^7.12.3", "@babel/core@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/generator" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" - "@babel/parser" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.3" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -351,12 +313,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.22.5", "@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.22.5", "@babel/generator@^7.23.0", "@babel/generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" + integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -379,27 +341,12 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": +"@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -414,13 +361,6 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" @@ -428,10 +368,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -439,27 +379,11 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-plugin-utils@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -467,13 +391,6 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -491,23 +408,23 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-identifier@^8.0.0-alpha.3": - version "8.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-alpha.3.tgz#c12ce7c230b7554d72dd6a709b8870b7c1aa08dc" - integrity sha512-Yiljt3cW1ztluXzpdnrZHNFAmFFRkTHorHsUum0aEByBkxjvtCoTtTp9lVAif0ClVZV8eBkpRLbpvBxDaAeSOg== +"@babel/helper-validator-identifier@^8.0.0-alpha.4": + version "8.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-alpha.4.tgz#44ded699f5c349f9206c1ad39b24137208a15824" + integrity sha512-nbcDbkNVXaLNg5Q4fWLMlXrOmwIGkeED/lpqghIE2CAEH1A9MaC4pO5iY0nnhGW9csEeWLJYvMuenvHHuTcosQ== "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" + "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": @@ -519,58 +436,28 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^8.0.0-alpha.3": - version "8.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-8.0.0-alpha.3.tgz#f5cb96926eb76f864773b35b8b5ea4e011fcd4a3" - integrity sha512-qgL4V6agGH78BmXrw5cOfrSzFIJkcniGQ2FmSLHMU2K3NLZAt3J+Q6lEnHFuOxBot/bVYMAg+26drUOdrYj6KQ== +"@babel/highlight@^8.0.0-alpha.4": + version "8.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-8.0.0-alpha.4.tgz#47ea8b569363ddc7d9cdf846634c56967a1f059f" + integrity sha512-h4zy87rWZYXLJ34Td7RCOGKAZfSs9bAE5BM/tWMk6PEMLsAp2/QRtTobFBYJBt8xj34/KSGUn6tg6niX4T+DkQ== dependencies: - "@babel/helper-validator-identifier" "^8.0.0-alpha.3" + "@babel/helper-validator-identifier" "^8.0.0-alpha.4" chalk "^5.3.0" js-tokens "^8.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.22.15", "@babel/parser@^7.22.5", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.5", "@babel/parser@^7.23.0", "@babel/parser@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" + integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== "@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== - dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.17.12", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx@^7.17.12", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== @@ -581,47 +468,6 @@ "@babel/plugin-syntax-jsx" "^7.22.5" "@babel/types" "^7.22.15" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typescript@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" - integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" - -"@babel/preset-react@7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" - integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.15" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" - -"@babel/preset-typescript@7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" - integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-typescript" "^7.22.15" - "@babel/runtime@7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" @@ -629,14 +475,7 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.22.11", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.13.10": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.11", "@babel/runtime@^7.23.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -668,19 +507,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.22.5", "@babel/traverse@^7.23.0", "@babel/traverse@^7.4.5": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== +"@babel/traverse@^7.22.5", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3", "@babel/traverse@^7.4.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" + integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== dependencies: "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/generator" "^7.23.3" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.23.3" + "@babel/types" "^7.23.3" debug "^4.1.0" globals "^11.1.0" @@ -692,19 +531,19 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" + integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bitcoinerlab/descriptors@^1.0.2": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@bitcoinerlab/descriptors/-/descriptors-1.1.1.tgz#0d1a828cea66c51ebc9863d3e5c43c4ffcde2fe5" - integrity sha512-AMFkbBBg9T1iWtEmWB23oADk7zaOQix6wUPLXalhTyFDjhkFXDd6pCRfto/HAdaPg/ccM4GMTVgYLee9WdYFyQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@bitcoinerlab/descriptors/-/descriptors-1.0.2.tgz#684e5755afcc7171b73a263612e00dc7dc407dcc" + integrity sha512-q/0NuNlIof5Hb+ll/diU6Ib7GJ1MLwYUDTE6s/Ui4//r28LtxRPjI12/tYaMLWgTmpfuxcEnZI7+6aNFeS1EXg== dependencies: "@bitcoinerlab/miniscript" "^1.2.1" "@bitcoinerlab/secp256k1" "^1.0.5" @@ -713,9 +552,9 @@ ecpair "^2.1.0" "@bitcoinerlab/miniscript@^1.2.1": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@bitcoinerlab/miniscript/-/miniscript-1.4.0.tgz#9beda21d4dadb1cb806de6f846470927cfd96f6c" - integrity sha512-BsG3dmwQmgKHnRZecDgUsPjwcpnf1wgaZbolcMTByS10k1zYzIx97W51LzG7GvokRJ+wnzTX/GhC8Y3L2X0CQA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@bitcoinerlab/miniscript/-/miniscript-1.2.1.tgz#63983d2f5d43faf132f2b0ce90cbc88737275c2b" + integrity sha512-2Pkan4Vvq7afQNeveakFM/Np9D+DhlPtKITO/hTgKjPsPnLWqdOVyja1u/Qhr7Voi2bW9Tor6hLOYTw84QQKQQ== dependencies: bip68 "^1.0.4" @@ -735,11 +574,6 @@ "@noble/hashes" "^1.1.5" "@noble/secp256k1" "^1.7.1" -"@blockstack/stacks-blockchain-api-types@^0.53.1": - version "0.53.5" - resolved "https://registry.yarnpkg.com/@blockstack/stacks-blockchain-api-types/-/stacks-blockchain-api-types-0.53.5.tgz#db7d69d5e106f6e96806b9930c8b7485c497412a" - integrity sha512-bTVH8iFzIoqdnZCJ+lwV/KsUz2KbrQ5Rn9jfckicqivOdphV6XcKsLoXDKo2N6uepnTePrZxXT2TjrNkYwFpfw== - "@blockstack/stacks-transactions@0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@blockstack/stacks-transactions/-/stacks-transactions-0.7.0.tgz#c587f69879b1903bada87769f1d6d1217479336a" @@ -793,7 +627,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/cascade-layer-name-parser@^1.0.4", "@csstools/cascade-layer-name-parser@^1.0.5": +"@csstools/cascade-layer-name-parser@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.5.tgz#c4d276e32787651df0007af22c9fa70d9c9ca3c2" integrity sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg== @@ -808,56 +642,56 @@ resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-1.1.4.tgz#70bf4c5b379cdc256d3936bf4a21e3a3454a3d68" integrity sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg== -"@csstools/css-color-parser@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-1.3.2.tgz#ec6ac35e24a34e1f37eb3d366a2ea637bcc7c7e5" - integrity sha512-YLCWI+nm18qr5nj7QhRMGuIi4ddFe0SKEtPQliLf1+pmyHFxoHYd0+Hg+bRnbnVbdyCTTlCqBiUvCeNJfd903g== +"@csstools/css-color-parser@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-1.4.0.tgz#c8517457dcb6ad080848b1583aa029ab61221ce8" + integrity sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA== dependencies: "@csstools/color-helpers" "^3.0.2" "@csstools/css-calc" "^1.1.4" -"@csstools/css-parser-algorithms@^2.3.1", "@csstools/css-parser-algorithms@^2.3.2": +"@csstools/css-parser-algorithms@^2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== -"@csstools/css-tokenizer@^2.2.0", "@csstools/css-tokenizer@^2.2.1": +"@csstools/css-tokenizer@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== -"@csstools/media-query-list-parser@^2.1.4", "@csstools/media-query-list-parser@^2.1.5": +"@csstools/media-query-list-parser@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== "@csstools/postcss-cascade-layers@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.0.tgz#21f8556de640f9f9ccfb950c49a886280fe5497e" - integrity sha512-dVPVVqQG0FixjM9CG/+8eHTsCAxRKqmNh6H69IpruolPlnEF1611f2AoLK8TijTSAsqBSclKd4WHs1KUb/LdJw== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.1.tgz#43d12cb0ffe9ab461bc41143dc554c6e1cb633e6" + integrity sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg== dependencies: "@csstools/selector-specificity" "^3.0.0" postcss-selector-parser "^6.0.13" "@csstools/postcss-color-function@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-3.0.5.tgz#4f50b7e71869fcd4499d4235e23127b579da73b1" - integrity sha512-q9E7oJwf1Z8nJqQbob9DmFxrte3RQc+pwV+5WlWw6Ei9XaObaNJlPAQ1HfOpcEg/fxrRf/Yf6fgO8Q01r7u17A== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-3.0.7.tgz#646b0c3e3805e4bb9c1e240bce807f1cc6ccdfea" + integrity sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" "@csstools/postcss-color-mix-function@^2.0.4": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.5.tgz#589fea3346fc985cdfa49a1fdc12c28125def985" - integrity sha512-0MDBTG0FPDjNlAYMImNjnQ9lrldiFRCmsBx4dZB1ikbFwt6aYJRWDjgXoZY+1CmQ6m1qPeBJO762i6AKwQDlQQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.7.tgz#0fc9b638bd6b9578a52a50e3af66109ae52dc2b6" + integrity sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" "@csstools/postcss-exponential-functions@^1.0.0": version "1.0.1" @@ -876,30 +710,30 @@ postcss-value-parser "^4.2.0" "@csstools/postcss-gradients-interpolation-method@^4.0.4": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.5.tgz#aeb9cb87df28247aeda706ac7d650335e24294b2" - integrity sha512-ABDOADpKrTvNb+cUBj9ciocCgFvE832eENKVuONca1u2bkFL4jM9430XFmi/GOgzt0agg5Q8FFJHXgYyKbgOFQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.7.tgz#e5c2628157fb9dea9aa8cd9c84fdcc2a842af91b" + integrity sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" "@csstools/postcss-hwb-function@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.4.tgz#431d2fe3af0956a5f0f52b71126a872e04bb39df" - integrity sha512-HxyOVYowL0wsz7BjlAyGu3ydPGliXHgVnXP4pOWFktkAaBvjks8S51NqMbR6AkBQHB9W4nt9KW2qB6Qt2PJ80A== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.6.tgz#7d56583c6c8607352718a802f87e51edf4f9365e" + integrity sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" "@csstools/postcss-ic-unit@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.1.tgz#9d4964fe9da11f51463e0a141b3184ee3a23acb8" - integrity sha512-OkKZV0XZQixChA6r68O9UfGNFv06cPVcuT+MjpzfEuoCfbNWCj+b0dhsmdz776giQ+DymPmFDlTD+QJEFPI7rw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.2.tgz#08b62de51a3636ba40ba8e77cef4619a6e636aac" + integrity sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg== dependencies: - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" postcss-value-parser "^4.2.0" "@csstools/postcss-initial@^1.0.0": @@ -908,9 +742,9 @@ integrity sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA== "@csstools/postcss-is-pseudo-class@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.2.tgz#c896e25baf0a5249eb5c5e8cce78dfc0cc11380e" - integrity sha512-LeAJozyZTY3c1SaHMbwF4p8Ego/2HHprYusmmdmUH7wP6lRF1w3s7IO2iNwQ6fHBrSOfkPUFaUtRUGZLBE23Eg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.3.tgz#d8b04ff5eefb1a9bc8f1ab99b8f3b6b04b704480" + integrity sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q== dependencies: "@csstools/selector-specificity" "^3.0.0" postcss-selector-parser "^6.0.13" @@ -968,31 +802,31 @@ postcss-value-parser "^4.2.0" "@csstools/postcss-oklab-function@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.5.tgz#8a299198a2c3b6698677b1b9b19cde4f85b95e0e" - integrity sha512-tFjYaBbAvoks5yvE9uA3b3xsqVKkZJ2sXwPMw1bxlv2ydrmdiojuoRAskRfvMbZQkzp47DzBP1V9GhDLOyFVYA== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.7.tgz#4daff9e85b7f68ea744f2898f73e81d6fe47c0d7" + integrity sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" -"@csstools/postcss-progressive-custom-properties@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.0.1.tgz#15251d880d60850df42deeb7702aab6c50ab74e7" - integrity sha512-yfdEk8o3CWPTusoInmGpOVCcMg1FikcKZyYB5ApULg9mES4FTGNuHK3MESscmm64yladcLNkPlz26O7tk3LMbA== +"@csstools/postcss-progressive-custom-properties@^3.0.1", "@csstools/postcss-progressive-custom-properties@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.0.2.tgz#0c18152160a425950cb69a12a9add55af4f688e7" + integrity sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw== dependencies: postcss-value-parser "^4.2.0" "@csstools/postcss-relative-color-syntax@^2.0.4": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.5.tgz#6ab9f87e6a748ac66e7e6adea179486222c685d5" - integrity sha512-wK8IX6X2+kLKxTTTq5yd7mH2U+GPcTMTpP2rM8ig0/rgxuid7vgTOxup6heZUk1IUA409eak3bYGOtDDYCpxbQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.7.tgz#1d017aa25e3cda513cf00401a91899e9d3b83659" + integrity sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" "@csstools/postcss-scope-pseudo-class@^3.0.0": version "3.0.0" @@ -1065,25 +899,25 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@dlc-link/dlc-tools@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@dlc-link/dlc-tools/-/dlc-tools-1.0.4.tgz#0b312a130d1cee4fa3e53e0815968b2fd0bfa91b" - integrity sha512-hjwZH2xRmnfIz9zJ7C4EV4cDs8Fu7SOmUcr8aBuzVvwOo23DDu0qYuuCOClICiWHUNUhhWMK+gdQgU8LVdhbuQ== +"@dlc-link/dlc-tools@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@dlc-link/dlc-tools/-/dlc-tools-1.0.7.tgz#4c3e779720a8aa29a6b6b7ba16ea4e904366879c" + integrity sha512-lOdYed8hoHK9k62EWT7rQ/+U6RyKiqS0VzhWg8zdP0VEI//WxRBIY4FeYfBKK+UlWSHUh23PPS3g3Yv8XLOWtw== -"@dnd-kit/accessibility@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.0.1.tgz#3ccbefdfca595b0a23a5dc57d3de96bc6935641c" - integrity sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg== +"@dnd-kit/accessibility@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz#1054e19be276b5f1154ced7947fc0cb5d99192e0" + integrity sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ== dependencies: tslib "^2.0.0" "@dnd-kit/core@^6.0.8": - version "6.0.8" - resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.0.8.tgz#040ae13fea9787ee078e5f0361f3b49b07f3f005" - integrity sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.1.0.tgz#e81a3d10d9eca5d3b01cbf054171273a3fe01def" + integrity sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg== dependencies: - "@dnd-kit/accessibility" "^3.0.0" - "@dnd-kit/utilities" "^3.2.1" + "@dnd-kit/accessibility" "^3.1.0" + "@dnd-kit/utilities" "^3.2.2" tslib "^2.0.0" "@dnd-kit/modifiers@^6.0.1": @@ -1102,10 +936,10 @@ "@dnd-kit/utilities" "^3.2.0" tslib "^2.0.0" -"@dnd-kit/utilities@^3.2.0", "@dnd-kit/utilities@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.1.tgz#53f9e2016fd2506ec49e404c289392cfff30332a" - integrity sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA== +"@dnd-kit/utilities@^3.2.0", "@dnd-kit/utilities@^3.2.1", "@dnd-kit/utilities@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz#5a32b6af356dc5f74d61b37d6f7129a4040ced7b" + integrity sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg== dependencies: tslib "^2.0.0" @@ -1176,13 +1010,6 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@^0.8.1": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - "@emotion/is-prop-valid@^1.1.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" @@ -1190,16 +1017,6 @@ dependencies: "@emotion/memoize" "^0.8.1" -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/memoize@^0.7.1": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" @@ -1275,10 +1092,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz#74752a09301b8c6b9a415fbda9fb71406a62a7b7" - integrity sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg== +"@esbuild/android-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" + integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== + +"@esbuild/android-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.7.tgz#646156aea43e8e6723de6e94a4ac07c5aed41be1" + integrity sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w== "@esbuild/android-arm@0.17.19": version "0.17.19" @@ -1290,10 +1112,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.4.tgz#c27363e1e280e577d9b5c8fa7c7a3be2a8d79bf5" - integrity sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ== +"@esbuild/android-arm@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" + integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== + +"@esbuild/android-arm@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz#0827b49aed813c33ea18ee257c1728cdc4a01030" + integrity sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww== "@esbuild/android-x64@0.17.19": version "0.17.19" @@ -1305,10 +1132,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.4.tgz#6c9ee03d1488973d928618100048b75b147e0426" - integrity sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g== +"@esbuild/android-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" + integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== + +"@esbuild/android-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.7.tgz#fa294ed5214d88219d519e0ab1bbb0253a89b864" + integrity sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw== "@esbuild/darwin-arm64@0.17.19": version "0.17.19" @@ -1320,10 +1152,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz#64e2ee945e5932cd49812caa80e8896e937e2f8b" - integrity sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA== +"@esbuild/darwin-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" + integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== + +"@esbuild/darwin-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.7.tgz#e24d2ed545749ff251eabe8bce11fefa688892d3" + integrity sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw== "@esbuild/darwin-x64@0.17.19": version "0.17.19" @@ -1335,10 +1172,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz#d8e26e1b965df284692e4d1263ba69a49b39ac7a" - integrity sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw== +"@esbuild/darwin-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" + integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== + +"@esbuild/darwin-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.7.tgz#02d1f8a572874c90d8f55dde8a859e5145bd06f6" + integrity sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ== "@esbuild/freebsd-arm64@0.17.19": version "0.17.19" @@ -1350,10 +1192,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz#29751a41b242e0a456d89713b228f1da4f45582f" - integrity sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ== +"@esbuild/freebsd-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" + integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== + +"@esbuild/freebsd-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.7.tgz#bc6a69b9a7915da278f0a5ebaec069c813982c22" + integrity sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ== "@esbuild/freebsd-x64@0.17.19": version "0.17.19" @@ -1365,10 +1212,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz#873edc0f73e83a82432460ea59bf568c1e90b268" - integrity sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw== +"@esbuild/freebsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" + integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== + +"@esbuild/freebsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.7.tgz#ec3708488625d70e565968ceea1355e7c8613865" + integrity sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA== "@esbuild/linux-arm64@0.17.19": version "0.17.19" @@ -1380,10 +1232,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz#659f2fa988d448dbf5010b5cc583be757cc1b914" - integrity sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA== +"@esbuild/linux-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" + integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== + +"@esbuild/linux-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.7.tgz#8e04b66c306858f92d4f90f8222775270755e88a" + integrity sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g== "@esbuild/linux-arm@0.17.19": version "0.17.19" @@ -1395,10 +1252,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz#d5b13a7ec1f1c655ce05c8d319b3950797baee55" - integrity sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg== +"@esbuild/linux-arm@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" + integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== + +"@esbuild/linux-arm@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.7.tgz#12d5b65e089029ee1fe4c591b60969c9b1a85355" + integrity sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww== "@esbuild/linux-ia32@0.17.19": version "0.17.19" @@ -1410,10 +1272,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz#878cd8bf24c9847c77acdb5dd1b2ef6e4fa27a82" - integrity sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ== +"@esbuild/linux-ia32@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" + integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== + +"@esbuild/linux-ia32@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.7.tgz#01eabc2a3ad9039e115db650268e4f48f910dbe2" + integrity sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g== "@esbuild/linux-loong64@0.17.19": version "0.17.19" @@ -1425,10 +1292,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz#df890499f6e566b7de3aa2361be6df2b8d5fa015" - integrity sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg== +"@esbuild/linux-loong64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" + integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== + +"@esbuild/linux-loong64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.7.tgz#70681113632970e6a5766607bbdb98aa18cf4d5f" + integrity sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw== "@esbuild/linux-mips64el@0.17.19": version "0.17.19" @@ -1440,10 +1312,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz#76eae4e88d2ce9f4f1b457e93892e802851b6807" - integrity sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw== +"@esbuild/linux-mips64el@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" + integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== + +"@esbuild/linux-mips64el@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.7.tgz#f63c022a71a3d70c482d1943a27cb8997021e230" + integrity sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w== "@esbuild/linux-ppc64@0.17.19": version "0.17.19" @@ -1455,10 +1332,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz#c49032f4abbcfa3f747b543a106931fe3dce41ff" - integrity sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw== +"@esbuild/linux-ppc64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" + integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== + +"@esbuild/linux-ppc64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.7.tgz#614eafd08b0c50212f287b948b3c08d6e60f221f" + integrity sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ== "@esbuild/linux-riscv64@0.17.19": version "0.17.19" @@ -1470,10 +1352,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz#0f815a090772138503ee0465a747e16865bf94b1" - integrity sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig== +"@esbuild/linux-riscv64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" + integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== + +"@esbuild/linux-riscv64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.7.tgz#31d3b63f92f65968268a8e61ba59872538e80e88" + integrity sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw== "@esbuild/linux-s390x@0.17.19": version "0.17.19" @@ -1485,10 +1372,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz#8d2cca20cd4e7c311fde8701d9f1042664f8b92b" - integrity sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg== +"@esbuild/linux-s390x@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" + integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== + +"@esbuild/linux-s390x@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.7.tgz#be94974e0caa0783ae05f9477fd7170b9ac29cb0" + integrity sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg== "@esbuild/linux-x64@0.17.19": version "0.17.19" @@ -1500,10 +1392,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz#f618bec2655de49bff91c588777e37b5e3169d4a" - integrity sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg== +"@esbuild/linux-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" + integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== + +"@esbuild/linux-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.7.tgz#84e8018a913dd4ecee954623e395984aef3d0007" + integrity sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ== "@esbuild/netbsd-x64@0.17.19": version "0.17.19" @@ -1515,10 +1412,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz#7889744ca4d60f1538d62382b95e90a49687cef2" - integrity sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A== +"@esbuild/netbsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" + integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== + +"@esbuild/netbsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.7.tgz#98898ba8800374c9df9bb182ca4f69fcecaf4411" + integrity sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ== "@esbuild/openbsd-x64@0.17.19": version "0.17.19" @@ -1530,10 +1432,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz#c3e436eb9271a423d2e8436fcb120e3fd90e2b01" - integrity sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw== +"@esbuild/openbsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" + integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== + +"@esbuild/openbsd-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.7.tgz#46dc4eda2adb51f16361b1ad10e9b3f4938c4573" + integrity sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ== "@esbuild/sunos-x64@0.17.19": version "0.17.19" @@ -1545,10 +1452,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz#f63f5841ba8c8c1a1c840d073afc99b53e8ce740" - integrity sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw== +"@esbuild/sunos-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" + integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== + +"@esbuild/sunos-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.7.tgz#1650d40dd88412ecc11490119cd23cbaf661a591" + integrity sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw== "@esbuild/win32-arm64@0.17.19": version "0.17.19" @@ -1560,10 +1472,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz#80be69cec92da4da7781cf7a8351b95cc5a236b0" - integrity sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w== +"@esbuild/win32-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" + integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== + +"@esbuild/win32-arm64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.7.tgz#e61de6c4eb204d83fd912f3ae6812cc8c7d32d25" + integrity sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw== "@esbuild/win32-ia32@0.17.19": version "0.17.19" @@ -1575,10 +1492,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz#15dc0ed83d2794872b05d8edc4a358fecf97eb54" - integrity sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg== +"@esbuild/win32-ia32@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" + integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== + +"@esbuild/win32-ia32@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.7.tgz#3d9c159d42c67e37a433e44ef8217c661cb6f6d0" + integrity sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A== "@esbuild/win32-x64@0.17.19": version "0.17.19" @@ -1590,10 +1512,15 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz#d46a6e220a717f31f39ae80f49477cc3220be0f0" - integrity sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA== +"@esbuild/win32-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" + integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== + +"@esbuild/win32-x64@0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz#02c4446f802706098d8e6ee70cf2b7aba96ded0b" + integrity sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1603,14 +1530,14 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz#7ccb5f58703fa61ffdcbf39e2c604a109e781162" - integrity sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1627,20 +1554,18 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== -"@floating-ui/core@^1.3.1", "@floating-ui/core@^1.4.2": +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@floating-ui/core@^1.4.2": version "1.5.0" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== dependencies: "@floating-ui/utils" "^0.1.3" -"@floating-ui/dom@1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.4.tgz#cf859dde33995a4e7b6ded16c98cb73b2ebfffd0" - integrity sha512-21hhDEPOiWkGp0Ys4Wi6Neriah7HweToKra626CIK712B5m9qkdz54OP9gVldUg+URnBTpv/j/bi/skmGdstXQ== - dependencies: - "@floating-ui/core" "^1.3.1" - "@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.5.1": version "1.5.3" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" @@ -1650,9 +1575,9 @@ "@floating-ui/utils" "^0.1.3" "@floating-ui/react-dom@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" - integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" + integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== dependencies: "@floating-ui/dom" "^1.5.1" @@ -1666,45 +1591,6 @@ resolved "https://registry.yarnpkg.com/@fluent/syntax/-/syntax-0.19.0.tgz#43f882faba6908b0f1013f6a94e009d0dfbdcb77" integrity sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ== -"@formatjs/ecma402-abstract@1.17.2": - version "1.17.2" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz#d197c6e26b9fd96ff7ba3b3a0cc2f25f1f2dcac3" - integrity sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg== - dependencies: - "@formatjs/intl-localematcher" "0.4.2" - tslib "^2.4.0" - -"@formatjs/fast-memoize@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" - integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== - dependencies: - tslib "^2.4.0" - -"@formatjs/icu-messageformat-parser@2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.2.tgz#9bbb29099416e4ce2c7df50029c48985d4f901b3" - integrity sha512-nF/Iww7sc5h+1MBCDRm68qpHTCG4xvGzYs/x9HFcDETSGScaJ1Fcadk5U/NXjXeCtzD+DhN4BAwKFVclHfKMdA== - dependencies: - "@formatjs/ecma402-abstract" "1.17.2" - "@formatjs/icu-skeleton-parser" "1.6.2" - tslib "^2.4.0" - -"@formatjs/icu-skeleton-parser@1.6.2": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz#00303034dc08583973c8aa67b96534c49c0bad8d" - integrity sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA== - dependencies: - "@formatjs/ecma402-abstract" "1.17.2" - tslib "^2.4.0" - -"@formatjs/intl-localematcher@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz#7e6e596dbaf2f0c5a7c22da5a01d5c55f4c37e9a" - integrity sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA== - dependencies: - tslib "^2.4.0" - "@fungible-systems/zone-file@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@fungible-systems/zone-file/-/zone-file-2.0.0.tgz#ab19e9d9efba573680e8e9b536b3b7b399ef35f5" @@ -1754,11 +1640,11 @@ isomorphic-fetch "^3.0.0" "@humanwhocodes/config-array@^0.11.10": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -1767,39 +1653,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@internationalized/date@^3.3.0", "@internationalized/date@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.0.tgz#67f1dd62355f05140cc80e324842e9bfb4553abe" - integrity sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ== - dependencies: - "@swc/helpers" "^0.5.0" - -"@internationalized/message@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.1.tgz#0f29c5a239b5dcd457b55f21dcd38d1a44a1236a" - integrity sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw== - dependencies: - "@swc/helpers" "^0.5.0" - intl-messageformat "^10.1.0" - -"@internationalized/number@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.2.1.tgz#570e4010544a84a8225e65b34a689a36187caaa8" - integrity sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg== - dependencies: - "@swc/helpers" "^0.5.0" - -"@internationalized/string@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.1.1.tgz#2ab7372d58bbb7ffd3de62fc2a311e4690186981" - integrity sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA== - dependencies: - "@swc/helpers" "^0.5.0" +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1871,9 +1728,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1886,20 +1743,20 @@ "@trivago/prettier-plugin-sort-imports" "^4.2.0" prettier "^3.0.3" -"@ledgerhq/devices@^8.0.7": - version "8.0.7" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.0.7.tgz#206434dbd8a097529bbfc95f5eef94c2923c7578" - integrity sha512-BbPyET52lXnVs7CxJWrGYqmtGdbGzj+XnfCqLsDnA7QYr1CZREysxmie+Rr6BKpNDBRVesAovXjtaVaZOn+upw== +"@ledgerhq/devices@^8.0.7", "@ledgerhq/devices@^8.0.8": + version "8.0.8" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.0.8.tgz#cd233eb54a044913160c9183be9fb22adae4e071" + integrity sha512-0j7E8DY2jeSSATc8IJk+tXDZ9u+Z7tXxB8I4TzXrfV/8A5exMh/K1IwX6Jt1zlw1wre4CT9MV4mzUs3M/TE7lg== dependencies: - "@ledgerhq/errors" "^6.14.0" - "@ledgerhq/logs" "^6.10.1" - rxjs "6" + "@ledgerhq/errors" "^6.15.0" + "@ledgerhq/logs" "^6.11.0" + rxjs "^7.8.1" semver "^7.3.5" -"@ledgerhq/errors@^6.14.0": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.14.0.tgz#0bf253983773ef12eebce2091f463bc719223b37" - integrity sha512-ZWJw2Ti6Dq1Ott/+qYqJdDWeZm16qI3VNG5rFlb0TQ3UcAyLIQZbnnzzdcVVwVeZiEp66WIpINd/pBdqsHVyOA== +"@ledgerhq/errors@^6.14.0", "@ledgerhq/errors@^6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.15.0.tgz#45cda73915f695cc072cb8a99650830bc5dc6668" + integrity sha512-6xaw5/mgoht62TnL3rXsaQYEFwpnXyNDk1AOSJksIjFHx9bHUnkyVmrnGQDj0JLzi+E7bHEgTrpCs8wpeDh9jA== "@ledgerhq/hw-transport-webusb@6.27.19": version "6.27.19" @@ -1912,18 +1769,19 @@ "@ledgerhq/logs" "^6.10.1" "@ledgerhq/hw-transport@^6.20.0", "@ledgerhq/hw-transport@^6.28.1", "@ledgerhq/hw-transport@^6.28.8": - version "6.28.8" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.28.8.tgz#f99a5c71c5c09591e9bfb1b970c42aafbe81351f" - integrity sha512-XxQVl4htd018u/M66r0iu5nlHi+J6QfdPsORzDF6N39jaz+tMqItb7tUlXM/isggcuS5lc7GJo7NOuJ8rvHZaQ== + version "6.29.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.29.0.tgz#2b85f39d90b093930f0c7bfc513b29eb47ba97fa" + integrity sha512-WQfzxt3EnnbOmzZVYiCgSmNsqafBOFQn40awvUPY2IZviJRs23/1ANPHAo76bzPV88+Qk0+1wZlcnIanGN6fFA== dependencies: - "@ledgerhq/devices" "^8.0.7" - "@ledgerhq/errors" "^6.14.0" + "@ledgerhq/devices" "^8.0.8" + "@ledgerhq/errors" "^6.15.0" + "@ledgerhq/logs" "^6.11.0" events "^3.3.0" -"@ledgerhq/logs@^6.10.1": - version "6.10.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.1.tgz#5bd16082261d7364eabb511c788f00937dac588d" - integrity sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w== +"@ledgerhq/logs@^6.10.1", "@ledgerhq/logs@^6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.11.0.tgz#0d28e7edcf71548506f4304686cba480ba91bbcf" + integrity sha512-HHK9y4GGe4X7CXbRUCh7z8Mp+WggpJn1dmUjmuk1rNugESF6o8nAOnXA+BxwtRRNV3CgNJR3Wxdos4J9qV0Zsg== "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" @@ -2032,9 +1890,9 @@ rimraf "^3.0.2" "@octokit/openapi-types@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.0.tgz#0101bf62ab14c1946149a0f8385440963e1253c4" - integrity sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw== + version "19.0.2" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.2.tgz#d72778fe2f6151314b6f0201fbc771bb741276fc" + integrity sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ== "@octokit/types@12.0.0": version "12.0.0" @@ -2043,32 +1901,32 @@ dependencies: "@octokit/openapi-types" "^19.0.0" -"@pandacss/config@0.17.0", "@pandacss/config@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/config/-/config-0.17.0.tgz#623b4571844d820ab470bcc8c8554814e13fd459" - integrity sha512-f9/Rf558fATbjRP+A/G90wTCCnJfyEbUNpjy1C7ZKtTLGSSR78qXdcRNltQMa0PvRfqWEAa6bw2xpxAGDofeYA== +"@pandacss/config@0.18.3", "@pandacss/config@^0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/config/-/config-0.18.3.tgz#331886355ce670bf2ae72633de9b9cf662f4f59a" + integrity sha512-EQZV/x2CcncotJcJHnyQdKlEWNjUUPqAMvVYvaA5l7IpFCY0T94t4MJY4YbvBTMDiN3WgluAqr7Il9dDy1hDtw== dependencies: - "@pandacss/error" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/preset-base" "0.17.0" - "@pandacss/preset-panda" "0.17.0" - "@pandacss/types" "0.17.0" + "@pandacss/error" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/preset-base" "0.18.3" + "@pandacss/preset-panda" "0.18.3" + "@pandacss/types" "0.18.3" bundle-n-require "^1.0.1" escalade "3.1.1" jiti "^1.19.1" merge-anything "^5.1.7" typescript "^5.2.2" -"@pandacss/core@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/core/-/core-0.17.0.tgz#57c0f753640e3b537a3487ba063fb74df8d6ff64" - integrity sha512-eCdc+dbgjZiCZ3T99nx3CId8goAUmuEGuRTI6gDidFknJCMfNAYIavI2rPdfZbJe8mZt4XsmaKSRcJHoQ73IoQ== +"@pandacss/core@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/core/-/core-0.18.3.tgz#adcf1e668330a9d7dbe290ef34900bae6a08d978" + integrity sha512-oPr4/3rl+824vU/wRrN/U+RlwcuraeoFvGtvI+DmViLsGi/Gur5CPM24Orz37elB5scr9OohpnszPDWeu1bxwg== dependencies: - "@pandacss/error" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/token-dictionary" "0.17.0" - "@pandacss/types" "0.17.0" + "@pandacss/error" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/token-dictionary" "0.18.3" + "@pandacss/types" "0.18.3" autoprefixer "10.4.15" hookable "5.5.3" lodash.merge "4.6.2" @@ -2082,52 +1940,50 @@ postcss-selector-parser "^6.0.13" ts-pattern "5.0.5" -"@pandacss/dev@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/dev/-/dev-0.17.0.tgz#4440a23bac057b471c59ef763478693c7cd83517" - integrity sha512-b94jtf8nMgDIxnHEXvXwrHSGlPrZLl4E17fIfat2P29JkGmBbnT9qbKg9wk3f8KlQdzHpbVuKkgnrvnGCZI9Ow== +"@pandacss/dev@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/dev/-/dev-0.18.3.tgz#5d86336bf5e85090b563ed97584ed1ec1cf6f30b" + integrity sha512-YEesW9kQH2ua9MjkJjACjBqAS2yzTBtb+QYOSHkArpGEU20oISP/lcMBWrfl8ZIH94sFHv7lfifbdYrW8KPhHA== dependencies: "@clack/prompts" "^0.6.3" - "@pandacss/config" "0.17.0" - "@pandacss/error" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/node" "0.17.0" - "@pandacss/postcss" "0.17.0" - "@pandacss/preset-panda" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/studio" "0.17.0" - "@pandacss/token-dictionary" "0.17.0" - "@pandacss/types" "0.17.0" + "@pandacss/config" "0.18.3" + "@pandacss/error" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/node" "0.18.3" + "@pandacss/postcss" "0.18.3" + "@pandacss/preset-panda" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/studio" "0.18.3" + "@pandacss/token-dictionary" "0.18.3" + "@pandacss/types" "0.18.3" cac "6.7.14" pathe "1.1.1" perfect-debounce "^1.0.0" -"@pandacss/error@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/error/-/error-0.17.0.tgz#15c7209254f040cfd740af0a563c7af52b76ba4c" - integrity sha512-qnaqWr7uaReJYrdP6/gxIF3Aka2WMfxoRTpuXVPop30VwWUbmzH9Ns7c5ry0dr6vZNTFfubMnPQt5e8U3wEEOQ== +"@pandacss/error@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/error/-/error-0.18.3.tgz#111eef249746b08c877b00c0bba67962ac419b0a" + integrity sha512-yHI9Ut/8NbGOO3K+BBGZukumx7ms+iU061zrAEvFMePRDuLgNbaiPpqm8VZM5eefW/Ob6rOSpY07+2V2D2Xq9Q== -"@pandacss/extractor@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/extractor/-/extractor-0.17.0.tgz#4500764a00fe204f1063b118592d85021fc5ddd8" - integrity sha512-Y8f2bM8vFtOCb9H3CC7Tt7HtrLWZkXo3oq7reowYBSCAdnRUrBcP4JqfdW/xLwr/vPOOQxZuhjhlQZx2OB+gsQ== +"@pandacss/extractor@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/extractor/-/extractor-0.18.3.tgz#98c7daedaa5825eb9708c57ac7e0029dfa8e1ca6" + integrity sha512-qpup3hvjrwJQt4eAmDGG1EmExbY2A0181OTfJGpqt1bSP02Pffpcpi0cpVb/c9FoNNs/zeeH1GwPXu1Z8Kyilg== dependencies: - lil-fp "1.4.5" ts-evaluator "^1.1.0" ts-morph "19.0.0" - ts-pattern "5.0.5" -"@pandacss/generator@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/generator/-/generator-0.17.0.tgz#457e07236c677ac3537d66e49f7579c5c0611b30" - integrity sha512-jH3D1CSCwDuHDOKRIVp9YE/J0y/qx+xKTW5LGrYxjXMqFdzwnwGOc6mWp3lc1X8ff/lNqGeo5V7z2z4gwbz77Q== - dependencies: - "@pandacss/core" "0.17.0" - "@pandacss/is-valid-prop" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/token-dictionary" "0.17.0" - "@pandacss/types" "0.17.0" +"@pandacss/generator@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/generator/-/generator-0.18.3.tgz#6434cdb6b7cf726ce7d7d8c5f1f7b44c8c87b515" + integrity sha512-LdpDpsZBIK8lQRN8LK+4kNT3hw+oQF00CyJUPKjv6+0KVCMoGGU4fir4kaASNDjiKu0ZmoUPlkATX3w0KKXR2A== + dependencies: + "@pandacss/core" "0.18.3" + "@pandacss/is-valid-prop" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/token-dictionary" "0.18.3" + "@pandacss/types" "0.18.3" javascript-stringify "2.1.0" lil-fp "1.4.5" outdent " ^0.8.0" @@ -2135,35 +1991,35 @@ postcss "^8.4.31" ts-pattern "5.0.5" -"@pandacss/is-valid-prop@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/is-valid-prop/-/is-valid-prop-0.17.0.tgz#bde21919ab86fc3e666c8f5600c821d466b44389" - integrity sha512-IAMYnuRa9e+KpzgAZL/YfdahdrkNWwtvSfJi85qHCxm1VKAf0QhFqvxc4LHoXIg+RXF9Zqy4AUkCvGHA/Nt8HA== +"@pandacss/is-valid-prop@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/is-valid-prop/-/is-valid-prop-0.18.3.tgz#4a9d8d94148e170a2784236300acb6e487153276" + integrity sha512-ZXSiE+++rD5EvK3Vd3V2acrC0D9cVr9Mn/nDz/qR577WuAXhn3k1PNnCP4CsVy3wBX+SCKYfd+b27OS11aJZJQ== -"@pandacss/logger@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/logger/-/logger-0.17.0.tgz#40410e4255a5748ffd4fc4d8a2c06b19b5bfbc37" - integrity sha512-jTBVNh3whuf5q+d2YpBUtV3OsT84uytd1/OwWYlGXFB5f3G6oC2j75HyJLmqFVc09LeksnJCYbduxJIOw7r/iw== +"@pandacss/logger@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/logger/-/logger-0.18.3.tgz#16af613f94a93b314f291c1e3012c4f2c502fcfd" + integrity sha512-Vsxu+iYpGcJJIHd5DswqhYYetP7z6ZcWakeEsXD6joL3OIddiFlt94VfghsLMUjnpgNsEQ5xHtGbQOrcIqtNOg== dependencies: kleur "^4.1.5" lil-fp "1.4.5" -"@pandacss/node@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/node/-/node-0.17.0.tgz#32edf90ae354a19e542be703d2f7ffba341d224e" - integrity sha512-1IvErP/j8tL6imgpAAnkT/VfcQef3v/C6AGdu58QmdEJPy9PgWe6jHzJ+BQ1fA+ZBOFtC932UbupyqxftssMqA== - dependencies: - "@pandacss/config" "0.17.0" - "@pandacss/core" "0.17.0" - "@pandacss/error" "0.17.0" - "@pandacss/extractor" "0.17.0" - "@pandacss/generator" "0.17.0" - "@pandacss/is-valid-prop" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/parser" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/token-dictionary" "0.17.0" - "@pandacss/types" "0.17.0" +"@pandacss/node@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/node/-/node-0.18.3.tgz#c70b23c969ce6cd0adcf8d065ca3ffabf22c48ee" + integrity sha512-SBhX8vsm2/q2krVSwOsNvb2k2vpU/xRvNz+xGPS2xAbMy4UhSHxvZGXQc3hcO/qvJtbWyeXWuOj3GjFZlfP0nw== + dependencies: + "@pandacss/config" "0.18.3" + "@pandacss/core" "0.18.3" + "@pandacss/error" "0.18.3" + "@pandacss/extractor" "0.18.3" + "@pandacss/generator" "0.18.3" + "@pandacss/is-valid-prop" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/parser" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/token-dictionary" "0.18.3" + "@pandacss/types" "0.18.3" chokidar "^3.5.3" fast-glob "^3.3.1" file-size "^1.0.0" @@ -2181,86 +2037,86 @@ pluralize "8.0.0" postcss "^8.4.31" preferred-pm "^3.0.3" + prettier "^2.8.8" ts-morph "19.0.0" ts-pattern "5.0.5" tsconfck "^2.1.2" -"@pandacss/parser@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/parser/-/parser-0.17.0.tgz#9e744bbb6d50928a580cf3a191ef5a13583c81cb" - integrity sha512-zrWBA9+Z12eUNCHttRyI88qiN0yEHHx3ZI2WARCU9IjqVqqEOmj6z+gR3zPOLFCal5Niu6r5InyhgShJ8E4x7Q== - dependencies: - "@pandacss/config" "^0.17.0" - "@pandacss/extractor" "0.17.0" - "@pandacss/is-valid-prop" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/types" "0.17.0" +"@pandacss/parser@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/parser/-/parser-0.18.3.tgz#2876496d73b2110bc25b63b14fcef5ab2d9747ee" + integrity sha512-8jHfWA7pwZqtzoiPpP79lsEp7Tcf2E45kvkI5M381BiyKNPdGL5SD0+E1fCmDOoBO5WSTTQ3jzESqZDlMvUZiw== + dependencies: + "@pandacss/config" "^0.18.3" + "@pandacss/extractor" "0.18.3" + "@pandacss/is-valid-prop" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/types" "0.18.3" "@vue/compiler-sfc" "^3.3.4" lil-fp "1.4.5" magic-string "^0.30.2" ts-morph "19.0.0" ts-pattern "5.0.5" -"@pandacss/postcss@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/postcss/-/postcss-0.17.0.tgz#f8b61f9995b81e50a13ffddec698744b5d8aba72" - integrity sha512-ZhH30vT+XEqf3u5TkR6zcNhYVymk5tmzhMDqu/g5VFLl5LV1EuM8oQg3GJIbiA5ep47RBaQkRmCdmBYSwpD4tQ== +"@pandacss/postcss@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/postcss/-/postcss-0.18.3.tgz#821277b40017c65221d6f296bff3b9c24f28f696" + integrity sha512-zrWVOVH8Px7eKMynNR0fy5RRdfBIez0EHHUgUkGs44xZ45eK677ab0FO64SjAsqrfnyh10kYKejeYNVQxc6G/A== dependencies: - "@pandacss/node" "0.17.0" + "@pandacss/node" "0.18.3" postcss "^8.4.31" -"@pandacss/preset-base@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/preset-base/-/preset-base-0.17.0.tgz#b8ee693e1fed87a1b325f081bc872657a5225ad3" - integrity sha512-I0VKIFiBsyxC+EbIwxXp1kWbENEg0hvO8hK7u2CmsdctVMw4C5XIBGqmIVM+B9NfRkcmGqpWqo7z59EwAFwV3w== +"@pandacss/preset-base@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/preset-base/-/preset-base-0.18.3.tgz#a544fb217b6f2e99b4bc44897c64401d6750a597" + integrity sha512-tjB7bVPnNaKCXl2nq16+WCwZuUwjYMTVEdOWhj+KJ/kDER34wUD6IQF/XFTUL4e9SaJDFnji/UHyj5RBh6NGGw== dependencies: - "@pandacss/types" "0.17.0" + "@pandacss/types" "0.18.3" -"@pandacss/preset-panda@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/preset-panda/-/preset-panda-0.17.0.tgz#4ba4eaf686df232acc8468efb32ac2e3848854b3" - integrity sha512-rRdI1pelAVSgGV6+p8hM0ZLi4my2suIN1N+V91Ifjh383yvEKPuSfakhd08jyIv6Lj10n8dhUo6Sn9FHGbZIKA== +"@pandacss/preset-panda@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/preset-panda/-/preset-panda-0.18.3.tgz#eb8f2cf83dcefe305aef353dbe125012a10c0881" + integrity sha512-INDDkIgwZqly0YIxXVy6SY8ynQbONS8m7gQZxCG7deSWWjjLniFknte7Of7VpxPvQBKa5gyANvKR6z8JzZfauw== dependencies: - "@pandacss/types" "0.17.0" + "@pandacss/types" "0.18.3" -"@pandacss/shared@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/shared/-/shared-0.17.0.tgz#bcdba428fd9d1fd61871e07118040c4cf3575957" - integrity sha512-h7bcC/ZbE1ZhXMH4S5QFkmMoV7X8bAl02Z92Nx8HDYa1J1B7ot2z8a4XQePdvWDrtfMYSW4/lhEGVwQcsB4t7w== +"@pandacss/shared@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/shared/-/shared-0.18.3.tgz#e7baf91640568a348794021674e69c1fab1689c8" + integrity sha512-BRk97D2hb/n4YrDYpBetsNuvVeF4i+XYdRBxtBl4SRe+ux9fSnQv0hmrEyCvR+gqbnC1FnQw7UQa/1ZjmTdWgQ== -"@pandacss/studio@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/studio/-/studio-0.17.0.tgz#865e39f17e5c8cd8c20af421e76feebe6f9f28cd" - integrity sha512-XamCB+Zc/wETSu5qb/9c3VydcnD2Wx2l3IHjNPm5SPgS7O+ISnQpmCPj1IRQbOWwknLlFBj1L135icFmzKwRqw== +"@pandacss/studio@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/studio/-/studio-0.18.3.tgz#400b378f2e4f173da528ce154cdf81ed9b386cb5" + integrity sha512-c6Sij4iEeKlItzNCKKkBJuydT2VcKd4h6SXgiNe6/TkG2jcefvWLmcGD/u9GvHpWozGe3MCiBZn9bnVIVtI1xg== dependencies: - "@ark-ui/react" "0.9.0" "@astrojs/react" "2.2.1" - "@pandacss/config" "0.17.0" - "@pandacss/logger" "0.17.0" - "@pandacss/node" "0.17.0" - "@pandacss/shared" "0.17.0" - "@pandacss/token-dictionary" "0.17.0" - "@pandacss/types" "0.17.0" + "@pandacss/config" "0.18.3" + "@pandacss/logger" "0.18.3" + "@pandacss/node" "0.18.3" + "@pandacss/shared" "0.18.3" + "@pandacss/token-dictionary" "0.18.3" + "@pandacss/types" "0.18.3" astro "2.9.6" javascript-stringify "2.1.0" react "18.2.0" react-dom "18.2.0" vite "4.4.11" -"@pandacss/token-dictionary@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/token-dictionary/-/token-dictionary-0.17.0.tgz#d432941f053f598b45ed5c4d3afe091b1f6552d5" - integrity sha512-oZt2cg3UBXqmK07qAQjbDydUwx4ciBhDVAIzMN8/aQS1Cl9pvuujb8Mn20kd11LyLGzVqGqNksko4qNCauXVog== +"@pandacss/token-dictionary@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/token-dictionary/-/token-dictionary-0.18.3.tgz#387c2d2722ea14f03170bdb6c374cfa28e610256" + integrity sha512-FmAamKyrPOwyQaCUjTGB31UvuwW1XIKXRdjs0FbloFfEUdhHU9nROTGLuUA8szUSlTkGk5mCq9U34NfneJYZ8Q== dependencies: - "@pandacss/shared" "0.17.0" - "@pandacss/types" "0.17.0" + "@pandacss/shared" "0.18.3" + "@pandacss/types" "0.18.3" ts-pattern "5.0.5" -"@pandacss/types@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@pandacss/types/-/types-0.17.0.tgz#fc366c42620b61cba18f79e81d8166171ef5a857" - integrity sha512-CAMg0Adnlgldy3FA6mmNcblVvt4G9HLMzTvd+E+l0X4x2z1qfL6uUp7cmrD1NFr2fexnYzM2ldUcAXRZC4G3lw== +"@pandacss/types@0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@pandacss/types/-/types-0.18.3.tgz#f33bf4878682f17d923a47682a2f402fd470fca9" + integrity sha512-hffOB4x8ialiEDda6LcDmKHjK0PCa+gTbVPNoaXSL0j4+A1FTaoEs1mYW6QyS0/oRR/NNhPtL5Gamh5GUB1QJg== "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -3016,1132 +2872,52 @@ "@radix-ui/react-visually-hidden" "^1.0.3" classnames "^2.3.2" -"@reach/alert@^0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@reach/alert/-/alert-0.13.2.tgz#71c4a848d51341f1d6d9eaae060975391c224870" - integrity sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg== - dependencies: - "@reach/utils" "0.13.2" - "@reach/visually-hidden" "0.13.2" - prop-types "^15.7.2" - tslib "^2.1.0" - -"@reach/auto-id@^0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.13.2.tgz#6c7fe7142285707b0f38b2f556f32accb467df32" - integrity sha512-dWeXt6xxjN+NPRoZFXgmNkF89t8MEPsWLYjIIDf3gNXA/Dxaoytc9YBOIfVGpDSpdOwxPpxOu8rH+4Y3Jk2gHA== - dependencies: - "@reach/utils" "0.13.2" - tslib "^2.1.0" - -"@reach/observe-rect@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.2.0.tgz#d7a6013b8aafcc64c778a0ccb83355a11204d3b2" - integrity sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ== - -"@reach/rect@^0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.13.2.tgz#a7fb8ebc3685504306b324b3abc92dcec0e00044" - integrity sha512-Vr1J2CzXWEGVMLxHblPMt8pgwW0d7s28SflFNCdFlbHwjgWSvnKwHue9p90bYRb4W/5u6gYjYX6znzSMxv/8ZA== - dependencies: - "@reach/observe-rect" "1.2.0" - "@reach/utils" "0.13.2" - prop-types "^15.7.2" - tslib "^2.1.0" - -"@reach/utils@0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.13.2.tgz#87e8fef8ebfe583fa48250238a1a3ed03189fcc8" - integrity sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ== - dependencies: - "@types/warning" "^3.0.0" - tslib "^2.1.0" - warning "^4.0.3" +"@redux-devtools/app@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@redux-devtools/app/-/app-4.0.1.tgz#037067e9866c1dd840e2571712f50e7cf34ca45e" + integrity sha512-/2tB5VrYJiALPCMCAsLqKW0plpM/8fPZnHw19Ipw5lSwbj0AOj1/gZtNHkVkc0IFAsZPGEGX6y9eTHJE1vaIbg== + dependencies: + "@babel/runtime" "^7.23.2" + "@redux-devtools/chart-monitor" "^4.0.1" + "@redux-devtools/core" "^3.13.2" + "@redux-devtools/inspector-monitor" "^4.0.1" + "@redux-devtools/inspector-monitor-test-tab" "^2.0.1" + "@redux-devtools/inspector-monitor-trace-tab" "^2.0.1" + "@redux-devtools/log-monitor" "^4.0.2" + "@redux-devtools/rtk-query-monitor" "^3.1.1" + "@redux-devtools/slider-monitor" "^4.0.0" + "@redux-devtools/ui" "^1.3.0" + "@reduxjs/toolkit" "^1.9.7" + "@types/prop-types" "^15.7.9" + d3-state-visualizer "^2.0.0" + javascript-stringify "^2.1.0" + jsan "^3.1.14" + jsondiffpatch "^0.5.0" + localforage "^1.10.0" + lodash "^4.17.21" + prop-types "^15.8.1" + react-icons "^4.11.0" + react-is "^18.2.0" + react-redux "^8.1.3" + redux "^4.2.1" + redux-persist "^6.0.0" + socketcluster-client "^17.2.2" -"@reach/visually-hidden@0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@reach/visually-hidden/-/visually-hidden-0.13.2.tgz#ee21de376a7e57e60dc92d95a671073796caa17e" - integrity sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ== +"@redux-devtools/chart-monitor@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@redux-devtools/chart-monitor/-/chart-monitor-4.0.1.tgz#922ea03f90d9896d4ae0a8b29e3dbae882a905fc" + integrity sha512-fQtIpR/F/glaGuZ2dY+BWNEwksapoMgqT7gxbDAdk5eHL/cXOMdz4jX58H808pzpEzongj0MXKExMiaQPhBVKA== dependencies: - prop-types "^15.7.2" - tslib "^2.1.0" + "@babel/runtime" "^7.23.2" + "@types/redux-devtools-themes" "^1.0.2" + d3-state-visualizer "^2.0.0" + deepmerge "^4.3.1" + redux-devtools-themes "^1.0.0" -"@react-aria/breadcrumbs@^3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.5.tgz#eb7c812d2608382286b9e177da5ead515712a7e9" - integrity sha512-8O+ntzq8yxmsXVQmLTJGovSespTAuJ17PWvgIL8HsYh7FOU/TRM/rhileaDlZBlIpZtI/hbs+d9MuC6ZOXkl7w== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/link" "^3.5.4" - "@react-aria/utils" "^3.20.0" - "@react-types/breadcrumbs" "^3.6.2" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/button@^3.8.2": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.8.2.tgz#b392df6db7368198be6e6e4791c0f9d8e23b96ae" - integrity sha512-d1Fgx2XrSk8WMFtGu/ta76m5Rx+f2CuHY1k6nD45QciszD26GbzHdLOSjxev97M6vHj/BOsGL01XcwmTL4fZHA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/calendar@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-aria/calendar/-/calendar-3.5.0.tgz#ac092c7724d801bb9c6c142c5370e628cf99423b" - integrity sha512-n/VrAJlKmsNrBKCPMI3tmCqpV38+Cihtinzp3yp8DeL44WH3IJij6aftkEcI7pIVNajY6vYLS9BbjscvIdg+fw== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/utils" "^3.20.0" - "@react-stately/calendar" "^3.4.0" - "@react-types/button" "^3.8.0" - "@react-types/calendar" "^3.4.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/checkbox@^3.11.0": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.11.0.tgz#f4249befb42b0639af53ce4014bdbd53d4aafcd3" - integrity sha512-3C5ON4IvFu69LihMOB6Y2Zr4T0zjkuPfQ6HrHuS9SiFU+IZuv1z38K/bXk7UkmZoiLtWLloNA5XKNCwf+Y+6Xw== - dependencies: - "@react-aria/label" "^3.7.0" - "@react-aria/toggle" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/checkbox" "^3.5.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/combobox@^3.6.4": - version "3.6.4" - resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.6.4.tgz#12b4a1ba9b4c65f344ad24608c19c647c708a212" - integrity sha512-L6KAB9P7ztyKM8B3WISRtVFdz9R66ZA6h+m128JmmTc3DrvSs0lxQMZIKfFuh31IZfAe62p2IwDlR1UbhXffVg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/listbox" "^3.10.2" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/menu" "^3.10.2" - "@react-aria/overlays" "^3.17.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/combobox" "^3.7.0" - "@react-stately/layout" "^3.13.1" - "@react-types/button" "^3.8.0" - "@react-types/combobox" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/datepicker@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-aria/datepicker/-/datepicker-3.7.0.tgz#a21436989eca57c256855cdedcede41deb2fd6a5" - integrity sha512-zekxxC2dpQIEFFb2Yj6odwgBb9s81g3V7VwjUilkthW2vaVzTjWTZTUYffgcmbfVv++ZGtvlY7iSSTLN7+54Og== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/number" "^3.2.1" - "@internationalized/string" "^3.1.1" - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/spinbutton" "^3.5.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/datepicker" "^3.7.0" - "@react-types/button" "^3.8.0" - "@react-types/calendar" "^3.4.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/dialog" "^3.5.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dialog@^3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.5.tgz#6cf967fa1c0915636bf5de7e0657df6781bff7de" - integrity sha512-nfh1fg5h8jEe8ktoq1YrlOHuyqoZgZOCYh0PourwfY26Pl7BxFrMyG7HCnY2mjDxnXLJLULONVmUN3WxbgzhxQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/overlays" "^3.17.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/overlays" "^3.6.2" - "@react-types/dialog" "^3.5.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dnd@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@react-aria/dnd/-/dnd-3.4.1.tgz#75674c44e626ad6b701bb5440a368caa3fdbfffb" - integrity sha512-eugNj9/blh5niEeDuhXLsb3juhateoa+t+2u3+awUgWS4jq/csfFHdjT2FPtTS4DVZvZ9sH/JuC1Sp/yxIvhjA== - dependencies: - "@internationalized/string" "^3.1.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/overlays" "^3.17.0" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/dnd" "^3.2.4" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/focus@^3.14.1": - version "3.14.1" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.14.1.tgz#f91733e158eed0fda4dd495511c8e4a7a7bcd998" - integrity sha512-2oVJgn86Rt7xgbtLzVlrYb7MZHNMpyBVLMMGjWyvjH5Ier2bgZ6czJJmm18Xe4kjlDHN0dnFzBvoRoTCWkmivA== - dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-aria/grid@^3.8.2": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.8.2.tgz#0323601f819e985d95478ababe705b06af583a30" - integrity sha512-AaUVDY+oonIISDUzEH+1v6ncv7jnWog1zhBQ+sRFie+8apogv/M0Uj7sSX/lse+K42jIXK67472vz2+s0AJVEA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/grid" "^3.8.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/gridlist@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-aria/gridlist/-/gridlist-3.6.0.tgz#6907d57cb5f61f54b320525ea6afc3414a67e9fd" - integrity sha512-Owz21N1iB37iDSPrkPzK6cUoLCn4ch6TC2SIbAst65NytQP5oF+l+u1qHhqFvJC5qdEcA6yIQs3wioax1EdqqA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/grid" "^3.8.2" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/i18n@^3.8.2": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.8.2.tgz#7d7e267647271b45ce5095652d9fa9d83459d0ef" - integrity sha512-WsdByq3DmqEhr8sOdooVcDoS0CGGv+7cegZmmpw5VfUu0f0+0y7YBj/lRS9RuEqlgvSH+K3sPW/+0CkjM/LRGQ== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/message" "^3.1.1" - "@internationalized/number" "^3.2.1" - "@internationalized/string" "^3.1.1" - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/interactions@^3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.18.0.tgz#20d242e3d8349533fdc74e88fb9ca7d1ecee91ab" - integrity sha512-V96uRZTVe2KcU5HW+r2cuUcLIfo0KuPOchywk9r48xtJC8u//sv5fAo0LMX6AgsQJ7bV09JO8nDqmZP0gkRElQ== - dependencies: - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/label@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.0.tgz#c927d7aed3b3ba581bd7d11a8e17af2fe2063325" - integrity sha512-OEBFKp4zSS9O/IPoVUU/YdThQWI4EXOuUO8z2mog9I3wU1FQHEASGtqkg0fzxhBh8LYnPIl56y02dIBJ7eyxlA== - dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/label" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/link@^3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.5.4.tgz#8b0505bcaa5b2a01c900a7abc24f4fefabc87d8d" - integrity sha512-ZHDxf9gbaqit1akkBRwnlMQZH/h/CfKe+rV+Cvw9cKrAgvJXfGHfNQVI3YxoMU7kSTOooKnzXOGWxoMJ11ql8w== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/link" "^3.4.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/listbox@^3.10.2": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.10.2.tgz#58ff21896b49eee6cf294e7768e96a8e8ac05674" - integrity sha512-7w75yGyNUGwxB8dSNuXTe7Yd+ab6VmtpROLIhf3b92BPE51oy77i3/Dy1F8IdZMTUqOFd5Nm8K0Z0ZSjOchDfQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-types/listbox" "^3.4.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/live-announcer@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz#bf864b8820fb02daaeefc1c972782a0174fd60b9" - integrity sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-aria/menu@^3.10.2": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.10.2.tgz#e875ce43f7c7417563a888dc770e07daf944b423" - integrity sha512-qqnOj6gU7GQAvdTBM9Y+lclaKEciVwfYylmJRu8RBt72jceSBkdR78et9ZLaNMwVPMYCEUxbOv8vvL7VoRKddg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/overlays" "^3.17.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/menu" "^3.5.5" - "@react-stately/tree" "^3.7.2" - "@react-types/button" "^3.8.0" - "@react-types/menu" "^3.9.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/meter@^3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.4.5.tgz#c51a48132bc57ec6073ce6860a2182a31b377582" - integrity sha512-ly0x8rHsBW/pGGyQ8MF5qW1SiyPmD/7HGL3La9sJ9Gd8bGqz5CM7MCbPZN27DEwAEdu2BFqAaOKzhxDt2AU65g== - dependencies: - "@react-aria/progress" "^3.4.5" - "@react-types/meter" "^3.3.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/numberfield@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.8.0.tgz#3f931f6e95e00d4f9b83be5782b5e4d13b87c332" - integrity sha512-yfytm+cuKBFlszCL0RCuEKOxyX3xW320MN1RotrfGxMbalssEJyj4a0sBPi2NteG6YtvzOrzwHvRdQP5FjSu5w== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/spinbutton" "^3.5.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/numberfield" "^3.6.1" - "@react-types/button" "^3.8.0" - "@react-types/numberfield" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/overlays@^3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.17.0.tgz#93976917cf094d5e5ee5453659d9cdd5fe730d38" - integrity sha512-wfQ00llAIMLDtIid+0MvNqvbLP6Fqi2/hfvAxhDaRqrkiARwuCAclWNCIdCzF599IpZOMcjjBgIILEXdfA0ziw== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/overlays" "^3.6.2" - "@react-types/button" "^3.8.0" - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/progress@^3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.4.5.tgz#ee3c9f816bb53285e5dd4bb3923c51bda712469a" - integrity sha512-9i/+v3BVX79kwSiy+K9cozLSXjO5jb3WCZTm2O7KaZaLq5beCnSVuZdYxRo8C22ooeh0TXdYEl6Duujh86k+yg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-types/progress" "^3.4.3" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/radio@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.8.0.tgz#20800ef83d072362903382e344ad0ae74a408548" - integrity sha512-KvE7UeSDVgdOVLNt/RzTCroMRbVcnn6QZHp0fde9HjQV14Umebyu/fWAmfvIMe/th1Lelf6NtliGXOAZpfOLrg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/radio" "^3.9.0" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/searchfield@^3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.5.5.tgz#53780d51031dfc85cb5dc719d04fcc4424b48327" - integrity sha512-/CL4H5X8kqk3237CZ0RSnnR6KMeI6xzdr0lqwL1m9d2NkTBcTgm/0xa8JRxVi/4aKWSvApbcPv/8iF05FA1sAQ== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/searchfield" "^3.4.5" - "@react-types/button" "^3.8.0" - "@react-types/searchfield" "^3.5.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/select@^3.12.1": - version "3.12.1" - resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.12.1.tgz#d1032645bf05d00600b414969c12369173a0b3d7" - integrity sha512-RBEbay8RGUuwxoKLKtWmL/3MU8Wk2xmofg9PdYGAcgkq88Ucyt+ejKNnRLTm/dOLgwgUcreHhEDEe5QrYQQqbg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/listbox" "^3.10.2" - "@react-aria/menu" "^3.10.2" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/select" "^3.5.4" - "@react-types/button" "^3.8.0" - "@react-types/select" "^3.8.3" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/selection@^3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.16.2.tgz#f6dfdbb0e071268111e5dcbd397321802bed00c9" - integrity sha512-C6zS5F1W38pukaMTFDTKbMrEvKkGikrXF94CtyxG1EI6EuZaQg1olaEeMCc3AyIb+4Xq+XCwjZuuSnS03qdVGQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/separator@^3.3.5": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.3.5.tgz#b6e1ad8f5797a53717a147d7cdfcc5d0930ac200" - integrity sha512-gW/WgQy9LPTqZtN/DlmC1qcA1liCO1hdS9SBvnYbA6MymKUOyqz6Ui6oSkN+LlAHcZBtnepTeDoClGMWAQmL5g== - dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/slider@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.0.tgz#c7fafc7b824e17c558242e2058f79e2bda0fbb10" - integrity sha512-aQ3d89M3scWIBJjpjQ0OxeNGuklxX9gxeAhSvYkhsyFd37DCBNNtHIiLfPzQpsSJOjSJofBsEzrG4y+JHGcrdg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/radio" "^3.9.0" - "@react-stately/slider" "^3.4.2" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@react-types/slider" "^3.6.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/spinbutton@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.5.2.tgz#e887174b8fcf2d5801c5ce5281ccbf1453ce0d81" - integrity sha512-qD1yjCE7dMdiyFMV7DPz/+qn7lLdU2BqMx/aT4eN2RMcrjSw5AIc1IYsfwQGg9XkQw7FWSRxDud+EuuGSzMB2w== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/utils" "^3.20.0" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/ssr@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.8.0.tgz#e7f467ac42f72504682724304ce221f785d70d49" - integrity sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-aria/switch@^3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.5.4.tgz#edcd70bd19d54b3021e645a39fc5255ac5bf70e8" - integrity sha512-u5nkxLuToz7qsRoH8qiZSe4rdKJ7LJK5AoEVQzlqlw2oLTcaitRpnYYNfGJuMasAAnmdIx6SJ60gb3vly+5SMQ== - dependencies: - "@react-aria/toggle" "^3.8.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/switch" "^3.4.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/table@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.12.0.tgz#3b95778231fa502080d7523bbb0b00e5085ff6c7" - integrity sha512-Pso4AaeIdBRMguq/ijYnNzEqFhMcV/TxxpfR/9V3wRVfTzl1Z1wA99T3QBxoaT5ZjR8JIBYtzF1ErNZ0c1vsAw== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/grid" "^3.8.2" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/collections" "^3.10.1" - "@react-stately/flags" "^3.0.0" - "@react-stately/table" "^3.11.1" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/tabs@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.7.0.tgz#db86f229a8e6f8430b6c74986ad57956111f174c" - integrity sha512-st0fdbnTizYu+gvJ+UAbhKdEdUA2rPodFl7Knxo8FidM1lOgf6B6gQowUyvLAcLpxVRpJmhbePVU+uzJTZajog== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-stately/tabs" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@react-types/tabs" "^3.3.2" - "@swc/helpers" "^0.5.0" - -"@react-aria/tag@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/tag/-/tag-3.1.2.tgz#cd5a2c3b7372d6ba3bb12b13419201650bd2e6e4" - integrity sha512-tsgl7K/+AkZKa89mWZVqTxgrEQLeCuV6aOric3X4CH9Gh5PgSrQIb5Nslx9+OT5b/PwesFkqa422TOPki5bQLQ== - dependencies: - "@react-aria/gridlist" "^3.6.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/textfield@^3.12.0": - version "3.12.0" - resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.12.0.tgz#16b477b9eb57f006609872a2df7cdeefce4ae9b3" - integrity sha512-okvCR7vPrSx/0AW+YxPWo3ucJkgRuX77QWVeYBXhQiBKooHEYSfaceMgMZc/KS5HGZsY8bEKpGOIVkZBitzQsg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/toggle@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.8.0.tgz#15449d06d7a90fbabab12926297648918d95adb6" - integrity sha512-HQgx8rBEwGsVyJKU47GTZcWWn3Kv0DgZfUY/lXkdhMFf14/NWTRpJEuKRfEut+/wVFbcNcv9WDT7fEe7yTvGWg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@react-types/switch" "^3.4.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/tooltip@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.6.2.tgz#6f446effe6c8d206485824417ab40522fbb7cffe" - integrity sha512-y8dAxRrL4lPmYrg+UoKbHymeIuOxBq994XXWbHw2dlM4ZnBfXAaFWYuV9Pfp+JXk9Oi1atJYc3O70Z9TmgXGVw== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/tooltip" "^3.4.4" - "@react-types/shared" "^3.20.0" - "@react-types/tooltip" "^3.4.4" - "@swc/helpers" "^0.5.0" - -"@react-aria/utils@^3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.20.0.tgz#46a03b36b790b9acc3338390023daa5f4aa987fc" - integrity sha512-TpvP9fw2/F0E+D05+S1og88dwvmVSLVB4lurVAodN1E6rCZyw+M/SHlCez0I7j1q9ZWAnVjRuHpBIRG5heX1Ug== - dependencies: - "@react-aria/ssr" "^3.8.0" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-aria/visually-hidden@^3.8.4": - version "3.8.4" - resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.4.tgz#7812ec32d5a317019acb2639b5e47d3de2886a4c" - integrity sha512-TRDtrndL/TiXjVac7o1vEmrHltSPugH0B6uqc1KRCSspFa1vg9tsgh9/N+qCXrEHynfNyK9FPjI70pAH+PXcqw== - dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-spectrum/utils@^3.5.1": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@react-spectrum/utils/-/utils-3.10.2.tgz#05d44fa193731a3888bda5cee90bd457feff3950" - integrity sha512-dz0ZcGsXNz3UAI8Q39Ce+n/dHYzfxmVtzJBswtEHqgv8d11YPT+VZBGBo3Np/N9cJIorq6/wu0kbTryIAT8vaw== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-stately/calendar@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.4.0.tgz#ddcb9e6729249247533413dba1698502f74052e2" - integrity sha512-MUGJ0fvUV999r+zCkK00YXkHojpL5dSCPiuYdrv/GeXxqksr2no780JmKkUcp4OUG8gnmgo37LRc8xJ0TX3Hug== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-stately/utils" "^3.7.0" - "@react-types/calendar" "^3.4.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/checkbox@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.5.0.tgz#a19ad2b7f676d4453ba07af3c6c2d046f1e39c03" - integrity sha512-DSSC5nXd9P07ddyDZ6FBwaMAypURCwCRhC8kli5MNRF8/KCDJxWOpWe6LDRXeDgA6EN7ExE1deb8gydIrYmUOw== - dependencies: - "@react-stately/toggle" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/collections@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.10.1.tgz#c936d2f97f5508ead5c22aa0d600cae410bf82ae" - integrity sha512-C9FPqoQUt7NeCmmP8uabQXapcExBOTA3PxlnUw+Nq3+eWH1gOi93XWXL26L8/3OQpkvAbUcyrTXhCybLk4uMAg== - dependencies: - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/combobox@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.7.0.tgz#251c6d52853df1f9059fdfe76c152b4d607eac03" - integrity sha512-tkPgv2cDS5wfkPVrA5Jffpi9kxUnsFuvk/T1VZXYt1ItAsxy7IGli+JwHYFgTqadDyF+yRNMj5QYRY0mnbIxrg== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-stately/menu" "^3.5.5" - "@react-stately/select" "^3.5.4" - "@react-stately/utils" "^3.7.0" - "@react-types/combobox" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/datepicker@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.7.0.tgz#ac1093b6d9068a680f458012311f28b9e234bea4" - integrity sha512-yPEfgKVXmwLwn41H8KeLuwgAN5oVmmcQemyn6iKLCPaIsQjXGpbfB0diQhg/aTjnm0VtdqdCBYPhHZzPkCml/w== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/string" "^3.1.1" - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/dnd@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.2.4.tgz#9f0fbf827ffd4789fd478af50b7f4d4ccbb6a067" - integrity sha512-ZPhcEcnCvEtRQzkDzNUJvZDzW2GUL0nr8++AYf4VhXPh7geFyGmYtvfoFTxESov3AMFhCLLDClxKejLTwrzzbw== - dependencies: - "@react-stately/selection" "^3.13.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/flags@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" - integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-stately/grid@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.8.1.tgz#8dcc44147c42a3fcbcfabbb83d7bccacda51000b" - integrity sha512-7eKPoES4eKD7JU9UXcRGVKZ/auaD5F/srVhkWjygKcJ2ibt48N0dh6JwPqPoxzqApUX0DuUjebL9hCRgagEvdQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/layout@^3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-3.13.1.tgz#5e43cca85c9a77bb8db1919897213757f7ef9408" - integrity sha512-gJNK1bpnrWNHz/uhTg7OpVFuSyLdYwqNjXt2He+i66/lZ6TG36smsi9MYtTYdC72Js5rsA9ngWtfhNpQ9bMeCQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/table" "^3.11.1" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" - "@swc/helpers" "^0.5.0" - -"@react-stately/list@^3.9.2": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.9.2.tgz#ca4119bae68efd27c242dc7097fdf0b413414abb" - integrity sha512-1PBnQ3UFSeKe2Jk4kYZM/11uzQsNEs098tbEkqR3JJwYzJ4htjdd1I0P9Z2INFWiHw071OJD18Ynbbz90jMldw== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/menu@^3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.5.5.tgz#0c70431726a6f955537f26cc38f11206f2f97820" - integrity sha512-5IW26YURvwCs2a0n6PwlGOZ1K+M5xwfgR/q6mbQPfbZGZG6a14buHTHK8kISHAl2hHFcn0TV6yRYDmw2nxTM0A== - dependencies: - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/menu" "^3.9.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/numberfield@^3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.6.1.tgz#5f34ff84408e48e4aa81d7c348f8add59749ffd6" - integrity sha512-vR2kvi0GSQhshh3jhlTRyZyVpvOpAGu1xo1sQM5vbgM8fzKLw3gZvnaPy+XvSkfxUk0MCYZxYtkOvf6QJV7p8w== - dependencies: - "@internationalized/number" "^3.2.1" - "@react-stately/utils" "^3.7.0" - "@react-types/numberfield" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/overlays@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.2.tgz#478e4a9312f763242f4443b7fd1f90c49afcbaed" - integrity sha512-iIU/xtYEzG91abHFHqe8LL53ZrDDo8kblfdA7TTZwrtxZhQHU3AbT0pLc3BNe3sXmJspxuI1nS1cszcRlSuDww== - dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/overlays" "^3.8.2" - "@swc/helpers" "^0.5.0" - -"@react-stately/radio@^3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.9.0.tgz#b54b58f0eb73aeeeaeddfabaa8072d5f7f92594d" - integrity sha512-Q2vt5VjxLbsvbMWQmDqwm9JUJ3fkmUEzSBUOSYOkUcBchnzUunpaMe3nQjbJLekIWolubsVaE3bTxCKvY8hGZA== - dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/searchfield@^3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.4.5.tgz#4c1890dbb6ea83bcc16c166a72dfbe9e3c74944c" - integrity sha512-0aQ7oeiqUgTzh3DcZDe2VdWdyERvxrZ27O1/GYvWj0uMJcqHmd1iA9oa3v725PmylmRvD6A42K2GqeF5c5Ue8g== - dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/searchfield" "^3.5.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/select@^3.5.4": - version "3.5.4" - resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.5.4.tgz#9bd2c82fe6b27e1c459514e4bef82b328081cb7b" - integrity sha512-CO+5ORMwx/nEKAf7285S3QRAWLJlD1TZPKosO5ND87SZt9j6LKTyJjsT5IYcny8W/ejFOKg5VP4evYNkd5ZtEQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-stately/menu" "^3.5.5" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/select" "^3.8.3" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/selection@^3.13.4": - version "3.13.4" - resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.13.4.tgz#88d30907d467e2994951ee362a61879cc0182283" - integrity sha512-agxSYVi70zSDSKuAXx4GdD8aG5RWFs1djcrLsQybtkFV2hUMrjipfvPfNYz56ITtz6qj5Dq2eXOZpSEAR6EfOg== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/slider@^3.4.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.4.2.tgz#cd22aff0099d5748706f0bf593233a8496aaed8e" - integrity sha512-3Acil4Pu1aQnTGYUcGCeO7gO7C6LpmUCwjnjcRlJbYf1VibLWrMC+EGYKcha+2dsXYAvvsI4HD6Zuf5HmFkomA== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@react-types/slider" "^3.6.1" - "@swc/helpers" "^0.5.0" - -"@react-stately/table@^3.11.1": - version "3.11.1" - resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.11.1.tgz#e8bc36cb081d76dfa66caafdecab1b2d72c7a008" - integrity sha512-iI0IeEmg91bwR/2UX2PTB8k34MrfxlMVD/XlZ+6XWQGjXftdeB8QNKDAClWMZwQmYA7HTq6bLvP2CochJ68k5w== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/flags" "^3.0.0" - "@react-stately/grid" "^3.8.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" - "@swc/helpers" "^0.5.0" - -"@react-stately/tabs@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.6.0.tgz#bd2cf9028a5f3f6a40fa6746b652ccd234e01ecd" - integrity sha512-JKEIh+4nn6Tgs434x0xoaXqaINWlUuqtQXAdoVmaL6tNY97K8zWcN08ACAbB66Os7E59FVMJczEpbUz/xja2Hg== - dependencies: - "@react-stately/list" "^3.9.2" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@react-types/tabs" "^3.3.2" - "@swc/helpers" "^0.5.0" - -"@react-stately/toggle@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.6.2.tgz#6f6e6c3010e45210cd18c147541876857930f570" - integrity sha512-O+0XtIjRX9YgAwNRhSdX2qi49PzY4eGL+F326jJfqc17HU3Qm6+nfqnODuxynpk1gw79sZr7AtROSXACTVueMQ== - dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/tooltip@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.4.4.tgz#a93c5a7b05a6e04765a61d51971ae49c9e4e16ea" - integrity sha512-Tb69T2uRep/9AF0+WR7j3kp4hZzRpp5N9r52j3zKsbHQ/qirAAQUJZegg5VgSfL2ncI7n2VijbBo8DfuJTbm8g== - dependencies: - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/tooltip" "^3.4.4" - "@swc/helpers" "^0.5.0" - -"@react-stately/tree@^3.7.2": - version "3.7.2" - resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.7.2.tgz#a0f13c76cb5d02ef29f4da0665ebaca7c821c372" - integrity sha512-Re18E7Tfu01xjZXEDZlFwibAomD7PHGZ9cFNTkRysA208uhKVrVVfh+8vvar4c9ybTGUWk5tT6zz+hslGBuLVQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/utils@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.7.0.tgz#ea99c2c4b5fba7e5079434a1de1ef53fbb21f6a8" - integrity sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-stately/virtualizer@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-3.6.2.tgz#e07ba0ab00f6a98ffa6cd00c75b729466f3b7add" - integrity sha512-BM7h7AlJNEB/X6XlMLlUoqye4SCGFmHiOIwEtha3QfJA52O1/0lgzD9yj5cLbdQPwZNmFH4R95b/OHqSIpgEBw== - dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-types/breadcrumbs@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.6.2.tgz#447932438ef6f2b9c0f1174f3dbd6132744e1492" - integrity sha512-CI4j7m15X3C7qznPZpXV8z6EyqCvIV2arfb+FH+Odu4AvcMCUrOKSolEtTl1tmv3uOTAwbd81jVxsUD6aJ6SCw== - dependencies: - "@react-types/link" "^3.4.5" - "@react-types/shared" "^3.20.0" - -"@react-types/button@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.8.0.tgz#e5ced04d718a9aaae6af175e7d2cb38552354cc9" - integrity sha512-hVVK5iWXhDYQZwxOBfN7nQDeFQ4Pp48uYclQbXWz8D74XnuGtiUziGR008ioLXRHf47dbIPLF1QHahsCOhh05g== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/calendar@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.4.0.tgz#e441b9db468bdcf9eefdbdce1996f3d2e6fe8364" - integrity sha512-kHEjkZ+NAPOhLGpIMGKwe2xPgwDvtFiKU6FWPghSeslxGUAzC0mop/sSdD8NvWbSdqKd/GqeCen5khlA1MoyGQ== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-types/shared" "^3.20.0" - -"@react-types/checkbox@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.5.1.tgz#ba86d4ec8230781df2aed8bc7d21dfe88f4deb15" - integrity sha512-7iQqBRnpNC/k8ztCC+gNGTKpTWj6yJijXPKJ8UduqPNuJ0mIqWgk7DJDBuIG0cVvnenTNxYuOL6mt3dgdcEj9w== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/combobox@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.8.0.tgz#c8c050220227c6f79651c3c0a5d100227a4fc087" - integrity sha512-P1LDS283OegZGnRJcpJhDAbX0JE8cnW4FzIP04GJWzF9fSf/GrlrLEDt4VTXKXxtdLWy3T+H4gmAYO10ZZVmBQ== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/datepicker@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.6.0.tgz#59f8c57fc4803a92f8637414d1399a3e6eb178b9" - integrity sha512-eMWAqsavA7PpjKwUuij4RjThAc3l2MtxKT51XnTA192EoYyTRVcDK+cuYjzWYn1kTj6+dNap+WvKJlYrxmS5aA== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-types/calendar" "^3.4.0" - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - -"@react-types/dialog@^3.5.5": - version "3.5.5" - resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.5.tgz#bcd8d40bedc4c704161496d4c19a417ecc753b6a" - integrity sha512-XidCDLmbagLQZlnV8QVPhS3a63GdwiSa/0MYsHLDeb81+7P2vc3r+wNgnHWZw64mICWYzyyKxpzV3QpUm4f6+g== - dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - -"@react-types/grid@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.1.tgz#0ddfff7051a12936106be26fb0c080f3a3279330" - integrity sha512-diliZjyTyNeJDR+5rfh9RRNeM8KFOSaFARkbO42j11CteN1Rpo66x2R53xM+0BO63rCUGrJ8RAg2E4BCp7al6w== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/label@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-types/label/-/label-3.8.0.tgz#73b1ae3b3cd63ff70f3019215c6809c1c7cbb252" - integrity sha512-hZTSguqyblAF83kLImjxw46DywRMpSihkP1829T8N2I/i8oFSu74OYBJ8woklk26AOUMDJ4NFTdimdqWVMdRcQ== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/link@^3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.4.5.tgz#6e9bb9f8b3dd00a6c3e0dbcb5ecc6cbabd22ce2c" - integrity sha512-wwLIFjg35LBxv29rA6jPyChPH6b18U1SXaCyVa2koRIOvXTdNSRnautyE3ZQ7LyufJDc5SRTOWQHjPK1IiOfaA== - dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-types/shared" "^3.20.0" - -"@react-types/listbox@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.4.4.tgz#1205acd6334c4fc85088a62edb4a5a8110ec7b82" - integrity sha512-c0FFM73tGZZ5AV9Yu5/Vd/cji5AVcI2QZvs4+mpRcSpzH3zSCVvVLr7GayZFS70tYQVPLHFH2E202wLxoiLK9A== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/menu@^3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.4.tgz#58256482f63efdda4a0d9cfacd98445ee0c4f327" - integrity sha512-8OnPQHMPZw126TuLi21IuHWMbGOqoWZa+0uJCg2gI+Xpe1F0dRK/DNzCIKkGl1EXgZATJbRC3NcxyZlWti+/EQ== - dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - -"@react-types/meter@^3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.3.4.tgz#9ff07a7d98c03640637c50258eaf0b02646a174f" - integrity sha512-GYxba83AU59wARkWJen5BnmzdqSRT3IFg0gg3CZ4Dq4NgEKoN9Pw2ISxyogvBgwDPdxFuN8QK6QExxm4rPBS/A== - dependencies: - "@react-types/progress" "^3.4.3" - "@react-types/shared" "^3.20.0" - -"@react-types/numberfield@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.6.0.tgz#7fb16e138180f278bed2f333c273cf72a26add76" - integrity sha512-Kg+7CQYj2FY78zmYDK6kxZYu1/JNfkptsu0lhBJKcsQenXZc6CSZyiFpVZN7T+fQGnX0YbAcUQp9MOt5tbZcGg== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/overlays@^3.8.2": - version "3.8.2" - resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.2.tgz#1411e0a1626f4140de0ce67835f24a6a18f8d5de" - integrity sha512-HpLYzkNvuvC6nKd06vF9XbcLLv3u55+e7YUFNVpgWq8yVxcnduOcJdRJhPaAqHUl6iVii04mu1GKnCFF8jROyQ== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/progress@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.4.3.tgz#70be9231ede045a5b377438d5a352c1d9f245a63" - integrity sha512-g0HrxOf3ubQ4Tp9jwOMhl+WOd4cYh/cCwO6B8LFKw0m5erJWh5VdlyBql+5rmQmYWUaG8RcWyfnKY1C6WShl1g== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/radio@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.5.1.tgz#11cdf4eb54ba54a5720828e7b6d0739d4943a767" - integrity sha512-jPF8zt+XdgW9DaTvB5ZYCh0uk7DVko1VZ/jOlCRs82w3P884Wc7MMpwdl1T5PBdhtLcdr+xjM1YI6/31reIBfQ== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/searchfield@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.0.tgz#8b1d1c9554c4be20b7c28f91270dd6492a724759" - integrity sha512-llp3K3Z0e7tCLyiYQilAl4XJZiuXr+G9dboogU0ypLeIwMW69b9OgQx2KzLILN/CdtNqN6PBpBXMPnG+mHCcqg== - dependencies: - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" - -"@react-types/select@^3.8.3": - version "3.8.3" - resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.8.3.tgz#18888bf42cae6e89e1dc4b5112c08382152bf650" - integrity sha512-x0x/qJq48QqVnBXFqvPaiS/TQOmCIL9ZmzM4AzRtYMU++kxjy3L03cdnzDBmxKN+KkfDn7OU++vKI44ksgTCRA== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/shared@^3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.20.0.tgz#15f0cbe3978831589f083c8e316810669b4fa606" - integrity sha512-lgTO/S/EMIZKU1EKTg8wT0qYP5x/lZTK2Xw6BZZk5c4nn36JYhGCRb/OoR/jBCIeRb2x9yNbwERO6NYVkoQMSw== - -"@react-types/slider@^3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.6.1.tgz#337570fc19879df5b88f4f84d4df3eada11ddede" - integrity sha512-K234amXGLfDekJOQimhPpd2OE14Set7+LrzZZx1ut5ayIK3QgeneUqaybQcB7plfO1thNaAoDOy7JPqZ13k1JA== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/switch@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.4.1.tgz#3475ee497cb0bba491c47d0594cf9a62df823c70" - integrity sha512-2XfPsu2Yiap+pthO2rvCNlLjzo9mDejrYY3rsYMw/jLzCHvuR8Xe2/l01svHcq3pVuNIMElqZR4vTq9OvGNBnQ== - dependencies: - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - -"@react-types/table@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.8.1.tgz#915a54a0153386a676e7fba05d795ad3787dd385" - integrity sha512-zUZ0jTnTBz0JWhnbz7U0LnnKqGhPvmQz+xyADrBIrgj8hk1jQdWNTwAFwqUg8uaReSy+9b3jjPPNOnpTu9DmgA== - dependencies: - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - -"@react-types/tabs@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.2.tgz#54bdf0b690e8880d1155c5b931ebe2244ef07e38" - integrity sha512-eC6gGKH+Z2sCaHsCsSqT6gDE9E0ghbxL5d/yBjJ8VHxXkNLvM6dXwoYaEhA2JEdQqf0vC/7bZdjI3swV63DgKg== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/textfield@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.8.0.tgz#aa5d87482d613916818e1c1c61059bc69b1b63e1" - integrity sha512-KRIEiIaB7pi0VlyOXNv39qeY0nBVmaXHwReCmEktQxKtXQ5lbEU6pvbc6srMZIplJffutQCZSXAucw/2ewLLVQ== - dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/tooltip@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.4.tgz#c528e876c7fa31a209f05e1ee8ced269da5c440a" - integrity sha512-pEy4eKWXV9IW/h76dzEPRDJdPyYGis4OoJC1BYHjDRILq0kV1F/lzCJaL29f5VHkYOTIHmwaEMbDX3m7OSJjrw== - dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - -"@redux-devtools/app@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/app/-/app-4.0.0.tgz#cf1c1f965b190029c318e7589b3d49186b53e428" - integrity sha512-fvPYQcEGIwLD+yysaCm4hRSS3sJkNc8biOA7s1WIe7B0jFBIAFmCOT98m0+QcNMfO9pv6LBIcvlNAeha/oFpFw== - dependencies: - "@babel/runtime" "^7.22.11" - "@redux-devtools/chart-monitor" "^4.0.0" - "@redux-devtools/core" "^3.13.0" - "@redux-devtools/inspector-monitor" "^4.0.0" - "@redux-devtools/inspector-monitor-test-tab" "^2.0.0" - "@redux-devtools/inspector-monitor-trace-tab" "^2.0.0" - "@redux-devtools/log-monitor" "^4.0.2" - "@redux-devtools/rtk-query-monitor" "^3.1.1" - "@redux-devtools/slider-monitor" "^4.0.0" - "@redux-devtools/ui" "^1.3.0" - "@reduxjs/toolkit" "^1.9.5" - "@types/prop-types" "^15.7.5" - d3-state-visualizer "^2.0.0" - javascript-stringify "^2.1.0" - jsan "^3.1.14" - jsondiffpatch "^0.5.0" - localforage "^1.10.0" - lodash "^4.17.21" - prop-types "^15.8.1" - react-icons "^4.10.1" - react-is "^18.2.0" - react-redux "^8.1.2" - redux "^4.2.1" - redux-persist "^6.0.0" - socketcluster-client "^17.2.2" - -"@redux-devtools/chart-monitor@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/chart-monitor/-/chart-monitor-4.0.0.tgz#4735c198f3bc034213b6e86225d053eadff7f2cc" - integrity sha512-ZxcYQ5JKs3HGS4AO5fYFN5OKPQ8w41uTRA6fU15Wf5qqv6oHDmDycgTlx2KHNDxVBS0QXa7PS83qiwL1SmGZrA== - dependencies: - "@babel/runtime" "^7.20.6" - "@types/redux-devtools-themes" "^1.0.0" - d3-state-visualizer "^2.0.0" - deepmerge "^4.2.2" - redux-devtools-themes "^1.0.0" - -"@redux-devtools/cli@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@redux-devtools/cli/-/cli-3.0.2.tgz#a9b19f697c5bf5c60673e957cdb70f57cf1c4d97" - integrity sha512-hJ0Tk0oqMUSN/eRCZtSzRR0l7Svb2o7AOHoaYX3T50ggp2ispIa2to3bNmCpusCwnbp7VkA4RpmOKrSWd3tYcw== +"@redux-devtools/cli@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/cli/-/cli-3.0.2.tgz#a9b19f697c5bf5c60673e957cdb70f57cf1c4d97" + integrity sha512-hJ0Tk0oqMUSN/eRCZtSzRR0l7Svb2o7AOHoaYX3T50ggp2ispIa2to3bNmCpusCwnbp7VkA4RpmOKrSWd3tYcw== dependencies: "@apollo/server" "^4.9.3" "@redux-devtools/app" "^4.0.0" @@ -4168,63 +2944,63 @@ styled-components "^5.3.11" uuid "^9.0.0" -"@redux-devtools/core@^3.13.0", "@redux-devtools/core@^3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@redux-devtools/core/-/core-3.13.1.tgz#2abd94c99be1c7d3941c428667f722aa9d56012f" - integrity sha512-VZbma4b28D7dLn6rKTxx4r1KJrgiT2EQNF4vjkpTlXTu0cQcHkEcAO9ixMBj6rZGrT/jinCHq8gBy2bWgnDvcA== +"@redux-devtools/core@^3.13.2", "@redux-devtools/core@^3.13.3": + version "3.13.3" + resolved "https://registry.yarnpkg.com/@redux-devtools/core/-/core-3.13.3.tgz#4e7ff3c98875e567874e33bd1ce95784e8d945af" + integrity sha512-VVw6NS4vQK++XWrONk6TxkqaVtHz6H07eWrrPZfBAaVtk3AWvZK+ZIZlGhXt7Ls3h7A7NntW8VeVHwKo1M8+8A== dependencies: - "@babel/runtime" "^7.18.3" - "@redux-devtools/instrument" "^2.1.0" - "@types/prop-types" "^15.7.5" + "@babel/runtime" "^7.23.2" + "@redux-devtools/instrument" "^2.1.1" + "@types/prop-types" "^15.7.9" lodash "^4.17.21" prop-types "^15.8.1" -"@redux-devtools/inspector-monitor-test-tab@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor-test-tab/-/inspector-monitor-test-tab-2.0.0.tgz#d823149ffe8720d7b9fe359a22841e0e738739db" - integrity sha512-6hi7WqUc/pGO7UtdwCnQngSdijsxG34Ou00/Wuu/yyZfw8WU7jib21LVRiSpo8UFwSeSGkc4YYKgGmS+NpAW0A== +"@redux-devtools/inspector-monitor-test-tab@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor-test-tab/-/inspector-monitor-test-tab-2.0.1.tgz#cf6eb536811f7b5ac7273a5bfa5241782d4fec08" + integrity sha512-qf0+eMfR80roL+PD5lNTOIbzTxSjzTTVW1fRvfWGiAKbQqiDrhTU4pTCtwhVDH4vdDuxh16+1LkELU67PN+6xQ== dependencies: - "@babel/runtime" "^7.22.10" + "@babel/runtime" "^7.23.2" "@redux-devtools/ui" "^1.3.0" - "@types/prop-types" "^15.7.5" + "@types/prop-types" "^15.7.9" es6template "^1.0.5" javascript-stringify "^2.1.0" jsan "^3.1.14" object-path "^0.11.8" prop-types "^15.8.1" - react-icons "^4.10.1" - simple-diff "^1.7.1" + react-icons "^4.11.0" + simple-diff "^1.7.2" -"@redux-devtools/inspector-monitor-trace-tab@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor-trace-tab/-/inspector-monitor-trace-tab-2.0.0.tgz#340019b887b141d387b145e42febd6191732835c" - integrity sha512-F5yS0cWZqcxNekZ+63HvJJ8S6uoY045uEJHA/IjuffHpZcTfZJoqs0uBAzPrg+y+TlUyGQ8hlT6H+sSJS1KHdA== +"@redux-devtools/inspector-monitor-trace-tab@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor-trace-tab/-/inspector-monitor-trace-tab-2.0.1.tgz#de3d94562f27d473623e089c6460f142aeeb5352" + integrity sha512-wRjCgC1oNH+J/t4x7WCOQ1qSHvxMHYk2HIf9ClzTuqd3as017CaS7nsGZwTgGZ+ttpB8aNP3NPBJRwuWWx7OUQ== dependencies: - "@babel/code-frame" "^8.0.0-alpha.2" - "@babel/runtime" "^7.22.10" - "@types/chrome" "^0.0.243" + "@babel/code-frame" "^8.0.0-alpha.4" + "@babel/runtime" "^7.23.2" + "@types/chrome" "^0.0.248" anser "^2.1.1" html-entities "^2.4.0" path-browserify "^1.0.1" redux-devtools-themes "^1.0.0" source-map "^0.5.7" -"@redux-devtools/inspector-monitor@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor/-/inspector-monitor-4.0.0.tgz#4caa80937cd4b69ca3d412feb5bd718015fd1419" - integrity sha512-P0xXjv/N02dPQAaa+fSY2de6adFP+QdGaJZN+raWbWAoIB4SMYuxOlsEBWdclbTTpFBqYp0azpLTfy1vJroRPg== +"@redux-devtools/inspector-monitor@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@redux-devtools/inspector-monitor/-/inspector-monitor-4.0.1.tgz#1285391e7297b25f6c11c0d310484bf60632cf2b" + integrity sha512-mgpVYCusxH05jMz2w4n+tEf0+COKmw4J8Y+9S034Rrn3ODG92CT/mOT3YztbAeXNVv17rOgck/0ciMWfFGGBaA== dependencies: - "@babel/runtime" "^7.22.10" + "@babel/runtime" "^7.23.2" "@dnd-kit/core" "^6.0.8" "@dnd-kit/modifiers" "^6.0.1" "@dnd-kit/sortable" "^7.0.2" "@dnd-kit/utilities" "^3.2.1" - "@types/lodash" "^4.14.197" - "@types/prop-types" "^15.7.5" - "@types/redux-devtools-themes" "^1.0.0" + "@types/lodash" "^4.14.200" + "@types/prop-types" "^15.7.9" + "@types/redux-devtools-themes" "^1.0.2" dateformat "^5.0.3" hex-rgba "^1.0.2" - immutable "^4.3.2" + immutable "^4.3.4" javascript-stringify "^2.1.0" jsondiffpatch "^0.5.0" jss "^10.10.0" @@ -4235,23 +3011,23 @@ react-json-tree "^0.18.0" redux-devtools-themes "^1.0.0" -"@redux-devtools/instrument@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@redux-devtools/instrument/-/instrument-2.1.0.tgz#78c9553225b0eb655128abff8efa8d41384c0a0c" - integrity sha512-e8fo88kuq/zWqfNf6S/GNfaQMjF4WSPpucmYfRhzZyyXHC3PCLd/xgz7zooPErDh9QwUXK6sTVYvrkq7hPbsFA== +"@redux-devtools/instrument@^2.1.0", "@redux-devtools/instrument@^2.1.1": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/instrument/-/instrument-2.1.2.tgz#fe66ad414fe37bfc5f02a0489cc60f039a687fc2" + integrity sha512-MMA6BzJkrqPmDpGxyegO/GLCVGLF1vhphGArYZkfP8sDLBp2RxFprdH2fcUsyJZQC4WxAd5pIRJzr7mynOb2lg== dependencies: - "@babel/runtime" "^7.16.7" + "@babel/runtime" "^7.23.2" lodash "^4.17.21" "@redux-devtools/log-monitor@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@redux-devtools/log-monitor/-/log-monitor-4.0.2.tgz#94bb1a8981f5a7fbeecb5d1b6d5b08bd82872b2f" - integrity sha512-BaTAwadm/XzRfnN2+8t4mwdbOILWfwsvMfVPn5OuE+NFaUG9pDKGoHRPCdMBaRdggDqqb5nlMgRCVdHzYftgVw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@redux-devtools/log-monitor/-/log-monitor-4.0.3.tgz#ed596e77f448b09e0751c42865cb4b4d2ce0eaeb" + integrity sha512-00qCh1y51PJEd/hop1iaEKqnG6zxUeVhv8/ZoxYAlCIvXmU0kEgQW9dHqFHatg3/FzuKY6a8huE9mUmeLwVj9g== dependencies: - "@babel/runtime" "^7.20.6" - "@types/lodash.debounce" "^4.0.7" - "@types/prop-types" "^15.7.5" - "@types/redux-devtools-themes" "^1.0.0" + "@babel/runtime" "^7.23.2" + "@types/lodash.debounce" "^4.0.8" + "@types/prop-types" "^15.7.9" + "@types/redux-devtools-themes" "^1.0.2" lodash.debounce "^4.0.8" prop-types "^15.8.1" react-json-tree "^0.18.0" @@ -4271,19 +3047,19 @@ socketcluster-client "^17.2.2" "@redux-devtools/rtk-query-monitor@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@redux-devtools/rtk-query-monitor/-/rtk-query-monitor-3.1.1.tgz#56b2b885b6166bd2e4a5acefd09bc9d8766ca8ae" - integrity sha512-A7kHvU0SY6iQeaLHq+Kcq8a4Z/NhLcwQ/DluP/E+6UU/OXbEtoPK7304qdFQtVG7HY7owdKQiJZrYns5Mi7ysw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/rtk-query-monitor/-/rtk-query-monitor-3.1.2.tgz#9c01ad0ad671775fab75ee167dde442b86232bdc" + integrity sha512-Yo2/em/15RlwZwGQlp6is9nJkxhKGNaKZ7Oal3KqRfMuXz3/R4UJr0WePQpJJ2BT6exXA6xQWXB0hwX52K9tIQ== dependencies: - "@babel/runtime" "^7.20.6" + "@babel/runtime" "^7.23.2" "@redux-devtools/ui" "^1.3.0" - "@types/lodash" "^4.14.191" - "@types/prop-types" "^15.7.5" - "@types/redux-devtools-themes" "^1.0.0" + "@types/lodash" "^4.14.200" + "@types/prop-types" "^15.7.9" + "@types/redux-devtools-themes" "^1.0.2" hex-rgba "^1.0.2" - immutable "^4.1.0" - jss "^10.9.2" - jss-preset-default "^10.9.2" + immutable "^4.3.4" + jss "^10.10.0" + jss-preset-default "^10.10.0" lodash.debounce "^4.0.8" prop-types "^15.8.1" react-base16-styling "^0.9.1" @@ -4299,14 +3075,14 @@ jsan "^3.1.14" "@redux-devtools/slider-monitor@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@redux-devtools/slider-monitor/-/slider-monitor-4.0.1.tgz#6ade96494fe9c9ef71dae67c7465c60de97f6cd5" - integrity sha512-pjHPYLG91GLRQVcNAIu3Colc6nIqR4mSQYN1MWUqP8nTAlkP1ihEN44KXxcnTUEzuSLRYm1YW3jsI5p4q3aXZA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/slider-monitor/-/slider-monitor-4.0.2.tgz#ea3c769645accb49010d41884095810e863cdca5" + integrity sha512-88WIk8wNilV1SbWCNgbBgLsdGV75N6F35tn0p+LzDcNiRviInqXnU52t5NUEagJfCMEl9jgjSt3xEvmm3X+X/w== dependencies: - "@babel/runtime" "^7.18.3" + "@babel/runtime" "^7.23.2" "@redux-devtools/ui" "^1.3.0" - "@types/prop-types" "^15.7.5" - "@types/redux-devtools-themes" "^1.0.0" + "@types/prop-types" "^15.7.9" + "@types/redux-devtools-themes" "^1.0.2" prop-types "^15.8.1" redux-devtools-themes "^1.0.0" @@ -4333,22 +3109,22 @@ simple-element-resize-detector "^1.3.0" "@redux-devtools/utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@redux-devtools/utils/-/utils-2.0.1.tgz#ad56340573f5c36ff26bc47937286282ec87466c" - integrity sha512-kyEFpSyFum8uGLXedzgTUhDJqGKh9o4gzxLalFGugbG+vzmoYl5x4YKV/sA/7/er63sMtH9/ZpsFFQkTEy6vfg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/utils/-/utils-2.0.2.tgz#4a7871234a82282ea68781d88b632290ebae0d4a" + integrity sha512-cGezZ313eeQwPR0XW5HzmZR9HuEyyBoLac3dMA6o+9aMq6c9qkhkDigeBKTW+QgAP+n8R3l1qUDLIglA4mOXoA== dependencies: - "@babel/runtime" "^7.18.3" - "@redux-devtools/core" "^3.13.1" + "@babel/runtime" "^7.23.2" + "@redux-devtools/core" "^3.13.3" "@redux-devtools/serialize" "^0.4.1" - "@types/get-params" "^0.1.0" + "@types/get-params" "^0.1.1" get-params "^0.1.2" - immutable "^4.1.0" + immutable "^4.3.4" jsan "^3.1.14" lodash "^4.17.21" - nanoid "^3.3.4" - redux "^4.2.0" + nanoid "^4.0.2" + redux "^4.2.1" -"@reduxjs/toolkit@1.9.6", "@reduxjs/toolkit@^1.9.5": +"@reduxjs/toolkit@1.9.6": version "1.9.6" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.6.tgz#fc968b45fe5b17ff90932c4556960d9c1078365a" integrity sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw== @@ -4358,6 +3134,16 @@ redux-thunk "^2.4.2" reselect "^4.1.8" +"@reduxjs/toolkit@^1.9.7": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6" + integrity sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" + "@remix-run/router@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" @@ -4545,9 +3331,9 @@ unplugin "1.0.1" "@sentry/cli@^2.17.0": - version "2.21.1" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.21.1.tgz#f01965d350d38a9f68f3b4de901002cdcf6838d2" - integrity sha512-iJGL818zHzVb129CNWLoZriymq2nrnhk1XqN4Fh0AMxYJcOICmXYKR8RSkLhhE1U1J1D77UzA+FyBhWHOFA82A== + version "2.21.5" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.21.5.tgz#9ee4c51b267ac5ba8cdbf9bb9d4e8b74410d9669" + integrity sha512-RqKBqE10pb7zh0G/YiYVdX/MqenDYIgLGcaCqbszTAfW2SSLyp9EczsnmHtRgO1fO1OQq76+gaK7UdC1TEIGqQ== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" @@ -4795,9 +3581,9 @@ cross-fetch "^3.0.4" "@stacks/stacks-blockchain-api-types@*", "@stacks/stacks-blockchain-api-types@^7.1.10": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.3.2.tgz#33838e96312c2be1df93dce1c76e6d584b966a39" - integrity sha512-1r0+eqEWOOo7UYrFq9HGbc02DVME3NVCW/45sNKPN31PkOMMaK59DHragPJ2QbxPFiutVDUCS924+48+o3+0Tw== + version "7.3.4" + resolved "https://registry.yarnpkg.com/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.3.4.tgz#6f9c0c17d8d91bc98073faac7d0401ae109c80ae" + integrity sha512-4IU1Hk0q5Ab3fI6pp527kG1GMmqVp8n5DgiBJ31uJxc9rtPo8zgFWXUAho/Nj+3gTflsbse0IhEU+/ZECpYYMQ== "@stacks/stacks-blockchain-api-types@6.3.4": version "6.3.4" @@ -4845,62 +3631,6 @@ sha.js "^2.4.11" smart-buffer "^4.1.0" -"@stacks/ui-core@7.3.0", "@stacks/ui-core@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@stacks/ui-core/-/ui-core-7.3.0.tgz#7d4dd4d60206e795ca6b7109dfbaea74f878fda2" - integrity sha512-q3ZBu2uk/MMFsBGNZ8aT6stbwqaHuQTatDwS2A8a1gM+Csb/souJD6uY0Nf3R/z4IDCUGT6SYlvd8+lYgTAxzA== - dependencies: - "@styled-system/should-forward-prop" "^5.1.5" - camelcase "^6.0.0" - micro-memoize "^4.0.9" - -"@stacks/ui-theme@7.5.0", "@stacks/ui-theme@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@stacks/ui-theme/-/ui-theme-7.5.0.tgz#39949295935f37ab0694e1f16067679c268a3d51" - integrity sha512-lS83ApLE5lwizR59RgUoqeXNu3yolSwOjVO5p8ySTAU3M2bhOk5FCroSXYRpMuz20bRRdqyaOWCYJt+xP1sNUA== - dependencies: - type-fest "^0.21.3" - typescript "^4.1.2" - -"@stacks/ui-utils@7.5.0", "@stacks/ui-utils@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@stacks/ui-utils/-/ui-utils-7.5.0.tgz#1a1753a02f2a62e732b0d9f31897665a89c7a6f6" - integrity sha512-g2DaH1h3/nd+Cx99S5l37nv3Fuzbbc0NGlD4zY/XSzbfH2lpXwCfZDwj2Vz74H9vjPuGGiJ8Y48+0BxScKWPSw== - dependencies: - "@blockstack/stacks-blockchain-api-types" "^0.53.1" - "@stacks/ui-theme" "^7.5.0" - "@types/big.js" "^6.0.2" - big.js "^6.0.3" - c32check "^1.1.2" - type-fest "^0.21.3" - typescript "^4.1.2" - -"@stacks/ui@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@stacks/ui/-/ui-7.10.0.tgz#566ffab83f72fac63d312e91d796271eb37c2639" - integrity sha512-xZpXoDFlD3Wy9HIFWt6ZjfEAYcpWR+3HUMqqRvtwFE2TGOVXFaqDEerNia0x1MpKsXgT5rm80E6/KK79luaYYA== - dependencies: - "@reach/alert" "^0.13.2" - "@reach/auto-id" "^0.13.2" - "@reach/rect" "^0.13.2" - "@react-spectrum/utils" "^3.5.1" - "@stacks/ui-core" "^7.3.0" - "@stacks/ui-theme" "^7.5.0" - "@stacks/ui-utils" "^7.5.0" - "@styled-system/should-forward-prop" "^5.1.5" - "@styled-system/theme-get" "^5.1.2" - "@tippyjs/react" "^4.2.4" - color "3.1.3" - prism-react-renderer "^1.2.0" - prismjs "^1.23.0" - react-aria "^3.4.0" - react-hotkeys-hook "^2.4.0" - react-transition-group "^4.4.1" - spinners-react "npm:spinners-react-peer-deps-fix@1.0.5" - type-fest "^0.21.3" - use-events "^1.4.1" - use-onclickoutside "npm:use-onclickoutside-peer-deps@0.3.1" - "@stacks/wallet-sdk@6.9.0": version "6.9.0" resolved "https://registry.yarnpkg.com/@stacks/wallet-sdk/-/wallet-sdk-6.9.0.tgz#f687c7ec4a83bc9e9bb1d73876e9ef1d4a348a6a" @@ -5779,27 +4509,6 @@ resolved "https://registry.yarnpkg.com/@stitches/react/-/react-1.2.8.tgz#954f8008be8d9c65c4e58efa0937f32388ce3a38" integrity sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA== -"@styled-system/background@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba" - integrity sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/border@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/border/-/border-5.1.5.tgz#0493d4332d2b59b74bb0d57d08c73eb555761ba6" - integrity sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/color@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/color/-/color-5.1.2.tgz#b8d6b4af481faabe4abca1a60f8daa4ccc2d9f43" - integrity sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA== - dependencies: - "@styled-system/core" "^5.1.2" - "@styled-system/core@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@styled-system/core/-/core-5.1.2.tgz#b8b7b86455d5a0514f071c4fa8e434b987f6a772" @@ -5807,99 +4516,13 @@ dependencies: object-assign "^4.1.1" -"@styled-system/css@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/css/-/css-5.1.5.tgz#0460d5f3ff962fa649ea128ef58d9584f403bbbc" - integrity sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A== - -"@styled-system/flexbox@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/flexbox/-/flexbox-5.1.2.tgz#077090f43f61c3852df63da24e4108087a8beecf" - integrity sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/grid@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/grid/-/grid-5.1.2.tgz#7165049877732900b99cd00759679fbe45c6c573" - integrity sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/layout@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/layout/-/layout-5.1.2.tgz#12d73e79887e10062f4dbbbc2067462eace42339" - integrity sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/position@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/position/-/position-5.1.2.tgz#56961266566836f57a24d8e8e33ce0c1adb59dd3" - integrity sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/shadow@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/shadow/-/shadow-5.1.2.tgz#beddab28d7de03cd0177a87ac4ed3b3b6d9831fd" - integrity sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/should-forward-prop@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz#c392008c6ae14a6eb78bf1932733594f7f7e5c76" - integrity sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q== - dependencies: - "@emotion/is-prop-valid" "^0.8.1" - "@emotion/memoize" "^0.7.1" - styled-system "^5.1.5" - -"@styled-system/space@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/space/-/space-5.1.2.tgz#38925d2fa29a41c0eb20e65b7c3efb6e8efce953" - integrity sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/theme-get@5.1.2", "@styled-system/theme-get@^5.1.2": +"@styled-system/theme-get@5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@styled-system/theme-get/-/theme-get-5.1.2.tgz#b40a00a44da63b7a6ed85f73f737c4defecd6049" integrity sha512-afAYdRqrKfNIbVgmn/2Qet1HabxmpRnzhFwttbGr6F/mJ4RDS/Cmn+KHwHvNXangQsWw/5TfjpWV+rgcqqIcJQ== dependencies: "@styled-system/core" "^5.1.2" -"@styled-system/typography@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/typography/-/typography-5.1.2.tgz#65fb791c67d50cd2900d234583eaacdca8c134f7" - integrity sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/variant@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/variant/-/variant-5.1.5.tgz#8446d8aad06af3a4c723d717841df2dbe4ddeafd" - integrity sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw== - dependencies: - "@styled-system/core" "^5.1.2" - "@styled-system/css" "^5.1.5" - -"@swc/helpers@^0.4.14": - version "0.4.36" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.36.tgz#fcfff76ed52c214f357e8e9d3f37b568908072d9" - integrity sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q== - dependencies: - legacy-swc-helpers "npm:@swc/helpers@=0.4.14" - tslib "^2.4.0" - -"@swc/helpers@^0.5.0": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== - dependencies: - tslib "^2.4.0" - "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -5964,7 +4587,7 @@ "@tanstack/query-core" "4.35.7" use-sync-external-store "^1.2.0" -"@tippyjs/react@4.2.6", "@tippyjs/react@^4.2.4": +"@tippyjs/react@4.2.6": version "4.2.6" resolved "https://registry.yarnpkg.com/@tippyjs/react/-/react-4.2.6.tgz#971677a599bf663f20bb1c60a62b9555b749cc71" integrity sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw== @@ -5982,9 +4605,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@trivago/prettier-plugin-sort-imports@^4.2.0": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.2.1.tgz#a4f57df41a46803a75bd8e8ce371b29e78a27eb4" - integrity sha512-iuy2MPVURGdxILTchHr15VAioItuYBejKfcTmQFlxIuqA7jeaT6ngr5aUIG6S6U096d6a6lJCgaOwlRrPLlOPg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== dependencies: "@babel/generator" "7.17.7" "@babel/parser" "^7.20.5" @@ -6029,9 +4652,9 @@ integrity sha512-qsRg9ajsh47cVb23KhjBe3aa07QzEfPc6oxbbggrkdbi5qHC4tyyHHWcJJeYNlK7dfe6dpg0mwcYWAN9ZIJpMQ== "@types/babel__core@^7.20.1": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" - integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" + integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -6040,41 +4663,36 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" - integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== + version "7.6.7" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" - integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" - integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: "@babel/types" "^7.20.7" "@types/base16@*", "@types/base16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/base16/-/base16-1.0.3.tgz#b90f8363bab3b02f4bf848ca6b120ace2e810201" - integrity sha512-rjrIWFr73ylMjEQuU1OQjkoIDcLR2/dIwiopZe2S5ASo5eoSYBxaAnGtwTUhWc5oWefQXxHRFmGDelYR5yMcgA== - -"@types/big.js@^6.0.2": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.2.0.tgz#e1f6a9a6ce64bc7c131137e71fbad34a5574f987" - integrity sha512-ubLURWoc4tCw/8Yds0P3CE9cBG5q+aoycwWBiXXx4gp7XPYZy9ch0L9+Pv6osSoSRgvuQNqJdlwEhP5QhKKl6w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/base16/-/base16-1.0.5.tgz#9a7df8eed525c6968d254dada2a2f653a28e73f6" + integrity sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A== "@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e" - integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg== + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== dependencies: "@types/node" "*" @@ -6086,17 +4704,17 @@ "@types/node" "*" "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" @@ -6111,16 +4729,16 @@ "@types/responselike" "^1.0.0" "@types/chai-subset@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" - integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.5.tgz#3fc044451f26985f45625230a7f22284808b0a9a" + integrity sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.3.5": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" - integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== + version "4.3.10" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.10.tgz#2ad2959d1767edee5b0e4efb1a0cd2b500747317" + integrity sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg== "@types/chroma-js@2.4.1": version "2.4.1" @@ -6135,222 +4753,222 @@ "@types/filesystem" "*" "@types/har-format" "*" -"@types/chrome@^0.0.243": - version "0.0.243" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.243.tgz#a6752af287195b4abe0dfb72a172fcd728617c06" - integrity sha512-4PHv0kxxxpZFHWPBiJJ9TWH8kbx0567j1b2djnhpJjpiSGNI7UKkz7dSEECBtQ0B3N5nQTMwSB/5IopkWGAbEA== +"@types/chrome@^0.0.248": + version "0.0.248" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.248.tgz#fdc188a4b7ab8cfd2c49cb666214ecab81599002" + integrity sha512-qtBzxZD1v3eWZn8XxH1i07pAhzJDHnxJBBVy7bmntXxXKxjzNXYxD41teqa5yOcX/Yy8brRFGZESEzGoINvBDg== dependencies: "@types/filesystem" "*" "@types/har-format" "*" "@types/clean-css@*": - version "4.2.7" - resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.7.tgz#e3fe72f63104a52ca7eba7b3542d3bfc1897f56a" - integrity sha512-lcoZHjUAANLTACLGi+O/0pN+oKQAQ8zAMWJSxiBRNLxqZG/WE8hfXJUs1eYwJOvOnDJrvxU1kR77UiVJ3+9N0Q== + version "4.2.10" + resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.10.tgz#eb8a4e0006b5b984bf5996f185e550b4d6640f5c" + integrity sha512-/wop6SNAATELCIvTQEbPdxaIvXQDS+Gewx2rtkB1h8PrttLpYVDI18nH9927fIMO1dJsV01JEm0go4vTimpDxQ== dependencies: "@types/node" "*" source-map "^0.6.0" "@types/codemirror@^5.60.5": - version "5.60.10" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.10.tgz#ac836a3ac20483988a0507cdbbaeb6ee0affa1e6" - integrity sha512-ZTA3teiCWKT8HUUofqlGPlShu5ojdIajizsS0HpH6GL0/iEdjRt7fXbCLHHqKYP5k7dC/HnnWIjZAiELUwBdjQ== + version "5.60.13" + resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.13.tgz#faffaf7f6b866239f5dc0f6b55fc4d04ce884790" + integrity sha512-qLWcKUwYDYB7mZpE++0Jn3i1TJ2GW8nlhALRAfjaKgb1HRnk2qcNqWxZ+BpPY1h4n4IQT0foThaOxWHxEL8MnQ== dependencies: "@types/tern" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz#7793aa2160cef7db0ce5fe2b8aab621200f1a470" + integrity sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/d3-array@*": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.8.tgz#a5d0687a12b48142c6f124d5e3796054e91bcea5" - integrity sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== "@types/d3-axis@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.4.tgz#0e1b380ca92b825f8b07402c8ba88b702e7de0b1" - integrity sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== dependencies: "@types/d3-selection" "*" "@types/d3-brush@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.4.tgz#dbbd71a980c7fd198771e4ae79ccba75debdc76f" - integrity sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== dependencies: "@types/d3-selection" "*" "@types/d3-chord@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.4.tgz#7f2a3174bfa3dd94e0caa2111b8ce24d1dd2a5cd" - integrity sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== "@types/d3-color@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.1.tgz#43a2aa7836fdae19ce32fabe97742e787f4b2e08" - integrity sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== "@types/d3-contour@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.4.tgz#8e7cf6435000aaf9f1049267dcd67b18c9922b2e" - integrity sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: "@types/d3-array" "*" "@types/geojson" "*" "@types/d3-delaunay@*": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz#ef2a4ae56058dee00ebce7f110806a4efdf56389" - integrity sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A== + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== "@types/d3-dispatch@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz#bac9eb26e49b235ac731a398b9596abc1fb76a3a" - integrity sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" + integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== "@types/d3-drag@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.4.tgz#8d31aaf565b6b146d370eb511805c18541c1a748" - integrity sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== dependencies: "@types/d3-selection" "*" "@types/d3-dsv@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.4.tgz#f2706ed90f72e8c16d3858b3c3060dfd47b7f161" - integrity sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== "@types/d3-ease@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" - integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== "@types/d3-fetch@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.4.tgz#e54ab1286f859c8f0edb261c3ce4b155a3232c37" - integrity sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== dependencies: "@types/d3-dsv" "*" "@types/d3-force@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.6.tgz#7898d7fd2618fba65058ee83baaf7d79a8c047c5" - integrity sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw== + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.9.tgz#dd96ccefba4386fe4ff36b8e4ee4e120c21fcf29" + integrity sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA== "@types/d3-format@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.2.tgz#1416669e1ae3fd924bdbb6c80901be45f3a3cea6" - integrity sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== "@types/d3-geo@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.5.tgz#4407202458b306c97c90c9a5271b3b7e1fc687af" - integrity sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== dependencies: "@types/geojson" "*" "@types/d3-hierarchy@*": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz#4e0b6679895e3a0ce14b93d63ba158183801b776" - integrity sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ== + version "3.1.6" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz#8d3638df273ec90da34b3ac89d8784c59708cb0d" + integrity sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw== "@types/d3-interpolate@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz#b5928cca26fc20dbfe689ff37d62f7bac434c74e" - integrity sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== dependencies: "@types/d3-color" "*" "@types/d3-path@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" - integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.2.tgz#4327f4a05d475cf9be46a93fc2e0f8d23380805a" + integrity sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA== "@types/d3-polygon@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.0.tgz#5200a3fa793d7736fa104285fa19b0dbc2424b93" - integrity sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== "@types/d3-quadtree@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz#b6f03b436e7f023100f24fbee5f8c8821fc9b456" - integrity sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.5.tgz#2bc3884742e8b53dbc41175b0720373f3aae04a2" + integrity sha512-Cb1f3jyNBnvMMkf4KBZ7IgAQVWd9yzBwYcrxGqg3aPCUgWELAS+nyeB7r76aqu1e3+CGDjhk4BrWaFBekMwigg== "@types/d3-random@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.1.tgz#5c8d42b36cd4c80b92e5626a252f994ca6bfc953" - integrity sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== "@types/d3-scale-chromatic@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" - integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.2.tgz#e44c0031d0a8fb6efff8b17b0c4a2e680741cdaf" + integrity sha512-kpKNZMDT3OAX6b5ct5nS/mv6LULagnUy4DmS6yyNjclje1qVe7vbjPwY3q1TGz6+Wr2IUkgFatCzqYUl54fHag== "@types/d3-scale@*": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.5.tgz#daa4faa5438315a37a1f5eb1bcdc5aeb3d3e5a2d" - integrity sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== dependencies: "@types/d3-time" "*" "@types/d3-selection@*": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.7.tgz#c710b42de8dfa9f8927a3ed99c38ec3ce682bb8b" - integrity sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.10.tgz#98cdcf986d0986de6912b5892e7c015a95ca27fe" + integrity sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg== "@types/d3-shape@*": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.3.tgz#20eee7aad70f2562041af18e305fec6b48fd511d" - integrity sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.5.tgz#ab2f9c1485667be729b68bf2d9219858bc6d4009" + integrity sha512-dfEWpZJ1Pdg8meLlICX1M3WBIpxnaH2eQV2eY43Y5ysRJOTAV9f3/R++lgJKFstfrEOE2zdJ0sv5qwr2Bkic6Q== dependencies: "@types/d3-path" "*" "@types/d3-time-format@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.1.tgz#c47d933c2998ddc61a3133da64c0b8f0a5ecdefa" - integrity sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== "@types/d3-time@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.1.tgz#f0c8f9037632cc4511ae55e7e1459dcb95fb3619" - integrity sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== "@types/d3-timer@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" - integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== "@types/d3-transition@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.5.tgz#354e8c60650c76c2249cd7b99055b344672c71aa" - integrity sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg== + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.8.tgz#677707f5eed5b24c66a1918cde05963021351a8f" + integrity sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ== dependencies: "@types/d3-selection" "*" "@types/d3-zoom@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.5.tgz#3cc09d38add8231ecaa710ec053e876896e9b865" - integrity sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== dependencies: "@types/d3-interpolate" "*" "@types/d3-selection" "*" "@types/d3@^7.4.0": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.1.tgz#0168b616fa551d99e4534d0cbdeb50844c92b597" - integrity sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA== + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== dependencies: "@types/d3-array" "*" "@types/d3-axis" "*" @@ -6384,23 +5002,23 @@ "@types/d3-zoom" "*" "@types/debug@^4.0.0": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" - integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/decompress@*": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@types/decompress/-/decompress-4.2.5.tgz#07ed5b350303b945017692e87a653a09df166915" - integrity sha512-LdL+kbcKGs9TzvB/K+OBGzPfDoP6gwwTsykYjodlzUJUUYp/43c1p1jE5YTtz3z4Ml90iruvBXbJ6+kDvb3WSQ== + version "4.2.7" + resolved "https://registry.yarnpkg.com/@types/decompress/-/decompress-4.2.7.tgz#604f69b69d519ecb74dea1ea0829f159b85e1332" + integrity sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g== dependencies: "@types/node" "*" "@types/dom-view-transitions@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/dom-view-transitions/-/dom-view-transitions-1.0.2.tgz#36c2cf08fd0b2b1d6892303cc9ec2e5da0a1c724" - integrity sha512-+ctRyzGMOZB5AbvhpTv37OWkP9N3Xxfac7bhS7AcuRMmO03SHxm5/5kWCPtcatx2gW+NhFMdl7l1DqJvvPVtwg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/dom-view-transitions/-/dom-view-transitions-1.0.4.tgz#b4310929488daa6baa8bba657404ea6e05724121" + integrity sha512-oDuagM6G+xPLrLU4KeCKlr1oalMF5mJqV5pDPMDVIEaa8AkUW00i6u+5P02XCjdEEUQJC9dpnxqSLsZeAciSLQ== "@types/dompurify@3.0.3": version "3.0.3" @@ -6419,37 +5037,37 @@ "@types/node" "*" "@types/elliptic@^6.4.12": - version "6.4.15" - resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.15.tgz#992ae323fd04ab03d884da7122e5dac1665c75ff" - integrity sha512-tW9Z/mrlymYEbx/WWcO/Kkly0VxqPNaf/p3KcZTYKI282ZX+50efZvY/p6FoMuTpFq+QMyABQNfs6OXvdmVUhQ== + version "6.4.17" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.17.tgz#6c9ff6ba137670c8bc3c65da2e23995b22ec3607" + integrity sha512-+NOzUIq9aenYuaIFS+8Gmv72r72zb12jttZsAsu4zEJ3QmQfGo958Kh0jQ+GJp5+uflE14KI4BcZqcsGCxTNFA== dependencies: "@types/bn.js" "*" "@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" - integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== + version "8.44.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" + integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -6457,9 +5075,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -6467,26 +5085,26 @@ "@types/serve-static" "*" "@types/filesystem@*": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.33.tgz#808e0048221426b30341a6b19a8193213c72ca55" - integrity sha512-2KedRPzwu2K528vFkoXnnWdsG0MtUwPjuA7pRy4vKxlxHEe8qUDZibYHXJKZZr2Cl/ELdCWYqyb/MKwsUuzBWw== + version "0.0.35" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.35.tgz#6d6766626083e2b397c09bdc57092827120db11d" + integrity sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ== dependencies: "@types/filewriter" "*" "@types/filewriter@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.30.tgz#1be7733877589d57c653b8356cefe5fe7c74b89e" - integrity sha512-lB98tui0uxc7erbj0serZfJlHKLNJHwBltPnbmO1WRpL5T325GOHRiQfr2E29V2q+S1brDO63Fpdt6vb3bES9Q== + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.32.tgz#3cf7e0f870e54e60ed1bbd9280fa24a9444d3b48" + integrity sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg== "@types/geojson@*": - version "7946.0.11" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.11.tgz#012c17cb2256ad8de78560da851ab914a7b9b40e" - integrity sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg== + version "7946.0.13" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.13.tgz#e6e77ea9ecf36564980a861e24e62a095988775e" + integrity sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ== -"@types/get-params@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@types/get-params/-/get-params-0.1.0.tgz#d1b982d04c0a5bdd91b77bdf6e65baacf0aa06d9" - integrity sha512-dlrC7vGuNvUCD4UXLTPqNSdSFHDa+n6wHmyKWP2OJXwtgY1A3Lttn5Dx7gmo00fg/xuuLILTuzI/1isDV/1V2Q== +"@types/get-params@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/get-params/-/get-params-0.1.2.tgz#815f80eceb0f0e2f0bb00a2527c9d2e6e57e2a52" + integrity sha512-ujqPyr1UDsOTDngJPV+WFbR0iHT5AfZKlNPMX6XOCnQcMhEqR+r64dVC/nwYCitqjR3DcpWofnOEAInUQmI/eA== "@types/glob@^7.1.1": version "7.2.0" @@ -6506,14 +5124,14 @@ form-data "^2.5.0" "@types/har-format@*": - version "1.2.13" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.13.tgz#7ef32562d433166e1ad14e3eb6fcf5c00c8a0ead" - integrity sha512-PwBsCBD3lDODn4xpje3Y1di0aDJp4Ww7aSfMRVw6ysnxD4I7Wmq2mBkSKaDtN403hqH5sp6c9xQUvFYY3+lkBg== + version "1.2.15" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" + integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== "@types/hast@^2.0.0": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" - integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.8.tgz#4ac5caf38b262b7bd5ca3202dda71f0271635660" + integrity sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ== dependencies: "@types/unist" "^2" @@ -6523,9 +5141,9 @@ integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.1": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#dc1e9ded53375d37603c479cc12c693b0878aa2a" - integrity sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -6536,9 +5154,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/html-minifier@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-4.0.3.tgz#614ad1112ea2fa41a1af1eb02ea3e43f3ddfff9f" - integrity sha512-e55KfPv+cXjd2AXwkuVfMw/hcJipNoS+JML+z3ijqzMHgc6F2iviWSEUx5tXQ6Yu5UtYtLH35ae2ftFsRJTmLA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/html-minifier/-/html-minifier-4.0.5.tgz#d6f64ffcf884f6c53ceb2f6ddbd8188f9badb6e9" + integrity sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew== dependencies: "@types/clean-css" "*" "@types/relateurl" "*" @@ -6553,20 +5171,20 @@ "@types/tapable" "^1" "@types/webpack" "^4" -"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" - integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" @@ -6580,9 +5198,9 @@ parse5 "^7.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.11", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -6601,10 +5219,10 @@ dependencies: "@types/node" "*" -"@types/lodash.debounce@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz#0285879defb7cdb156ae633cecd62d5680eded9f" - integrity sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA== +"@types/lodash.debounce@^4.0.8": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== dependencies: "@types/lodash" "*" @@ -6622,10 +5240,10 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*", "@types/lodash@^4.14.178", "@types/lodash@^4.14.191", "@types/lodash@^4.14.197": - version "4.14.199" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" - integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== +"@types/lodash@*", "@types/lodash@^4.14.178", "@types/lodash@^4.14.191", "@types/lodash@^4.14.200": + version "4.14.201" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.201.tgz#76f47cb63124e806824b6c18463daf3e1d480239" + integrity sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ== "@types/long@^4.0.0": version "4.0.2" @@ -6633,21 +5251,21 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/mdast@^3.0.0": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" - integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/mime@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" - integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== "@types/mime@^1": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" - integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/minimatch@*": version "5.1.2" @@ -6660,34 +5278,43 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.2": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/ms@*": - version "0.7.32" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" - integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/nlcst@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/nlcst/-/nlcst-1.0.2.tgz#dfcc9ef164e2d2a76ce7d249a9b909b7d0b7b616" - integrity sha512-ykxL/GDDUhqikjU0LIywZvEwb1NTYXTEWf+XgMSS2o6IXIakafPccxZmxgZcvJPZ3yFl2kdL1gJZz3U3iZF3QA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/nlcst/-/nlcst-1.0.4.tgz#3b8a9c279a2367602512588a0ba6a0e93634ee3e" + integrity sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg== dependencies: "@types/unist" "^2" "@types/node-fetch@^2.6.1": - version "2.6.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" - integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== + version "2.6.9" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.9.tgz#15f529d247f1ede1824f7e7acdaa192d5f28071e" + integrity sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA== dependencies: "@types/node" "*" form-data "^4.0.0" +"@types/node-forge@^1.3.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.9.tgz#0fe4a7ba69c0b173f56e6de65d0eae2c1dd4bbfe" + integrity sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ== + dependencies: + "@types/node" "*" + "@types/node@*": - version "20.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.7.1.tgz#06d732ead0bd5ad978ef0ea9cbdeb24dc8717514" - integrity sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg== + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== + dependencies: + undici-types "~5.26.4" "@types/node@20.8.2": version "20.8.2" @@ -6700,14 +5327,16 @@ integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/node@^18.0.4", "@types/node@^18.11.18": - version "18.18.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz#bd19d5133a6e5e2d0152ec079ac27c120e7f1763" - integrity sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw== + version "18.18.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.9.tgz#5527ea1832db3bba8eb8023ce8497b7d3f299592" + integrity sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/object-hash@3.0.4": version "3.0.4" @@ -6715,9 +5344,9 @@ integrity sha512-w4fEy2suq1bepUxHoJRCBHJz0vS5DPAYpSbcgNwOahljxwyJsiKmi8qyes2/TJc+4Avd7fsgP+ZgUuXZjPvdug== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/parse5@^6.0.0": version "6.0.3" @@ -6729,15 +5358,20 @@ resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.1.tgz#aae6739d8f0d14a3bc9e6dd83e6d791ad75d4d76" integrity sha512-Q7jDsRbzcNHIQje15CS/piKhu6lMLb9jwjxSfEIi4KcFKXW23GoJMkwQiJ8VObyfx+VmUaDcJxXaWN+cTCjVog== +"@types/prismjs@^1.26.0": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.3.tgz#47fe8e784c2dee24fe636cab82e090d3da9b7dec" + integrity sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw== + "@types/promise-memoize@1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/promise-memoize/-/promise-memoize-1.2.2.tgz#79253e6631a5d18d45636289be0463babc792aa8" integrity sha512-WAOgH35Jg+vQcSQqcEEJbHMVqIlngtDmZ+YJ19tW076fY+aGajj6jSI/1OQiZlXDzjAxibLrVTfeDmGb6PacUw== -"@types/prop-types@*", "@types/prop-types@^15.7.5": - version "15.7.7" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.7.tgz#f9361f7b87fd5d8188b2c998db0a1f47e9fb391a" - integrity sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog== +"@types/prop-types@*", "@types/prop-types@^15.7.5", "@types/prop-types@^15.7.9": + version "15.7.10" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" + integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== "@types/punycode@2.1.0": version "2.1.0" @@ -6752,21 +5386,21 @@ "@types/react" "*" "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.10" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" + integrity sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw== "@types/randombytes@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/randombytes/-/randombytes-2.0.1.tgz#9cd250685fcc5897ff0c2370856604519418d338" - integrity sha512-kWMqPyxpTUTofwbGN47MWddBFiJnWJlfLBdDg2NvmZSKHOmKY9ujVA3PIfBgXcIHTCpsqoQqYudBwanFXzGD9A== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/randombytes/-/randombytes-2.0.3.tgz#c83a107ef51ae7a8611a7b964f54b21cb782bbed" + integrity sha512-+NRgihTfuURllWCiIAhm1wsJqzsocnqXM77V/CalsdJIYSRGEHMnritxh+6EsBklshC+clo1KgnN14qgSGeQdw== dependencies: "@types/node" "*" "@types/range-parser@*": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" - integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-dom@18.2.8": version "18.2.8" @@ -6800,16 +5434,16 @@ "@types/react" "*" "@types/react-transition-group@^4.4.0": - version "4.4.7" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" - integrity sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg== + version "4.4.9" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.9.tgz#12a1a1b5b8791067198149867b0823fbace31579" + integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.2.21": - version "18.2.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.23.tgz#60ad6cf4895e93bed858db0e03bcc4ff97d0410e" - integrity sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA== + version "18.2.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" + integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -6824,17 +5458,17 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/redux-devtools-themes@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/redux-devtools-themes/-/redux-devtools-themes-1.0.1.tgz#7ad5a75195896cf28db4b8088868a4525549bc96" - integrity sha512-ilK4cM86BapqxmoT6ajpN9oEECyU8skWPV5gryaqMIa04+ZlzzabE8PAO98NhTnqVbMkBt8JISkMjr9H0yC/Ow== +"@types/redux-devtools-themes@^1.0.0", "@types/redux-devtools-themes@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/redux-devtools-themes/-/redux-devtools-themes-1.0.3.tgz#fd96db006b2b6ba133a1aff8ef3d520718aa0c4b" + integrity sha512-KqiQ2+6VTb1Yn02+ZNQsB0XcoJTu/W4AhnIUaeTnkVFie5YWMoeSpW4IOFYJ2/HJ+wi1kLw+PHDgjZ3t+M6IRw== dependencies: "@types/base16" "*" "@types/relateurl@*": - version "0.2.30" - resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.30.tgz#c2711bc978da74b2ed4ec3ff2eeaffb1d5a151fa" - integrity sha512-OzTBOmeBmS6FV7uFdbbUaE/rqWNcTrOTfRpDMWMczHa8nvNZi4exDD7d3ZKcxHH2GbgZ50dJkNhx9spRxSxmGg== + version "0.2.32" + resolved "https://registry.yarnpkg.com/@types/relateurl/-/relateurl-0.2.32.tgz#145d58cecb77c6b85868dd66208271ca408444d3" + integrity sha512-S3RXiF4jV2ECprVGfKLyRHbObSV2UOfpml1pHzqSgBLj/jd79siRtyR1Qyv/I57P079DVHaMOj4UwDOqYh3vQA== "@types/remote-redux-devtools@0.5.6": version "0.5.6" @@ -6844,14 +5478,14 @@ redux "^4.0.0" "@types/resolve@^1.17.0": - version "1.20.3" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.3.tgz#066742d69a0bbba8c5d7d517f82e1140ddeb3c3c" - integrity sha512-NH5oErHOtHZYcjCtg69t26aXEk4BN2zLWqf7wnDZ+dpe0iR7Rds1SPGEItl3fca21oOe0n3OCnZ4W7jBxu7FOw== + version "1.20.5" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.5.tgz#7923a0abbac4b6301d51f450db342bd4aff1ac84" + integrity sha512-aten5YPFp8G+cMpkTK5MCcUW5GlwZUby+qlt0/3oFgOCooFgzqvZQ9/0tROY49sUYmhEybBBj3jwpkQ/R3rjjw== "@types/responselike@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" - integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== dependencies: "@types/node" "*" @@ -6861,62 +5495,62 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== + version "0.16.6" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" + integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== "@types/semver@^7.5.0": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" - integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" + integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== "@types/send@*": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" - integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" - integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" - integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sha.js@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/sha.js/-/sha.js-2.4.2.tgz#0e5b96f7b20f0492b0a553026b555d82708789a3" - integrity sha512-NGwYSCPCwuZc4Mdf3M0PA9nEjLm16z17zYZTrFVnjAtPSrYN6eMkzup2jelkoe9piZdJq/WVaoTJxE+SyrJKEQ== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/sha.js/-/sha.js-2.4.4.tgz#36be3d0bbc02f790617181709831fd4fc4be942d" + integrity sha512-Qukd+D6S2Hm0wLVt2Vh+/eWBIoUt+wF8jWjBsG4F8EFQRwKtYvtXCPcNl2OEUQ1R+eTr3xuSaBYUyM3WD1x/Qw== dependencies: "@types/node" "*" "@types/simple-element-resize-detector@^1.3.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/simple-element-resize-detector/-/simple-element-resize-detector-1.3.1.tgz#4e493540732da3a3cce1e567580f6f463efda281" - integrity sha512-A4BdJWtQ+Rlks3ytMtuIRAgE+tlyVHZotLG+zCUDBzi3YO/ur8rpoQ7r+bV4O2czsZnor4gaEODmAUatr5aBOw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/simple-element-resize-detector/-/simple-element-resize-detector-1.3.3.tgz#e4452e26700658a6714f6198f84f724fe35eff54" + integrity sha512-igYpe5ApGMB7YGk2ZyyvrT1NwLYG7Q+8d78uskiS3qriHQa1fiFesibFTCDbGWhc9teD7RmGSuh9a1rzzXj9zg== "@types/sockjs@^0.3.33": - version "0.3.34" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" - integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" "@types/source-list-map@*": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.3.tgz#077e15c87fe06520e30396a533bd9848e735ce9b" - integrity sha512-I9R/7fUjzUOyDy6AFkehCK711wWoAXEaBi80AfjZt1lIkbe6AcXKd3ckQc3liMvQExWvfOeh/8CtKzrfUFN5gA== + version "0.1.5" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.5.tgz#1ec07192b889558a410833b237e595a906e5e349" + integrity sha512-cHBTLeIGIREJx839cDfMLKWao+FaJOlaPz4mnFHXUzShS8sXhzw6irhvIpYvp28TbTmTeAt3v+QgHMANsGbQtA== "@types/styled-system__theme-get@5.0.2": version "5.0.2" @@ -6924,38 +5558,38 @@ integrity sha512-tvGRyzADAn2qQ8Z/fw9YOBTL1EttDQ0zrmHq/N+/K/9tF1l2lsZ9334hls1zie32FCxjPJEhzzXVHxKwqXslog== "@types/tapable@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.9.tgz#1481a4236267dd2d0ca2a637adb90f0ccb3d69c4" - integrity sha512-fOHIwZua0sRltqWzODGUM6b4ffZrf/vzGUmNXdR+4DzuJP42PMbM5dLKcdzlYvv8bMJ3GALOzkk1q7cDm2zPyA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.11.tgz#934bb63dc2b1c869c4800970a64be236fb4f2947" + integrity sha512-R3ltemSqZ/TKOBeyy+GBfZCLX3AYpxqarIbUMNe7+lxdazJp4iWLFpmjgBeZoRiKrWNImer1oWOlG2sDR6vGaw== "@types/tern@*": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.5.tgz#8d369a06749ea83956885cb734788ec208a0e900" - integrity sha512-POau56wDk3TQ0mQ0qG7XDzv96U5whSENZ9lC0htDvEH+9YUREo+J2U+apWcVRgR2UydEE70JXZo44goG+akTNQ== + version "0.23.7" + resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.7.tgz#f3c27fb7d6db5e86d7f069e7d5124bfa677a5b2d" + integrity sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q== dependencies: "@types/estree" "*" "@types/tough-cookie@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" - integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/trusted-types@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" - integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.6.tgz#d12451beaeb9c3838f12024580dc500b7e88b0ad" + integrity sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg== "@types/uglify-js@*": - version "3.17.2" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.2.tgz#a2ba86fd524f6281a7655463338c546f845b29c3" - integrity sha512-9SjrHO54LINgC/6Ehr81NjAxAYvwEZqjUHLjJYvC4Nmr9jbLQCIZbWSvl4vXQkkmR1UAuaKDycau3O1kWGFyXQ== + version "3.17.4" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.4.tgz#3c70021f08023e5a760ce133d22966f200e1d31c" + integrity sha512-Hm/T0kV3ywpJyMGNbsItdivRhYNCQQf1IIsYsXnoVPES4t+FMLyDe0/K+Ea7ahWtMtSNb22ZdY7MIyoD9rqARg== dependencies: source-map "^0.6.1" "@types/unist@^2", "@types/unist@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== "@types/use-sync-external-store@^0.0.3": version "0.0.3" @@ -6967,20 +5601,15 @@ resolved "https://registry.yarnpkg.com/@types/valid-url/-/valid-url-1.0.5.tgz#452a8d2aa8206cd3c9f658496d8370d3a54f4f2a" integrity sha512-B7W2w+MHjn/lZB6WmCedyQgpIWa81dpEJD/rXkoYKOGJk0xsxgNWRXeGYMgY6ESvMxIPGfPq4lYbAgbj3hbLew== -"@types/warning@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.1.tgz#a62d1d2b7f34376da84ee0afe0145152e62b9699" - integrity sha512-ywJmriP+nvjBKNBEMaNZgj2irZHoxcKeYcyMLbqhYKbDVn8yCIULy2Ol/tvIb37O3IBeZj3RU4tXqQTtGwoAMg== - "@types/webextension-polyfill@0.10.4": version "0.10.4" resolved "https://registry.yarnpkg.com/@types/webextension-polyfill/-/webextension-polyfill-0.10.4.tgz#09feeb2d8f04ac0a28818ade8aeeb4ab9fbafebb" integrity sha512-pvEIqAZEbJRzaqTaWq3xlUoMWa3+euZHHz+VZHCzHWW+jOf8qLOq9wXy38U+WiPG3108SJC/wNc1X6vPC5TcjQ== "@types/webpack-sources@*": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.1.tgz#98670b35fa799c44ac235910f3fda9bfdcdbc2c6" - integrity sha512-iLC3Fsx62ejm3ST3PQ8vBMC54Rb3EoCprZjeJGI5q+9QjfDLGt9jeg/k245qz1G9AQnORGk0vqPicJFPT1QODQ== + version "3.2.3" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.3.tgz#b667bd13e9fa15a9c26603dce502c7985418c3d8" + integrity sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw== dependencies: "@types/node" "*" "@types/source-list-map" "*" @@ -6996,9 +5625,9 @@ webpack "^5" "@types/webpack@^4": - version "4.41.34" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.34.tgz#8cf616be84b39c8fb26f9459d4470a5514df2477" - integrity sha512-CN2aOGrR3zbMc2v+cKqzaClYP1ldkpPOgtdNvgX+RmlWCSWxHxpzz6WSCVQZRkF8D60ROlkRzAoEpgjWQ+bd2g== + version "4.41.36" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.36.tgz#30d039ca41d155d8aeba6cd2bcbe32e78bb5bef2" + integrity sha512-pF+DVW1pMLmgsPXqJr5QimdxIzOhe8oGKB98gdqAm0egKBy1lOLD5mRxbYboMQRkpYcG7BYcpqYblpKyvE7vhQ== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -7015,16 +5644,16 @@ "@types/node" "*" "@types/ws@^8.5.5": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" - integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== dependencies: "@types/node" "*" "@types/yargs-parser@^21.0.0": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yauzl@2.10.0": version "2.10.0" @@ -7034,9 +5663,9 @@ "@types/node" "*" "@types/yauzl@^2.9.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" - integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" @@ -7073,13 +5702,13 @@ "@typescript-eslint/visitor-keys" "6.7.4" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.7.3": - version "6.7.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz#07e5709c9bdae3eaf216947433ef97b3b8b7d755" - integrity sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ== +"@typescript-eslint/scope-manager@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" + integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== dependencies: - "@typescript-eslint/types" "6.7.3" - "@typescript-eslint/visitor-keys" "6.7.3" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" "@typescript-eslint/scope-manager@6.7.4": version "6.7.4" @@ -7099,23 +5728,23 @@ debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.7.3": - version "6.7.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.3.tgz#0402b5628a63f24f2dc9d4a678e9a92cc50ea3e9" - integrity sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw== +"@typescript-eslint/types@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" + integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== "@typescript-eslint/types@6.7.4": version "6.7.4" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.4.tgz#5d358484d2be986980c039de68e9f1eb62ea7897" integrity sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA== -"@typescript-eslint/typescript-estree@6.7.3": - version "6.7.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz#ec5bb7ab4d3566818abaf0e4a8fa1958561b7279" - integrity sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g== +"@typescript-eslint/typescript-estree@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" + integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== dependencies: - "@typescript-eslint/types" "6.7.3" - "@typescript-eslint/visitor-keys" "6.7.3" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -7149,24 +5778,24 @@ semver "^7.5.4" "@typescript-eslint/utils@^6.0.0": - version "6.7.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.3.tgz#96c655816c373135b07282d67407cb577f62e143" - integrity sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg== + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" + integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.7.3" - "@typescript-eslint/types" "6.7.3" - "@typescript-eslint/typescript-estree" "6.7.3" + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/typescript-estree" "6.11.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.7.3": - version "6.7.3" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz#83809631ca12909bd2083558d2f93f5747deebb2" - integrity sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg== +"@typescript-eslint/visitor-keys@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" + integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== dependencies: - "@typescript-eslint/types" "6.7.3" + "@typescript-eslint/types" "6.11.0" eslint-visitor-keys "^3.4.1" "@typescript-eslint/visitor-keys@6.7.4": @@ -7254,63 +5883,63 @@ resolved "https://registry.yarnpkg.com/@vscode/l10n/-/l10n-0.0.16.tgz#f075db346d0b08419a12540171b230bd803c42be" integrity sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg== -"@vue/compiler-core@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" - integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== +"@vue/compiler-core@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.8.tgz#301bb60d0245265a88ed5b30e200fbf223acb313" + integrity sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g== dependencies: - "@babel/parser" "^7.21.3" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.0" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" - integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== +"@vue/compiler-dom@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz#09d832514b9b8d9415a3816b065d69dbefcc7e9b" + integrity sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ== dependencies: - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-core" "3.3.8" + "@vue/shared" "3.3.8" "@vue/compiler-sfc@^3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" - integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== - dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/compiler-dom" "3.3.4" - "@vue/compiler-ssr" "3.3.4" - "@vue/reactivity-transform" "3.3.4" - "@vue/shared" "3.3.4" + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz#40b18e48aa00260950964d1d72157668521be0e1" + integrity sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA== + dependencies: + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.8" + "@vue/compiler-dom" "3.3.8" + "@vue/compiler-ssr" "3.3.8" + "@vue/reactivity-transform" "3.3.8" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" - magic-string "^0.30.0" - postcss "^8.1.10" + magic-string "^0.30.5" + postcss "^8.4.31" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" - integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== +"@vue/compiler-ssr@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz#136eed54411e4694815d961048a237191063fbce" + integrity sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w== dependencies: - "@vue/compiler-dom" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-dom" "3.3.8" + "@vue/shared" "3.3.8" -"@vue/reactivity-transform@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" - integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== +"@vue/reactivity-transform@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz#6d07649013b0be5c670f0ab6cc7ddd3150ad03f2" + integrity sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw== dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.8" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" - magic-string "^0.30.0" + magic-string "^0.30.5" -"@vue/shared@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" - integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== +"@vue/shared@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.8.tgz#f044942142e1d3a395f24132e6203a784838542d" + integrity sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw== "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" @@ -7443,590 +6072,20 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== -"@webpack-cli/serve@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" - integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@zag-js/accordion@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/accordion/-/accordion-0.12.0.tgz#2b3158578e65b2a2638d4c93e8c1ba53668e96ad" - integrity sha512-MUfM5aPIp8X2n3/AUirZG2b7tuVNy7xGJ4EnKyM9OzZP8cUaSzhOIOoVnvWl5ZY6OF5CIcZmRvCpl0vO6F5Tqg== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/anatomy@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/anatomy/-/anatomy-0.12.0.tgz#464718d2cc00b79c1e600370eb66d1366b09c413" - integrity sha512-P7V0DYrPKuWkO8wwB4iobD9W3WAzDJds7w2V5ZERKKkohou/D+6kTz2a2B8ohAImI895uy2WcLo4/G6i1Au/cA== - -"@zag-js/aria-hidden@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/aria-hidden/-/aria-hidden-0.12.0.tgz#4d7108078cba43d7806a48bb6249b95a79b5c33e" - integrity sha512-oFufnpHCs46xxtuFPuPeBjL5u84DI/C69R+u9WK7IHUGvQzD+mjkjrKK7wDbvslgyCcZHVaJuuCXgeq6SDIgbg== - dependencies: - "@zag-js/dom-query" "0.12.0" - -"@zag-js/auto-resize@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/auto-resize/-/auto-resize-0.12.0.tgz#889d71d6813d5d2793fed25f180cd8246c04dd4c" - integrity sha512-srP/CcYw1kiP3HKeppM/1siBrYQTmhJU0YDzLIiATNc9JdfIZp2k6OC264QptwPRcbZaNGnXbVJVNeS/5efB3g== - dependencies: - "@zag-js/dom-query" "0.12.0" - -"@zag-js/avatar@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/avatar/-/avatar-0.12.0.tgz#36c9885e28bfec91b12b814351eb413053359221" - integrity sha512-ndCe+NYa0Wyj2ddrb+vl6WVWG0sbWIhqDnqn1zltwuKVQFYMz/SxLwcoaFUHvAP0lsgpEvtFBKsj6OGeAuUcLw== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/mutation-observer" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/carousel@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/carousel/-/carousel-0.12.0.tgz#3f66a08e41c4cfc889f1746d359a3c16fec2ffb9" - integrity sha512-qnJlyQRylCuVZNlifIWpJ3zVRqeihOoQO8+uvzwCkLXLWNb4nD0Kmo4EJHirKXOdORu5F0jeoNWCbf4GJ2MiwA== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/checkbox@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/checkbox/-/checkbox-0.12.0.tgz#290f4d11f424a2058c7d3d4e3dc6e11773315ae1" - integrity sha512-ZN/v3+aMwl6YCehuAOYSirLo1GZBnZ/NboZPGZlO1tP5rgKxyy9gGVhCz2LgJjz2m5CAoDLkNTvKoqipx7Md0Q== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/color-picker@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/color-picker/-/color-picker-0.12.0.tgz#84838d7e2b856adcfe71f63d0c05b14504b2892e" - integrity sha512-8XmhQVm9eaN5j8gtuqQ0AOiOCqrHS400SDDbMl82jDuc286sAAJJ3R/XCoSfJg7humODAZq0wCUvT05+J/MUPA== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/color-utils" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/numeric-range" "0.12.0" - "@zag-js/text-selection" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/color-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/color-utils/-/color-utils-0.12.0.tgz#b1678ff655b960cb71d9680d732f4ecace5a7a48" - integrity sha512-SJ7rqHRlqRVtIsSz5/P9D5iLMI+QrPvPcCOhB7hGgiiITwo7pVGNmVrjv0K7eV6XfUbjjB/cOIpC3tlpzIbiJg== - -"@zag-js/combobox@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/combobox/-/combobox-0.12.0.tgz#5083b2c6aef3028fa303277a784c756214d32a17" - integrity sha512-dnUrQLvcYwlQyzB3O5SFfCX/M4y8BypGsJq/NzvZ23cc1TsS2t503zFuCncy+Z4P9NJoCtD5QFLtTjG2Gjf5+w== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/aria-hidden" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/interact-outside" "0.12.0" - "@zag-js/live-region" "0.12.0" - "@zag-js/mutation-observer" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/core@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/core/-/core-0.12.0.tgz#2f6b5131df7ca2b330afa6d6a45cd0a30bf48a07" - integrity sha512-U0Nqf0o/2I4VhKCyCNV7txLynaemiIOf4yP3sbl/y0Trz1HE4VHbkqSzPTNKLdRmvMSjDceO9osvXtnIVZFEpA== - dependencies: - "@zag-js/store" "0.12.0" - klona "2.0.6" - -"@zag-js/date-picker@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/date-picker/-/date-picker-0.12.0.tgz#d50c8c8d7abace75c3e4edefbd5330f74fff5459" - integrity sha512-72fnmI8YlY9YvAUFRIefDhMVwWA8zkDAXcX24+ZNtjbmBnUhjkE16W0w5duOAqiIG2VoYMyQmx4cyyVfR9EB7Q== - dependencies: - "@internationalized/date" "^3.3.0" - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/date-utils" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/live-region" "0.12.0" - "@zag-js/text-selection" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/date-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/date-utils/-/date-utils-0.12.0.tgz#07c30ed3bc13215609ed0c2958bf910b1af12dca" - integrity sha512-BYhhw3xFTIR9lUymLiBCkELZwd8VI8JeK16SmhFRAMAWG5ymrKKMz22PeaM4VX92/fzsMSNFQU1FK2kaEHsurA== - -"@zag-js/dialog@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/dialog/-/dialog-0.12.0.tgz#28fdb574d6d804b4215fb0b21d8b82e36e8d0ace" - integrity sha512-7ZcYLeVzDyZhUqKA4VaDtXKBw0+Sp+qSjHQSj7uookLVJCg7Xio8NrDTA/Tp0sDzcRpG7lERb6QLy+uiUKJBdg== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/aria-hidden" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/remove-scroll" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - focus-trap "7.5.2" - -"@zag-js/dismissable@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/dismissable/-/dismissable-0.12.0.tgz#6951d0957a78ccff8b6202a4c1dfcb20ab92bbb7" - integrity sha512-YtlPJGR+s5npCeG2gYitJ0cy/yMO+OGQmulb654loTpkD+Z6cdSbi8OJ/3KOtXrWj5eukGx/YUT/Kxhv2QaYyw== - dependencies: - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/interact-outside" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/dom-event@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/dom-event/-/dom-event-0.12.0.tgz#58c08f4557d6c52252d0390b656ee624e8642659" - integrity sha512-ynyx8bF+pfrWAGWfYWis2zMpgWYDx37CfSv5lOlMMzF/vdYq86Z+yXoQPRgPSNcgS/gRFtTUwbZTmoxvAqbn9Q== - dependencies: - "@zag-js/text-selection" "0.12.0" - "@zag-js/types" "0.12.0" - -"@zag-js/dom-query@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.12.0.tgz#bd52475427f9dba32577a60e0134c0c8621f129d" - integrity sha512-2VAPD+7N9sBxwHkucQ1B2VfT/0piMvINV2OyGtNL4E7v1TMFOGRUnHuaHyi8vUClanEtLRoHUWXs7oLqla7soA== - -"@zag-js/editable@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/editable/-/editable-0.12.0.tgz#0c59f41f7cef0c3cf2f1bfb589fb9bcb9d1c3c5c" - integrity sha512-HqJYx3ZBn1U6cHGEB6XqVJoWh90JHOUaU+Yht7Qe25kiED9NpvQD43AST4BXHqkHLhE6LpvKiy5EUHIq7iv94A== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/interact-outside" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/element-rect@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/element-rect/-/element-rect-0.12.0.tgz#c55742e9074236376246481cb10fa827ebd321ee" - integrity sha512-KLY8g+wmeR5Utd4GuvIqf9cB42lN6d9urFCFofxxmRfHUG7i/rk4Im7O/DCrAl7gw6DzmyDDYPM4745rVjEKqw== - -"@zag-js/element-size@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.12.0.tgz#2c6e9bc4d8090e9933d23d566e0b0b5a6ce8ec77" - integrity sha512-u9XcxHk8SQTDjvIH6rMEaEbGteU6nVP+LNFm0tnIwip2WUFCtQo8LgeqrDEBLfyqZqtEDN6Vb/ezUhudr/CM0w== - -"@zag-js/form-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/form-utils/-/form-utils-0.12.0.tgz#a4663de67a6aa8cbd11ab3d88dd3fffb61adfb24" - integrity sha512-Kp4JwhDg4kZoA3kw+7Hkf9yKyA9x2h6bP3S112JglSMFLNm6DzHEc4AUKAvVg8VUe+PiQ+MNKVQJZYcWX0eGpw== - dependencies: - "@zag-js/mutation-observer" "0.12.0" - -"@zag-js/hover-card@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/hover-card/-/hover-card-0.12.0.tgz#fba78ee919786c03b2aae556d79bf5b133591cf7" - integrity sha512-UbBpUTVFbHKcXLhLR3ZIJDO9V5qusSIIk2YG/EGO5SZgSOMoYqyTp/90hoZ3DyfuOqtrlSzHl5paw5dn16jEyw== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/interact-outside@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/interact-outside/-/interact-outside-0.12.0.tgz#8259758811605328f3036b997ec9e65e8d3b2438" - integrity sha512-M5AfCJG0DoIkh6svcY7c3hc6M9IKA+emEE4tIbTYWM3BvzqJd7OQ4Zok5coX/jLXsD5awT52JoSxxpevodRY/Q== - dependencies: - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/tabbable" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/live-region@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/live-region/-/live-region-0.12.0.tgz#09651bd5d800a26e48dc6c38a401c42f7ba3b7a7" - integrity sha512-WbwfLUKLL6wY9Pap1pIel1UxIL4H7aHk4CSBfrOebiNpq9NflvJ+WBkHFlwZG10O/OAZmdnQivWOEjuz0Z6bbA== - dependencies: - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/menu@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/menu/-/menu-0.12.0.tgz#3dac5f3d3d7e348e53b503da6e9d34b5c706f3b5" - integrity sha512-Ao/s3hEVG1aSJS7LX4MkESyd1UV+biEKIuF/a+EsaSbI6enHkl1+6cgC+EOdlrr4zRv3bhJ1G23BixZD4Eb5+Q== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/rect-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/mutation-observer@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/mutation-observer/-/mutation-observer-0.12.0.tgz#9836d461da2ee047af9ce9c6fae82871dc73e5a5" - integrity sha512-1y+PqhB57LR9MdzEbw9WloFvAxrxYONX05zzfOqJYvzk6vjHnPuoxpXdkF9FPcK+DXdiMR+SUaZ8qSGwEUaqoA== - -"@zag-js/number-input@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/number-input/-/number-input-0.12.0.tgz#2dc3561668ff6c652ae4df11ec28426424d18f2c" - integrity sha512-UGUiuzsOZywxtumNYR4/UieZun+nRzhgKiWnH6kI7zyjUZu3jWFsK+2diNHl0cjvXFEki42RreMXd+eLDizdAA== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/mutation-observer" "0.12.0" - "@zag-js/number-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/number-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/number-utils/-/number-utils-0.12.0.tgz#f2b42cd797eac38afc057d076e1b2e3d403ef8e5" - integrity sha512-fadhp0oHglUzRblB4Gob0bo3OMfHiFLIUYsi9B1EMBJ16QR7SuBipWW1fmZ4Inlqz8r3Wo8XQham+6LiXerIjg== - -"@zag-js/numeric-range@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/numeric-range/-/numeric-range-0.12.0.tgz#91ea18824fcef5e697b11c39a4534f18c367c402" - integrity sha512-8umHCBSK530dWwqBmvrfSBGY7PdEDopeNh4e6HReCy3pyJsBIjYjnQGH1K43s03hiXUN27bwAclO+GwK1BP+Vw== - -"@zag-js/pagination@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/pagination/-/pagination-0.12.0.tgz#a3fe7f3fbf754efa60cf1411fde7b27b8bdaab26" - integrity sha512-T5oYfsTISD8wrKcFYFmk7khp4eDemKWkWsdGKRfQ+UKBS7Ya71RRMnvOuBAGP4ltBcHxcdbwW6AYAizNIHTaVQ== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/pin-input@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/pin-input/-/pin-input-0.12.0.tgz#92d3625adb102fdf7dd23f21a018cd54c66fb6f8" - integrity sha512-pRxhfUwtTaSiosumkDpQyzAkPHcRe1nTnftTIWN24n7QshOq/7nP805bD99ziRD0SejIDIUYWy7T1448ZvaX0Q== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/popover@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/popover/-/popover-0.12.0.tgz#7f3b0466ea81fd3368c86948b738adae724ae91e" - integrity sha512-HVj4E4xpFJPq8zBHpniZkaJdF422e+BC17E7H9A3Vx+uy6NNtIJWoyzJN9jUHNv308Xb9JgfAZ5fD5phdJ3KDg== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/aria-hidden" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/remove-scroll" "0.12.0" - "@zag-js/tabbable" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - focus-trap "7.5.2" - -"@zag-js/popper@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/popper/-/popper-0.12.0.tgz#767f7d337e0db83276230c15ea04216c57e4a0a2" - integrity sha512-7sEjUwF5OSIqt4Ssz4hL4BLJqADeRFSD6HRFP4XAq0LohX+ZVhqLAjceHV87KiM/CnmHV6l9FHp99yxP9OKuBw== - dependencies: - "@floating-ui/dom" "1.4.4" - "@zag-js/dom-query" "0.12.0" - "@zag-js/element-rect" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/presence@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/presence/-/presence-0.12.0.tgz#fbcac3939a3c3bfad4ad15f6c4fad3c97018a072" - integrity sha512-5AO7UMiU5CxL672lx/6siFGFRafh4tttzXF10wfJanL/4XnTvLhsqhh7MufX1g1sGAuGjwwppoMKGBYmd4stBA== - dependencies: - "@zag-js/core" "0.12.0" - "@zag-js/types" "0.12.0" - -"@zag-js/pressable@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/pressable/-/pressable-0.12.0.tgz#5aa9ba38cb6c917591498ca33ffdfc1f57f3f9bd" - integrity sha512-N6RhHdVLw3Y3PHeRxI+r2Rpx3Mgdd53s4p1Z3kT9q8g3IPBFzv/s8B/jQteIFM8qZsG72PlWZ5tE2J9U0bQVrQ== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/text-selection" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/radio-group@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/radio-group/-/radio-group-0.12.0.tgz#f4dca69da01653e86a8af977619f4317506183e7" - integrity sha512-tzH0wj66jfm+hvTIRN9FL3wM3IggMQ4VxqfVBhrTRdU+MlDVjgmkZwigWQEKj295cNd3fP2wnJWGXVlxeD/21A== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/element-rect" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/range-slider@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/range-slider/-/range-slider-0.12.0.tgz#b11e74151e0b5a228ad391141fc06b976fc2826e" - integrity sha512-eVgiviJl9mU4mU5AoKy2BCM7ivEb0DRsq6ynxL8DzjAttfBe2+dwSQ530NANOtixG4uFd03p0H7yB826HTqn8Q== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/element-size" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/numeric-range" "0.12.0" - "@zag-js/slider" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/rating-group@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/rating-group/-/rating-group-0.12.0.tgz#025e7d1c647eddd66621ed72d6505975cdbcd5bb" - integrity sha512-j2bi96kI4GRjx5Lq06eEkvV37B9nLpaHb8oqxti8q3BX+edBxkvWUuRMPGpe8OIjGz5VdU692/1zgc2xJuTt6g== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/react@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/react/-/react-0.12.0.tgz#8deea4f6c7f92e36032fe6732ba8a9e39058cac3" - integrity sha512-V8NpyLu3Vnfi2DmYtTpZv6MoCcAGjnNbRwS7htgXa7dMBMxZBuAohzO6uUi9OPKmjXssgXUzuIzXcFxW4ez1Mg== - dependencies: - "@zag-js/core" "0.12.0" - "@zag-js/store" "0.12.0" - "@zag-js/types" "0.12.0" - proxy-compare "2.5.1" - -"@zag-js/rect-utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/rect-utils/-/rect-utils-0.12.0.tgz#c5fc95a0db02b708268f0b5031353474b4fc1eb9" - integrity sha512-J1h2SG0n3oI3UCM2pXPyhV+1vA/m5HQ5MhHk0ArfLdpaWad/pHN2iNdiDfufkpImTI7mS7tx3W/H7wzFiBvg3A== - -"@zag-js/remove-scroll@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/remove-scroll/-/remove-scroll-0.12.0.tgz#ca84f6329f4d511746d20ee2a41bacb4d0b6b3fb" - integrity sha512-qWrvhbFonCmvgTAsyhaatrBjv0P7Of5V9E+zxA7WoF1Y65Qae7D5XMHvVCeYYh19+7t2ge3oPuXjenALdNfs0w== - dependencies: - "@zag-js/dom-query" "0.12.0" - -"@zag-js/select@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/select/-/select-0.12.0.tgz#120338cb28046b1dcf9d7e3eff95c9cf3202366f" - integrity sha512-KfCAr30QhFCHmn1taulDACq1Ty06ZcARlofxnVHOWh/7XE7Yv6ZotrkLQUpJG+6S69vnSxoPjFZQ9nEoO4c2TA== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dismissable" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/mutation-observer" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/tabbable" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/slider@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/slider/-/slider-0.12.0.tgz#b4fd5791bb80369ef19757ae0e78c94b3d659c26" - integrity sha512-67CTmiBNLk/Up5vBsn+Hb34PJksxRel7B9GDrMScFpBM3UcEpB0tCrgz7GVLEuEkFAbf0rPXkYOJl+zG7BLDGw== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/element-size" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/numeric-range" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/splitter@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/splitter/-/splitter-0.12.0.tgz#cd37d1b3ff96088dc915110780e7d91a6a6086b6" - integrity sha512-j2bhOhmXeecGsNmO6pldjd0Qb6mSsTV7E1PQ7q207dIKGPM3fORo40jd4PPaACSDRPsNtEUxMcrKjj74V6l+LQ== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/number-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/store@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/store/-/store-0.12.0.tgz#ae75db6b93a2c09251208d7471b9b69c9748985a" - integrity sha512-19JiBnMa8N7WlGrCJKpHT4ZbhdYdgLdKmSOoyrHyq9I3FEqvSj1v2/ZVuu12NQNwiVwEIyRpUcjDMBdZy+ciIQ== - dependencies: - proxy-compare "2.5.1" - -"@zag-js/switch@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/switch/-/switch-0.12.0.tgz#7bd3064da4e98749e91d3a75bb077eff7b0ccc8f" - integrity sha512-THR/+BKc5RM79VELDRjvrnfmByDTDRFkZ8mNMLK8DKzmeAxKP2AF8fxvdM/Sgu5Qmn1U5A9MLcC7Tu2JzvHVJg== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/tabbable@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/tabbable/-/tabbable-0.12.0.tgz#42bdd3080ba07f5a66d852453c85e0b9a5eed46d" - integrity sha512-DNa9SSLXtYJKcAsyWlKW9We87bf8rAU8g7q3V2ukfpzpYhay24G5DmrA30KkRg2nH00/x+OLRYPYItWiNdztzw== - dependencies: - "@zag-js/dom-query" "0.12.0" - -"@zag-js/tabs@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/tabs/-/tabs-0.12.0.tgz#1e336261dee7b0b9928603eca64f982ecc892b60" - integrity sha512-bQDEd63iL4T8CiCugzI2ZSf7hmfJhBAl8b/cIRQRXa/mwRJg/17ccFjqb0LkR0/YageP01dB0mlq++JLR4/eFQ== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/element-rect" "0.12.0" - "@zag-js/tabbable" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/tags-input@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/tags-input/-/tags-input-0.12.0.tgz#ad6085db1aaf49b74fae13fa83c13bd7e88aa5ca" - integrity sha512-6ODlFfMVm+P2xE8k1KuEbzuI8jd3ZRvz7WsyZyTFpBPDBzUrqXwbv3Genq/FmktquEhCFsvvFjSDhNvtjX50+g== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/auto-resize" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/form-utils" "0.12.0" - "@zag-js/interact-outside" "0.12.0" - "@zag-js/live-region" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/text-selection@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/text-selection/-/text-selection-0.12.0.tgz#d0eba0b22058ec20c17a699ae4ab0cda63321439" - integrity sha512-XNfiV1il90ZOD2ysANc7z6n0LWYo9v5a9lQYTyLHtFOpnzjOPnuCyvU0WxwTLL7oyL8MabCiYunKyCtYq04ekA== - dependencies: - "@zag-js/dom-query" "0.12.0" - -"@zag-js/toast@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/toast/-/toast-0.12.0.tgz#70f825aa303429f527111754346b1739cefd7d6e" - integrity sha512-Tv/KqLB92Drf4G9E9mAgx8HUGBroZKsHuxVwXK0chcWID0LZTADfyiwfGTuUKQ3lqR8fVldESMnKIkC/VJ92Kg== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - -"@zag-js/tooltip@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/tooltip/-/tooltip-0.12.0.tgz#818069960092e80d5c0be778a353350df7766d6b" - integrity sha512-PC5cQqgKTEqyCY6AKht71r0p/mvbxcJevLRhQ0cQR5H1+7mArgpQQJmWjuK9X4gTFkm31MohtaqE0TfNJvGydQ== - dependencies: - "@zag-js/anatomy" "0.12.0" - "@zag-js/core" "0.12.0" - "@zag-js/dom-event" "0.12.0" - "@zag-js/dom-query" "0.12.0" - "@zag-js/popper" "0.12.0" - "@zag-js/types" "0.12.0" - "@zag-js/utils" "0.12.0" - "@zag-js/visually-hidden" "0.12.0" - -"@zag-js/types@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/types/-/types-0.12.0.tgz#fb6e940a650d7779ce98e20f2c097a07132fe507" - integrity sha512-CjioW4hyGo6a52JvP+XWO6bX9/tBTHwxBB4Np6LvB+6AG+hn7hQzEzWxGSpz0rwzHxH86LSe0MuAeEXaU5kHQQ== - dependencies: - csstype "3.1.2" - -"@zag-js/utils@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/utils/-/utils-0.12.0.tgz#a45332a823dcc268987ae122f77fb832540bb00d" - integrity sha512-kRPHpeh3cWIudwfAzTcwVrFnZAWpOqAp110EXX6h3TdhYDSG7+vnvT3PulwKDLdtGdn3vVUViolIHP00ZIWCAQ== +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@zag-js/visually-hidden@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@zag-js/visually-hidden/-/visually-hidden-0.12.0.tgz#37d06554dfd9c5a5325d9a0cfe880b313ac2fe98" - integrity sha512-qxYokOx1l9PEShUyqkK+iDnidMlqWSdpJc99BBB0Kv/Er/2bs7oObYYn5nmNJe7g/7b1HSs6eqhvQQ4svRwg3g== +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== "@zondax/ledger-stacks@1.0.4": version "1.0.4" @@ -8093,16 +6152,26 @@ acorn-loose@8.3.0: dependencies: acorn "^8.5.0" -acorn-walk@8.2.0, acorn-walk@^8.0.0, acorn-walk@^8.1.1, acorn-walk@^8.2.0: +acorn-walk@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@8.10.0, acorn@^8.0.4, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn-walk@^8.0.0, acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + +acorn@8.10.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^8.0.4, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + addons-linter@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/addons-linter/-/addons-linter-6.13.0.tgz#c24016477bf154e2538a7ff906802a95b637f6ab" @@ -8346,7 +6415,7 @@ anymatch@^3.0.0, anymatch@~3.1.2: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-passive-events-supported@1.1.1, are-passive-events-supported@^1.1.0: +are-passive-events-supported@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/are-passive-events-supported/-/are-passive-events-supported-1.1.1.tgz#3db180a1753a2186a2de50a32cded3ac0979f5dc" integrity sha512-5wnvlvB/dTbfrCvJ027Y4L4gW/6Mwoy1uFSavney0YO++GU+0e/flnjiBBwH+1kh7xNCgCOGvmJC3s32joYbww== @@ -8634,9 +6703,9 @@ async-stream-emitter@^6.0.1: stream-demux "^9.0.2" async@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== async@~2.6.3: version "2.6.4" @@ -8720,7 +6789,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@1.5.1, axios@^1.5.0: +axios@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== @@ -8729,13 +6798,14 @@ axios@1.5.1, axios@^1.5.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-loader@9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" - integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== +axios@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== dependencies: - find-cache-dir "^4.0.0" - schema-utils "^4.0.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" babel-plugin-macros@^3.1.0: version "3.1.0" @@ -8856,11 +6926,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -big.js@^6.0.3: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - bignumber.js@9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" @@ -8956,7 +7021,7 @@ bluebird@~3.7: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@5.2.1, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@5.2.1, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -9110,7 +7175,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== @@ -9119,21 +7184,21 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" + bn.js "^5.2.1" + browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.3" + elliptic "^6.5.4" inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" -browserslist@4.22.1: +browserslist@4.22.1, browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: version "4.22.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -9143,16 +7208,6 @@ browserslist@4.22.1: node-releases "^2.0.13" update-browserslist-db "^1.0.13" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: - version "4.22.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.0.tgz#6adc8116589ccea8a99d0df79c5de2436199abdb" - integrity sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA== - dependencies: - caniuse-lite "^1.0.30001539" - electron-to-chromium "^1.4.530" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -9245,13 +7300,6 @@ bunyan@1.8.15: mv "~2" safe-json-stringify "~1" -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -9270,7 +7318,7 @@ c32check@2.0.0, c32check@^2.0.0: "@noble/hashes" "^1.1.2" base-x "^4.0.0" -c32check@^1.1.1, c32check@^1.1.2, c32check@^1.1.3: +c32check@^1.1.1, c32check@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/c32check/-/c32check-1.1.3.tgz#232890e4d788afbd4e97e2611a3c251aa63e5977" integrity sha512-ADADE/PjAbJRlwpG3ShaOMbBUlJJZO7xaYSRD5Tub6PixQlgR4s36y9cvMf/YRGpkqX+QOxIdMw216iC320q9A== @@ -9319,11 +7367,11 @@ cacheable-lookup@^7.0.0: integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== cacheable-request@^10.2.8: - version "10.2.13" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" - integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: - "@types/http-cache-semantics" "^4.0.1" + "@types/http-cache-semantics" "^4.0.2" get-stream "^6.0.1" http-cache-semantics "^4.1.1" keyv "^4.5.3" @@ -9344,13 +7392,14 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" callsites@^3.0.0: version "3.1.0" @@ -9380,7 +7429,7 @@ camelcase@7.0.1, camelcase@^7.0.0, camelcase@^7.0.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -9400,15 +7449,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001539: - version "1.0.30001541" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz#b1aef0fadd87fb72db4dcb55d220eae17b81cdb1" - integrity sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw== - -caniuse-lite@^1.0.30001541: - version "1.0.30001543" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001543.tgz#478a3e9dddbb353c5ab214b0ecb0dbed529ed1d8" - integrity sha512-qxdO8KPWPQ+Zk6bvNpPeQIOH47qZSYdFZd6dXQzb2KzhnSXju4Kd7H1PkSJx6NICSMgo/IhRZRhhfPTHYpJUCA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001562" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz#9d16c5fd7e9c592c4cd5e304bc0f75b0008b2759" + integrity sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng== caseless@~0.12.0: version "0.12.0" @@ -9570,9 +7614,9 @@ chrome-webstore-upload@^1.0.0: got "^11.8.2" ci-info@^3.2.0, ci-info@^3.3.1, ci-info@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -9664,7 +7708,7 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@^1.1.1: +clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -9684,7 +7728,7 @@ coinselect@3.1.13: resolved "https://registry.yarnpkg.com/coinselect/-/coinselect-3.1.13.tgz#b88c7f9659ed4891d1f1d0c894105b1c10ef89a1" integrity sha512-iJOrKH/7N9gX0jRkxgOHuGjvzvoxUMSeylDhH1sHn+CjLjdin5R0Hz2WEBu/jrZV5OrHcm+6DMzxwu9zb5mSZg== -color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -9708,7 +7752,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4, color-string@^1.6.0, color-string@^1.9.0: +color-string@^1.6.0, color-string@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== @@ -9721,14 +7765,6 @@ color-support@^1.1.2, color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" - color@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" @@ -10012,9 +8048,9 @@ copy-webpack-plugin@11.0.0: serialize-javascript "^6.0.0" core-js-pure@^3.23.3, core-js-pure@^3.6.5: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" - integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== + version "3.33.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.2.tgz#644830db2507ef84d068a70980ccd99c275f5fa6" + integrity sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q== core-js@3.29.0: version "3.29.0" @@ -10265,9 +8301,9 @@ css-what@^6.0.1, css-what@^6.1.0: integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssdb@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.7.2.tgz#fbebd90edfc6af129fda4fd986f9dd604a209094" - integrity sha512-pQPYP7/kch4QlkTcLuUNiNL2v/E+O+VIdotT+ug62/+2B2/jkzs5fMM6RHCzGCZ9C82pODEMSIzRRUzJOrl78g== + version "7.9.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.9.0.tgz#d42d8269ff3d3e1c366280ab1f9f6207057b262c" + integrity sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw== cssesc@^3.0.0: version "3.0.0" @@ -10286,7 +8322,7 @@ cssstyle@^3.0.0: dependencies: rrweb-cssom "^0.6.0" -csstype@3.1.2, csstype@^3.0.10, csstype@^3.0.2: +csstype@^3.0.10, csstype@^3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -10593,7 +8629,7 @@ dayjs@1.11.8: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== -debounce@1.2.1: +debounce@1.2.1, debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== @@ -10678,7 +8714,7 @@ deepmerge-ts@^4.3.0: resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz#432aff3cd09f947e36cdb3772a43960bf45327fe" integrity sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw== -deepmerge@4.3.1, deepmerge@^4.2.2: +deepmerge@4.3.1, deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -10725,10 +8761,10 @@ defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" gopd "^1.0.1" @@ -11072,9 +9108,9 @@ dotenv@^8.2.0: integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== dset@^3.1.1, dset@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" - integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + version "3.1.3" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" + integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== dtrace-provider@~0.8: version "0.8.8" @@ -11122,26 +9158,21 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.530: - version "1.4.532" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.532.tgz#44454731e26f2c8c14e88cca0d073f0761784f5e" - integrity sha512-piIR0QFdIGKmOJTSNg5AwxZRNWQSXlRYycqDB9Srstx4lip8KpcmRxVP6zuFWExWziHYZpJ0acX7TxqX95KBpg== - electron-to-chromium@^1.4.535: - version "1.4.540" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.540.tgz#c685f2f035e93eb21dd6a9cfe2c735bad8f77401" - integrity sha512-aoCqgU6r9+o9/S7wkcSbmPRFi7OWZWiXS9rtjEd+Ouyu/Xyw5RSq2XN8s5Qp8IaFOLiRrhQCphCIjAxgG3eCAg== + version "1.4.583" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.583.tgz#7b0ac4f36388da4b5485788adb92cd7dd0abffc4" + integrity sha512-93y1gcONABZ7uqYe/JWDVQP/Pj/sQSunF0HVAPdlg/pfBnOyBMLlQUxWvkqcljJg1+W6cjvPuYD+r1Th9Tn8mA== electron@^26.1.0: - version "26.2.3" - resolved "https://registry.yarnpkg.com/electron/-/electron-26.2.3.tgz#4d198ba8d42aebdf65de75ce944c667ddd0c10b4" - integrity sha512-osdKf9mbhrqE81ITdvQ7TjVOayXfcAlWm8A6EtBt/eFSh7a/FijebGVkgs0S7qWQdhO0KaNZDb1Gx00sWuDQdw== + version "26.5.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-26.5.0.tgz#63e56b06f4c3675eb10dbd91dff19fb9cb0cd13d" + integrity sha512-j65/SMEqf+sKBUmAwYU0E5d/OKPmhRVyMntVulHKTNEazxF2TuRr/+GoEVxBq4l9jfLEXhheVOuOW0J5Tme1kA== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" extract-zip "^2.0.1" -elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -11240,9 +9271,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + version "7.11.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" + integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== err-code@^2.0.2: version "2.0.3" @@ -11264,25 +9295,25 @@ error-stack-parser@^2.0.6: stackframe "^1.3.4" es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.5" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.1" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" internal-slot "^1.0.5" is-array-buffer "^3.0.2" is-callable "^1.2.7" @@ -11292,7 +9323,7 @@ es-abstract@^1.22.1: is-string "^1.0.7" is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.5.1" @@ -11306,7 +9337,7 @@ es-abstract@^1.22.1: typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.11" + which-typed-array "^1.1.13" es-iterator-helpers@^1.0.12: version "1.0.15" @@ -11329,25 +9360,25 @@ es-iterator-helpers@^1.0.12: safe-array-concat "^1.0.1" es-module-lexer@^1.2.1, es-module-lexer@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + get-intrinsic "^1.2.2" has-tostringtag "^1.0.0" + hasown "^2.0.0" es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -11398,33 +9429,33 @@ esbuild-loader@4.0.2: loader-utils "^2.0.4" webpack-sources "^1.4.3" -esbuild@0.19.4, esbuild@^0.19.0: - version "0.19.4" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.4.tgz#cdf5c4c684956d550bc3c6d0c01dac7fef6c75b1" - integrity sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA== +esbuild@0.19.7: + version "0.19.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84" + integrity sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ== optionalDependencies: - "@esbuild/android-arm" "0.19.4" - "@esbuild/android-arm64" "0.19.4" - "@esbuild/android-x64" "0.19.4" - "@esbuild/darwin-arm64" "0.19.4" - "@esbuild/darwin-x64" "0.19.4" - "@esbuild/freebsd-arm64" "0.19.4" - "@esbuild/freebsd-x64" "0.19.4" - "@esbuild/linux-arm" "0.19.4" - "@esbuild/linux-arm64" "0.19.4" - "@esbuild/linux-ia32" "0.19.4" - "@esbuild/linux-loong64" "0.19.4" - "@esbuild/linux-mips64el" "0.19.4" - "@esbuild/linux-ppc64" "0.19.4" - "@esbuild/linux-riscv64" "0.19.4" - "@esbuild/linux-s390x" "0.19.4" - "@esbuild/linux-x64" "0.19.4" - "@esbuild/netbsd-x64" "0.19.4" - "@esbuild/openbsd-x64" "0.19.4" - "@esbuild/sunos-x64" "0.19.4" - "@esbuild/win32-arm64" "0.19.4" - "@esbuild/win32-ia32" "0.19.4" - "@esbuild/win32-x64" "0.19.4" + "@esbuild/android-arm" "0.19.7" + "@esbuild/android-arm64" "0.19.7" + "@esbuild/android-x64" "0.19.7" + "@esbuild/darwin-arm64" "0.19.7" + "@esbuild/darwin-x64" "0.19.7" + "@esbuild/freebsd-arm64" "0.19.7" + "@esbuild/freebsd-x64" "0.19.7" + "@esbuild/linux-arm" "0.19.7" + "@esbuild/linux-arm64" "0.19.7" + "@esbuild/linux-ia32" "0.19.7" + "@esbuild/linux-loong64" "0.19.7" + "@esbuild/linux-mips64el" "0.19.7" + "@esbuild/linux-ppc64" "0.19.7" + "@esbuild/linux-riscv64" "0.19.7" + "@esbuild/linux-s390x" "0.19.7" + "@esbuild/linux-x64" "0.19.7" + "@esbuild/netbsd-x64" "0.19.7" + "@esbuild/openbsd-x64" "0.19.7" + "@esbuild/sunos-x64" "0.19.7" + "@esbuild/win32-arm64" "0.19.7" + "@esbuild/win32-ia32" "0.19.7" + "@esbuild/win32-x64" "0.19.7" esbuild@^0.17.18, esbuild@^0.17.19: version "0.17.19" @@ -11482,6 +9513,34 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.19.0: + version "0.19.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" + integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== + optionalDependencies: + "@esbuild/android-arm" "0.19.5" + "@esbuild/android-arm64" "0.19.5" + "@esbuild/android-x64" "0.19.5" + "@esbuild/darwin-arm64" "0.19.5" + "@esbuild/darwin-x64" "0.19.5" + "@esbuild/freebsd-arm64" "0.19.5" + "@esbuild/freebsd-x64" "0.19.5" + "@esbuild/linux-arm" "0.19.5" + "@esbuild/linux-arm64" "0.19.5" + "@esbuild/linux-ia32" "0.19.5" + "@esbuild/linux-loong64" "0.19.5" + "@esbuild/linux-mips64el" "0.19.5" + "@esbuild/linux-ppc64" "0.19.5" + "@esbuild/linux-riscv64" "0.19.5" + "@esbuild/linux-s390x" "0.19.5" + "@esbuild/linux-x64" "0.19.5" + "@esbuild/netbsd-x64" "0.19.5" + "@esbuild/openbsd-x64" "0.19.5" + "@esbuild/sunos-x64" "0.19.5" + "@esbuild/win32-arm64" "0.19.5" + "@esbuild/win32-ia32" "0.19.5" + "@esbuild/win32-x64" "0.19.5" + escalade@3.1.1, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -11852,9 +9911,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -11945,9 +10004,9 @@ file-size@^1.0.0: integrity sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ== filesize@^10.0.8: - version "10.0.12" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.0.12.tgz#6eef217c08e9633cdbf438d9124e8f5f524ffa05" - integrity sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw== + version "10.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.0.tgz#846f5cd8d16e073c5d6767651a8264f6149183cd" + integrity sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ== filesize@^8.0.6: version "8.0.7" @@ -11974,14 +10033,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" - integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== - dependencies: - common-path-prefix "^3.0.0" - pkg-dir "^7.0.0" - find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -12043,26 +10094,24 @@ first-chunk-stream@3.0.0, first-chunk-stream@^3.0.0: integrity sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw== flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.7: +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -focus-trap@7.5.2: - version "7.5.2" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.2.tgz#e5ee678d10a18651f2591ffb66c949fb098d57cf" - integrity sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw== - dependencies: - tabbable "^6.2.0" - follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" @@ -12166,9 +10215,9 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.2.0, fraction.js@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2: version "0.5.2" @@ -12254,10 +10303,10 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" @@ -12330,20 +10379,20 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0, get-func-name@^2.0.2: +get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-nonce@^1.0.0: version "1.0.1" @@ -12523,9 +10572,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.22.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" - integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -12707,11 +10756,11 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" @@ -12740,13 +10789,6 @@ has-yarn@^3.0.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -12764,6 +10806,13 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hast-util-from-parse5@^7.0.0: version "7.1.2" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" @@ -12891,11 +10940,6 @@ hosted-git-info@^5.0.0: dependencies: lru-cache "^7.5.1" -hotkeys-js@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.8.1.tgz#fa7051f73bf1dc92a8b8d580a40b247f91966376" - integrity sha512-YlhVQtyG9f1b7GhtzdhR0Pl+cImD1ZrKI6zYUa7QLd0zuThiL7RzZ+ANJyy7z+kmcCpNYBf5PjBa3CjiQ5PFpw== - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -12918,7 +10962,7 @@ html-entities@^2.1.0, html-entities@^2.3.2, html-entities@^2.4.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -13069,9 +11113,9 @@ http2-wrapper@^1.0.0-beta.5.2: resolve-alpn "^1.0.0" http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" @@ -13179,7 +11223,7 @@ immer@^9.0.21, immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -immutable@^4.1.0, immutable@^4.3.2: +immutable@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== @@ -13259,12 +11303,12 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + get-intrinsic "^1.2.2" + hasown "^2.0.0" side-channel "^1.0.4" "internmap@1 - 2": @@ -13282,16 +11326,6 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -intl-messageformat@^10.1.0: - version "10.5.3" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.3.tgz#db0779d4a1988faa2977d76574489b7a25f0d5d0" - integrity sha512-TzKn1uhJBMyuKTO4zUX47SU+d66fu1W9tVzIiZrQ6hBqQQeYscBMIzKL/qEXnFbJrH9uU5VV3+T5fWib4SIcKA== - dependencies: - "@formatjs/ecma402-abstract" "1.17.2" - "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.6.2" - tslib "^2.4.0" - invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -13399,12 +11433,12 @@ is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" @@ -13687,9 +11721,9 @@ is-weakset@^2.0.1: get-intrinsic "^1.1.1" is-what@^4.1.8: - version "4.1.15" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.15.tgz#de43a81090417a425942d67b1ae86e7fae2eee0e" - integrity sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA== + version "4.1.16" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== is-wsl@^2.2.0: version "2.2.0" @@ -13742,14 +11776,14 @@ isstream@~0.1.2: integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz#7a8af094cbfff1d5bb280f62ce043695ae8dd5b8" - integrity sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -13828,9 +11862,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2, jiti@^1.19.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== jju@^1.4.0: version "1.4.0" @@ -14194,7 +12228,7 @@ jss-plugin-vendor-prefixer@10.10.0: css-vendor "^2.0.8" jss "10.10.0" -jss-preset-default@^10.10.0, jss-preset-default@^10.9.2: +jss-preset-default@^10.10.0: version "10.10.0" resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.10.0.tgz#c8209449a0f6d232526c2ba3a3a6ec69ee97e023" integrity sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q== @@ -14214,7 +12248,7 @@ jss-preset-default@^10.10.0, jss-preset-default@^10.9.2: jss-plugin-template "10.10.0" jss-plugin-vendor-prefixer "10.10.0" -jss@10.10.0, jss@^10.10.0, jss@^10.9.2: +jss@10.10.0, jss@^10.10.0: version "10.10.0" resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -14272,9 +12306,9 @@ jws@^3.2.2: safe-buffer "^5.0.1" keyv@^4.0.0, keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -14293,11 +12327,6 @@ kleur@^4.0.3, kleur@^4.1.4, kleur@^4.1.5: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - knex@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.1.tgz#a6c6b449866cf4229f070c17411f23871ba52ef9" @@ -14326,12 +12355,12 @@ latest-version@^7.0.0: package-json "^8.1.0" launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lcid@^3.0.0: version "3.1.1" @@ -14351,13 +12380,6 @@ ledger-bitcoin@0.2.3: bip32-path "^0.4.2" bitcoinjs-lib "^6.1.3" -"legacy-swc-helpers@npm:@swc/helpers@=0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== - dependencies: - tslib "^2.4.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -14406,9 +12428,9 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lines-and-columns@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== linked-list@^0.1.0: version "0.1.0" @@ -14505,16 +12527,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.escape@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - lodash.get@4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -14525,11 +12537,6 @@ lodash.includes@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== -lodash.invokemap@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" - integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== - lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -14570,11 +12577,6 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.pullall@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" - integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -14585,7 +12587,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash.uniqby@4.7.0, lodash.uniqby@^4.7.0: +lodash.uniqby@4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== @@ -14636,11 +12638,11 @@ lottie-web@^5.1.3: integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg== loupe@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lower-case@^2.0.2: version "2.0.2" @@ -14679,9 +12681,11 @@ lru-cache@^7.10.1, lru-cache@^7.14.1, lru-cache@^7.5.1: integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== "lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + version "10.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7" + integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg== + dependencies: + semver "^7.3.5" lru_map@^0.3.3: version "0.3.3" @@ -14695,10 +12699,10 @@ magic-string@0.27.0, magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@^0.30.0, magic-string@^0.30.1, magic-string@^0.30.2: - version "0.30.3" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" - integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== +magic-string@^0.30.1, magic-string@^0.30.2, magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -14937,11 +12941,6 @@ mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: dependencies: "@types/mdast" "^3.0.0" -mdi-react@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/mdi-react/-/mdi-react-9.2.0.tgz#58fa8654937e5d86c7dfd8be5ba9259940d21115" - integrity sha512-NI1sIvu142SQKkOMe4bjA9KuvMXpT8PfNOkCblSEuUeakFpgciMuKV9rEyJbQkvFBppDLx1f1xmbcIc06oRyAQ== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -15013,11 +13012,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micro-memoize@^4.0.9: - version "4.1.2" - resolved "https://registry.yarnpkg.com/micro-memoize/-/micro-memoize-4.1.2.tgz#ce719c1ba1e41592f1cd91c64c5f41dcbf135f36" - integrity sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g== - micro-packed@0.3.2, micro-packed@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.3.2.tgz#3679188366c2283cb60a78366ed0416e5472b7cf" @@ -15468,9 +13462,9 @@ minipass@^5.0.0: integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" @@ -15596,10 +13590,10 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nanoid@^3.1.23, nanoid@^3.3.4, nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@3.3.4, nanoid@^3.1.23, nanoid@^3.3.6, nanoid@^4.0.2: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare@^1.4.0: version "1.4.0" @@ -15844,10 +13838,10 @@ object-hash@3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.0.1: version "1.1.5" @@ -15923,9 +13917,9 @@ obuf@^1.0.0, obuf@^1.1.2: integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-exit-leak-free@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" - integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== on-finished@2.4.1: version "2.4.1" @@ -16161,7 +14155,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: +parse-asn1@^5.0.0, parse-asn1@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== @@ -16454,13 +14448,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" - integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== - dependencies: - find-up "^6.3.0" - pkg-types@1.0.3, pkg-types@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" @@ -16511,11 +14498,11 @@ postcss-clamp@^4.1.0: postcss-value-parser "^4.2.0" postcss-color-functional-notation@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.1.tgz#b67d7c71fa1c82b09c130e02a37f0b6ceacbef63" - integrity sha512-IouVx77fASIjOChWxkvOjYGnYNKq286cSiKFJwWNICV9NP2xZWVOS9WOriR/8uIB2zt/44bzQyw4GteCLpP2SA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.2.tgz#5fa38d36cd0e2ea9db7fd6f2f2a1ffb2c0796a8d" + integrity sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw== dependencies: - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" postcss-value-parser "^4.2.0" postcss-color-hex-alpha@^9.0.2: @@ -16533,14 +14520,14 @@ postcss-color-rebeccapurple@^9.0.1: postcss-value-parser "^4.2.0" postcss-custom-media@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-10.0.1.tgz#48a4597451a69b1098e6eb11eb1166202171f9ed" - integrity sha512-fil7cosvzlIAYmZJPtNFcTH0Er7a3GveEK4q5Y/L24eWQHmiw8Fv/E5DMkVpdbNjkGzJxrvowOSt/Il9HZ06VQ== + version "10.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-10.0.2.tgz#70a244bbc59fc953ab6573e4e2c9624639aef08a" + integrity sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w== dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.4" - "@csstools/css-parser-algorithms" "^2.3.1" - "@csstools/css-tokenizer" "^2.2.0" - "@csstools/media-query-list-parser" "^2.1.4" + "@csstools/cascade-layer-name-parser" "^1.0.5" + "@csstools/css-parser-algorithms" "^2.3.2" + "@csstools/css-tokenizer" "^2.2.1" + "@csstools/media-query-list-parser" "^2.1.5" postcss-custom-properties@^13.3.1: version "13.3.2" @@ -16553,13 +14540,13 @@ postcss-custom-properties@^13.3.1: postcss-value-parser "^4.2.0" postcss-custom-selectors@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-7.1.5.tgz#74e99ef5d7a3f84aaab246ba086975e8279b686e" - integrity sha512-0UYtz7GG10bZrRiUdZ/2Flt+hp5p/WP0T7JgAPZ/Xhgb0wFjW/p7QOjE+M58S9Z3x11P9YaNPcrsoOGewWYkcw== + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-7.1.6.tgz#6d28812998dcd48f61a6a538141fc16cf2c42123" + integrity sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw== dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.4" - "@csstools/css-parser-algorithms" "^2.3.1" - "@csstools/css-tokenizer" "^2.2.0" + "@csstools/cascade-layer-name-parser" "^1.0.5" + "@csstools/css-parser-algorithms" "^2.3.2" + "@csstools/css-tokenizer" "^2.2.1" postcss-selector-parser "^6.0.13" postcss-dir-pseudo-class@^8.0.0: @@ -16580,11 +14567,11 @@ postcss-discard-empty@^6.0.0: integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== postcss-double-position-gradients@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.1.tgz#5f28489f5b33ce5e1e97bf1ea6b62cd7a5f9c0c2" - integrity sha512-ogcHzfC5q4nfySyZyNF7crvK3/MRDTh+akzE+l7bgJUjVkhgfahBuI+ZAm/5EeaVSVKnCOgqtC6wTyUFgLVLTw== + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.2.tgz#a55ed4d6a395f324aa5535ea8c42c74e8ace2651" + integrity sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw== dependencies: - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" postcss-value-parser "^4.2.0" postcss-focus-visible@^9.0.0: @@ -16619,14 +14606,14 @@ postcss-image-set-function@^6.0.1: postcss-value-parser "^4.2.0" postcss-lab-function@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-6.0.5.tgz#de6b12fb29b591193d53bccf09eba304952224db" - integrity sha512-v1NG08v7tN9n76rA5j5HQ4sRu/kqXBuOFNAYhfHqbyDQ1WbsGKfPNN9VnJSSI3V0KIlShodYQPf3ORjMSo1w9g== + version "6.0.7" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-6.0.7.tgz#b1dd0ad5a4c993b7695614239754b9be48f3b24b" + integrity sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw== dependencies: - "@csstools/css-color-parser" "^1.3.2" + "@csstools/css-color-parser" "^1.4.0" "@csstools/css-parser-algorithms" "^2.3.2" "@csstools/css-tokenizer" "^2.2.1" - "@csstools/postcss-progressive-custom-properties" "^3.0.1" + "@csstools/postcss-progressive-custom-properties" "^3.0.2" postcss-loader@7.3.3: version "7.3.3" @@ -16839,7 +14826,7 @@ postcss@8.4.29: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@8.4.31, postcss@^8.4.31: +postcss@8.4.31, postcss@^8.4.21, postcss@^8.4.27, postcss@^8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -16848,15 +14835,6 @@ postcss@8.4.31, postcss@^8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.1.10, postcss@^8.4.21, postcss@^8.4.27: - version "8.4.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - preferred-pm@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.2.tgz#aedb70550734a574dffcbf2ce82642bd1753bdd6" @@ -16882,7 +14860,7 @@ prettier-plugin-astro@^0.9.1: sass-formatter "^0.7.5" synckit "^0.8.4" -prettier@3.0.3, prettier@^3.0.3: +prettier@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== @@ -16892,6 +14870,11 @@ prettier@^2.8.3, prettier@^2.8.8: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" + integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -16909,12 +14892,15 @@ pretty-format@^29.5.0: ansi-styles "^5.0.0" react-is "^18.0.0" -prism-react-renderer@^1.2.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== +prism-react-renderer@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.2.0.tgz#f199b15716e0b8d0ccfd1986ff6fa226fb7ff2b1" + integrity sha512-j4AN0VkEr72598+47xDvpzeYyeh/wPPRNTt9nJFZqIZUxwGKwYqYgt7RVigZ3ZICJWJWN84KEuMKPNyypyhNIw== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^1.2.1" -prismjs@1.29.0, prismjs@^1.23.0, prismjs@^1.28.0: +prismjs@1.29.0, prismjs@^1.28.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== @@ -16925,9 +14911,9 @@ process-nextick-args@~2.0.0: integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-warning@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.2.0.tgz#008ec76b579820a8e5c35d81960525ca64feb626" - integrity sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.3.0.tgz#02ccba12fd55c05879cb7ddab31b6a20af2fe4d9" + integrity sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g== process@0.11.10, process@^0.11.10: version "0.11.10" @@ -16995,14 +14981,14 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: react-is "^16.13.1" property-expr@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" - integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== property-information@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== proto-list@~1.2.1: version "1.2.4" @@ -17017,11 +15003,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-compare@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" - integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -17052,7 +15033,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@2.3.0, punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: +punycode@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== @@ -17062,6 +15043,11 @@ punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + pupa@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" @@ -17185,48 +15171,6 @@ react-animate-height@3.1.1: resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-3.1.1.tgz#3e324c417a5d18afcdd78d2ad71108c14868a28b" integrity sha512-UkC6+V3ZlCneBRaSM7aUctDJ+PRP6ztcGtxvU7MTeoMMWPhz8BQNaX7QWaZrkzp1ih1G8uZZ+DI9nfLvtD6OdQ== -react-aria@^3.4.0: - version "3.28.0" - resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.28.0.tgz#e1d1a2fd0b48cad785fdcd469ffd18576f13dc91" - integrity sha512-M0R12U5X83zktim4V/4le7KEV4REu25yDr6zOwRFOTXwILLxYsmWnaajX7ye5da84tl4kDjYoJIKJWVNvhjNoA== - dependencies: - "@react-aria/breadcrumbs" "^3.5.5" - "@react-aria/button" "^3.8.2" - "@react-aria/calendar" "^3.5.0" - "@react-aria/checkbox" "^3.11.0" - "@react-aria/combobox" "^3.6.4" - "@react-aria/datepicker" "^3.7.0" - "@react-aria/dialog" "^3.5.5" - "@react-aria/dnd" "^3.4.1" - "@react-aria/focus" "^3.14.1" - "@react-aria/gridlist" "^3.6.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/link" "^3.5.4" - "@react-aria/listbox" "^3.10.2" - "@react-aria/menu" "^3.10.2" - "@react-aria/meter" "^3.4.5" - "@react-aria/numberfield" "^3.8.0" - "@react-aria/overlays" "^3.17.0" - "@react-aria/progress" "^3.4.5" - "@react-aria/radio" "^3.8.0" - "@react-aria/searchfield" "^3.5.5" - "@react-aria/select" "^3.12.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/separator" "^3.3.5" - "@react-aria/slider" "^3.7.0" - "@react-aria/ssr" "^3.8.0" - "@react-aria/switch" "^3.5.4" - "@react-aria/table" "^3.12.0" - "@react-aria/tabs" "^3.7.0" - "@react-aria/tag" "^3.1.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/tooltip" "^3.6.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-types/shared" "^3.20.0" - react-async-hook@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/react-async-hook/-/react-async-hook-4.0.0.tgz#1f0467586654e1f33b7433bd98c300a0c5f9b3d0" @@ -17314,22 +15258,10 @@ react-hot-toast@2.4.1: dependencies: goober "^2.1.10" -react-hotkeys-hook@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-2.4.1.tgz#9e495cbe9872a2bcf9b0f8ff776f031064d33968" - integrity sha512-IsQEOdY26vu2xlsXFN0B6xytDa3y8VL53yY49Qq4f1zXefNqtGRzWnmyHSc84K/ZGozcz38xgn9SmwZsbW0nRg== - dependencies: - hotkeys-js "3.8.1" - -react-icons@4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.10.1.tgz#3f3b5eec1f63c1796f6a26174a1091ca6437a500" - integrity sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw== - -react-icons@^4.10.1, react-icons@^4.3.1: - version "4.11.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.11.0.tgz#4b0e31c9bfc919608095cc429c4f1846f4d66c65" - integrity sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA== +react-icons@^4.11.0, react-icons@^4.3.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== react-intersection-observer@9.5.2: version "9.5.2" @@ -17368,7 +15300,7 @@ react-lottie@1.2.3: babel-runtime "^6.26.0" lottie-web "^5.1.3" -react-redux@8.1.3: +react-redux@8.1.3, react-redux@^8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.3.tgz#4fdc0462d0acb59af29a13c27ffef6f49ab4df46" integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw== @@ -17380,18 +15312,6 @@ react-redux@8.1.3: react-is "^18.0.0" use-sync-external-store "^1.0.0" -react-redux@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.2.tgz#9076bbc6b60f746659ad6d51cb05de9c5e1e9188" - integrity sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw== - dependencies: - "@babel/runtime" "^7.12.1" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/use-sync-external-store" "^0.0.3" - hoist-non-react-statics "^3.3.2" - react-is "^18.0.0" - use-sync-external-store "^1.0.0" - react-refresh@0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -17432,9 +15352,9 @@ react-router@6.16.0: "@remix-run/router" "1.9.0" react-select@^5.3.2: - version "5.7.5" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.5.tgz#d2d0f29994e0f06000147bfb2adf58324926c2fd" - integrity sha512-jgYZa2xgKP0DVn5GZk7tZwbRx7kaVz1VqU41S8z1KWmshRDhlrpKS0w80aS1RaK5bVIXpttgSou7XCjWw1ncKA== + version "5.8.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5" + integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -17455,7 +15375,7 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" -react-transition-group@^4.3.0, react-transition-group@^4.4.1: +react-transition-group@^4.3.0: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -17509,7 +15429,7 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -17585,7 +15505,7 @@ redux-thunk@^2.4.2: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@^4.0.0, redux@^4.2.0, redux@^4.2.1: +redux@^4.0.0, redux@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -17831,20 +15751,20 @@ resolve-pkg-maps@^1.0.0: integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.1.7, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -18011,14 +15931,7 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -rxjs@6: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@7.8.1, rxjs@^7.8.0: +rxjs@7.8.1, rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -18052,7 +15965,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -18132,9 +16045,9 @@ schema-inspector@2.0.2: async "~2.6.3" schema-inspector@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/schema-inspector/-/schema-inspector-2.0.3.tgz#810177ce3967fd62988e8bf378849cd75758f43e" - integrity sha512-Q9mpYxrP3w6CpHRfnh3QLOE1urkGTLvnl7xgVH7fsu0HYJUZenUASUr4j/pf7bAxShh+4R3Ta8ZgVKak1b2wyA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/schema-inspector/-/schema-inspector-2.1.0.tgz#85096fbc78162a420262ed41b82e60ac927767b2" + integrity sha512-3bmQVhbA01/EW8cZin4vIpqlpNU2SIy4BhKCfCgogJ3T/L76dLx3QAE+++4o+dNT33sa+SN9vOJL7iHiHFjiNg== dependencies: async "~2.6.3" @@ -18180,10 +16093,11 @@ select-hose@^2.0.0: integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" semver-compare@^1.0.0: @@ -18283,6 +16197,16 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -18349,7 +16273,7 @@ shell-quote@1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shell-quote@^1.7.3, shell-quote@^1.8.0: +shell-quote@^1.7.3, shell-quote@^1.8.0, shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -18360,9 +16284,9 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== shiki@^0.14.1: - version "0.14.4" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.4.tgz#2454969b466a5f75067d0f2fa0d7426d32881b20" - integrity sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ== + version "0.14.5" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.5.tgz#375dd214e57eccb04f0daf35a32aa615861deb93" + integrity sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw== dependencies: ansi-sequence-parser "^1.1.0" jsonc-parser "^3.2.0" @@ -18409,10 +16333,10 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-diff@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/simple-diff/-/simple-diff-1.7.1.tgz#88a628222eb66799cf0844ca4314b8a4030514de" - integrity sha512-adwK0aCHYSLEDOiAxb4TjGE3h2WGFox2Luzkqy9m68O/P2iEpZbcnFYKqrbWVgKXf/pUt+8yXvfSU38vXI8GSg== +simple-diff@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/simple-diff/-/simple-diff-1.7.2.tgz#2bd1877a42b50e9d7d2280cef6d142590cb694ef" + integrity sha512-7UPeBrh/I1zlY33vyUL5R0J1rP4HqP1zMpbuYw0+Lbq4OhWWadUi0dNziRMrQzjJsk2MoPwKDLHacjGpolUiqQ== simple-element-resize-detector@^1.3.0: version "1.3.0" @@ -18542,9 +16466,9 @@ socks@^2.6.2: smart-buffer "^4.2.0" sonic-boom@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.4.0.tgz#8582d1385ea3bf79ca953329043bfbdbabe58eb9" - integrity sha512-zSe9QQW30nPzjkSJ0glFQO5T9lHsk39tz+2bAAwCj8CNgEG8ItZiX7Wb2ZgA8I04dwRGCcf1m3ABJa8AYm12Fw== + version "3.7.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.7.0.tgz#b4b7b8049a912986f4a92c51d4660b721b11f2f2" + integrity sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg== dependencies: atomic-sleep "^1.0.0" @@ -18626,9 +16550,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.15" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" - integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdy-transport@^3.0.0: version "3.0.0" @@ -18660,11 +16584,6 @@ speed-measure-webpack-plugin@1.5.0: dependencies: chalk "^4.1.0" -"spinners-react@npm:spinners-react-peer-deps-fix@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/spinners-react-peer-deps-fix/-/spinners-react-peer-deps-fix-1.0.5.tgz#46f04e9a49dc28c4095702a8f2a6a0431e65db26" - integrity sha512-omfqnPtQjUdbIUIcirqnszRDyX1fl3AJtMvi53wvwUVeqi5B6v5yYShzVNU6U3KBYAAHq1IHfxnvrkolmMi1Sg== - split2@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" @@ -18699,9 +16618,9 @@ sqlite3@^5.1.6: node-gyp "8.x" sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -18741,9 +16660,9 @@ statuses@2.0.1: integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== std-env@^3.3.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.4.3.tgz#326f11db518db751c83fd58574f449b7c3060910" - integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== + version "3.5.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.5.0.tgz#83010c9e29bd99bf6f605df87c19012d82d63b97" + integrity sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA== stdin-discarder@^0.1.0: version "0.1.0" @@ -18800,11 +16719,6 @@ stream-to-promise@3.0.0: end-of-stream "~1.4.1" stream-to-array "~2.3.0" -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -18996,25 +16910,6 @@ styled-components@^5.3.11: shallowequal "^1.1.0" supports-color "^5.5.0" -styled-system@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/styled-system/-/styled-system-5.1.5.tgz#e362d73e1dbb5641a2fd749a6eba1263dc85075e" - integrity sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A== - dependencies: - "@styled-system/background" "^5.1.2" - "@styled-system/border" "^5.1.5" - "@styled-system/color" "^5.1.2" - "@styled-system/core" "^5.1.2" - "@styled-system/flexbox" "^5.1.2" - "@styled-system/grid" "^5.1.2" - "@styled-system/layout" "^5.1.2" - "@styled-system/position" "^5.1.2" - "@styled-system/shadow" "^5.1.2" - "@styled-system/space" "^5.1.2" - "@styled-system/typography" "^5.1.2" - "@styled-system/variant" "^5.1.5" - object-assign "^4.1.1" - stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" @@ -19092,11 +16987,6 @@ synckit@^0.8.4: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" -tabbable@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" - integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== - tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -19141,9 +17031,9 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.10.0, terser@^5.16.8: - version "5.20.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" - integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== + version "5.24.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -19179,9 +17069,9 @@ thenify-all@^1.0.0: any-promise "^1.0.0" thread-stream@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.0.tgz#5def29598d1d4171ba3bace7e023a71d87d99c07" - integrity sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw== + version "2.4.1" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== dependencies: real-require "^0.2.0" @@ -19234,9 +17124,9 @@ tinypool@^0.7.0: integrity sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww== tinyspy@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.1.1.tgz#9e6371b00c259e5c5b301917ca18c01d40ae558c" - integrity sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" + integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== tippy.js@^6.3.1: version "6.3.7" @@ -19455,7 +17345,7 @@ tsconfig-resolver@^3.0.1: strip-bom "^4.0.0" type-fest "^0.13.1" -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -19511,11 +17401,6 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-fest@^1.0.1: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" @@ -19600,15 +17485,10 @@ typescript@*, typescript@5.2.2, typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== -typescript@^4.1.2: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - ufo@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.1.tgz#e085842f4627c41d4c1b60ebea1f75cdab4ce86b" - integrity sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== uglify-js@^3.1.9: version "3.17.4" @@ -19625,12 +17505,17 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.22.0: - version "5.25.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.25.2.tgz#17ddc3e8ab3c77e473ae1547f3f2917a05da2820" - integrity sha512-tch8RbCfn1UUH1PeVCXva4V8gDpGAud/w0WubD6sHC46vYQ3KDxL+xv1A2UxK0N6jrVedutuPHxe1XIoqerwMw== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.22.0, undici@^5.25.4: + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" unfetch@^3.1.1: version "3.1.2" @@ -19755,9 +17640,9 @@ universalify@^1.0.0: integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -19847,7 +17732,7 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" -use-events@1.4.2, use-events@^1.4.1: +use-events@1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/use-events/-/use-events-1.4.2.tgz#bb41f61d08f97296e503b21dd95d612f8e45b524" integrity sha512-CVgNgSl5dnJaHKirbWab6TtdxSnb+e5rfi4WybLFUTXweRyYO+kkBtECauHlUiZLghGTsCyRaSgOeWSETvgtmw== @@ -19859,21 +17744,13 @@ use-isomorphic-layout-effect@^1.1.1, use-isomorphic-layout-effect@^1.1.2: resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -use-latest@1.2.1, use-latest@^1.0.0: +use-latest@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: use-isomorphic-layout-effect "^1.1.1" -"use-onclickoutside@npm:use-onclickoutside-peer-deps@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/use-onclickoutside-peer-deps/-/use-onclickoutside-peer-deps-0.3.1.tgz#2c52f1792a05bb2a169f8acf0883013bf1a1b236" - integrity sha512-n1yuLXBm6nwy03/tIcYNTimXN1hcAoOoMqkiiKXJf3X8E5zJ32UVPHSEV9kTHsHU54/sXWiZpFLzouFL3GseAA== - dependencies: - are-passive-events-supported "^1.1.0" - use-latest "^1.0.0" - use-sidecar@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" @@ -20070,9 +17947,9 @@ vite@4.4.11: fsevents "~2.3.2" "vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0-0", vite@^4.4.6: - version "4.4.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" - integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -20081,9 +17958,9 @@ vite@4.4.11: fsevents "~2.3.2" vitefu@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.4.tgz#212dc1a9d0254afe65e579351bed4e25d81e0b35" - integrity sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g== + version "0.2.5" + resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" + integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== vitest@0.34.6: version "0.34.6" @@ -20121,24 +17998,24 @@ vm-browserify@1.1.2: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vscode-css-languageservice@^6.2.1: - version "6.2.9" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.2.9.tgz#5bdd12012bf15069fb671734130deca0a0acbc0c" - integrity sha512-9MsOvAi+VycKomQ7KEq4o/hLtjHHrtRLLl8lM9nMcH8cxfNI7/6jVXmsV/7pdbDWu9L3DZhsspN1eMXZwiOymw== + version "6.2.10" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.2.10.tgz#ba114d92d634df7b45f572a6eaaccd29cbde5d9d" + integrity sha512-sYUZPku4mQ06AWGCbMyjv2tdR6juBW6hTbVPFwbJvNVzdtEfBioQOgkdXg7yMJNWnXkvWSU1FL2kb4Vxu5Cdyw== dependencies: "@vscode/l10n" "^0.0.16" - vscode-languageserver-textdocument "^1.0.8" - vscode-languageserver-types "3.17.3" - vscode-uri "^3.0.7" + vscode-languageserver-textdocument "^1.0.11" + vscode-languageserver-types "3.17.5" + vscode-uri "^3.0.8" vscode-html-languageservice@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-5.1.0.tgz#ba4f302eda5d8c248bcf5d173d862f241c4b48d3" - integrity sha512-cGOu5+lrz+2dDXSGS15y24lDtPaML1T8K/SfqgFbLmCZ1btYOxceFieR+ybTS2es/A67kRc62m2cKFLUQPWG5g== + version "5.1.1" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-5.1.1.tgz#8e56f7e11c1e3f4a9d56de0f97badea9296f4e04" + integrity sha512-JenrspIIG/Q+93R6G3L6HdK96itSisMynE0glURqHpQbL3dKAKzdm8L40lAHNkwJeBg+BBPpAshZKv/38onrTQ== dependencies: "@vscode/l10n" "^0.0.16" - vscode-languageserver-textdocument "^1.0.8" - vscode-languageserver-types "^3.17.3" - vscode-uri "^3.0.7" + vscode-languageserver-textdocument "^1.0.11" + vscode-languageserver-types "^3.17.5" + vscode-uri "^3.0.8" vscode-jsonrpc@8.1.0: version "8.1.0" @@ -20166,7 +18043,7 @@ vscode-languageserver-protocol@^3.17.1: vscode-jsonrpc "8.2.0" vscode-languageserver-types "3.17.5" -vscode-languageserver-textdocument@^1.0.1, vscode-languageserver-textdocument@^1.0.4, vscode-languageserver-textdocument@^1.0.8: +vscode-languageserver-textdocument@^1.0.1, vscode-languageserver-textdocument@^1.0.11, vscode-languageserver-textdocument@^1.0.4: version "1.0.11" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== @@ -20176,7 +18053,7 @@ vscode-languageserver-types@3.17.3: resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== -vscode-languageserver-types@3.17.5, vscode-languageserver-types@^3.15.1, vscode-languageserver-types@^3.17.1, vscode-languageserver-types@^3.17.3: +vscode-languageserver-types@3.17.5, vscode-languageserver-types@^3.15.1, vscode-languageserver-types@^3.17.1, vscode-languageserver-types@^3.17.5: version "3.17.5" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== @@ -20203,10 +18080,10 @@ vscode-uri@^2.1.2: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== -vscode-uri@^3.0.3, vscode-uri@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.7.tgz#6d19fef387ee6b46c479e5fb00870e15e58c1eb8" - integrity sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA== +vscode-uri@^3.0.3, vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== w3c-xmlserializer@^4.0.0: version "4.0.0" @@ -20215,13 +18092,6 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" -warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - watchpack@2.4.0, watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -20319,24 +18189,20 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-bundle-analyzer@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" - integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== +webpack-bundle-analyzer@4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" commander "^7.2.0" + debounce "^1.2.1" escape-string-regexp "^4.0.0" gzip-size "^6.0.0" + html-escaper "^2.0.2" is-plain-object "^5.0.0" - lodash.debounce "^4.0.8" - lodash.escape "^4.0.1" - lodash.flatten "^4.4.0" - lodash.invokemap "^4.6.0" - lodash.pullall "^4.2.0" - lodash.uniqby "^4.7.0" opener "^1.5.2" picocolors "^1.0.0" sirv "^2.0.3" @@ -20418,11 +18284,12 @@ webpack-hot-middleware@2.25.4: strip-ansi "^6.0.0" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-shell-plugin@0.5.0: @@ -20448,10 +18315,10 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== -webpack@5.88.2, webpack@^5: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== +webpack@5.89.0, webpack@^5: + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -20590,13 +18457,13 @@ which-pm@^2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" -which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" @@ -20700,9 +18567,9 @@ writable-consumable-stream@^3.0.1: consumable-stream "^2.0.0" writable-consumable-stream@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/writable-consumable-stream/-/writable-consumable-stream-4.0.1.tgz#5137a6cbc8fabf0963ac2339bb27e047c35fd933" - integrity sha512-iFGcPiaENb4MjN12seViXs5hxuzqdac6Q+HkrZFHJDzw7pezyCsT1nw1h0W2OIu381xn1NAIvBllEGRtpuDuFw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/writable-consumable-stream/-/writable-consumable-stream-4.1.0.tgz#e677076f91499159361d7917dce379cad624b344" + integrity sha512-4cjCPd4Ayfbix0qqPCzMbnPPZKRh/cKeNCj05unybP3/sRkRAOxh7rSwbhxs3YB6G4/Z2p/2FRBEIQcTeB4jyw== dependencies: consumable-stream "^3.0.0" @@ -20889,9 +18756,9 @@ zip-dir@2.0.0: jszip "^3.2.2" zod@^3.20.6: - version "3.22.2" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" - integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== zone-file@^2.0.0-beta.3: version "2.0.0-beta.3"