@tuwaio/nova-connect 1.0.0-fix-test-alpha.54.7152f59 → 1.0.0-fix-test-alpha.56.a984de3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/evm/utils.ts","../../src/utils/adapters/evm.ts","../../src/solana/utils.ts","../../src/utils/adapters/solana.ts","../../src/i18n/en.ts","../../src/hooks/useNovaConnectLabels.ts","../../src/components/Chains/ChainListRenderer.tsx","../../src/hooks/useNovaConnect.ts","../../src/utils/getConnectedChainId.ts","../../src/utils/isTouchDevice.ts","../../src/utils/networksLinks.ts","../../src/components/ToBottomButton.tsx","../../src/components/ToTopButton.tsx","../../src/components/SelectContentAnimated.tsx","../../src/components/WalletAvatar.tsx","../../src/components/WalletIcon.tsx","../../src/components/ConnectedModal/IconButton.tsx","../../src/components/ConnectedModal/ConnectedModalTxHistory.tsx","../../src/components/ConnectModal/RecentBadge.tsx","../../src/components/ToastError.tsx","../../src/providers/ErrorsProvider.tsx","../../src/providers/NovaConnectLabelsProvider.tsx","../../src/providers/NovaConnectProvider.tsx"],"names":["utils_exports","__export","getEvmChains","isEvmChainList","isValidEvmChainId","id","appChains","chain","chains","init_utils","__esmMin","evm_exports","createEvmAdapter","isEvmAdapterAvailable","getEvmUtils","error","evmUtils","getAvailableSolanaClusters","getSolanaClusters","isSolanaChainList","isValidSolanaCluster","extractSolanaCluster","chainId","parts","cluster","defaultRpcUrlsByMoniker","buildSolanaRpcUrls","solanaRPCUrls","availableRpcUrls","rpcUrl","solana_exports","createSolanaAdapter","isSolanaAdapterAvailable","getSolanaUtils","solanaUtils","defaultLabels","NovaConnectLabelsContext","createContext","useNovaConnectLabels","useContext","SelectItemBase","forwardRef","children","className","props","forwardedRef","labels","isActive","jsxs","Ao","cn","Fragment","jsx","NovaConnectProviderError","message","NovaConnectProviderContext","useNovaConnect","context","OrbitAdapter","isTouchDevice","maxWidth","hasTouchStart","hasMaxTouchPoints","hasCoarsePointer","supportsTouch","isSmallScreen","ToBottomButton","ariaLabel","onClick","disabled","ref","event","ChevronDownIcon","ToTopButton","ChevronUpIcon","SelectContentAnimated","position","reduceMotion","animationConfig","useMemo","layoutTransition","contentClasses","selectContentClasses","d","AnimatePresence","motion","isHex","value","strict","zeroAddress","sizeClasses","WalletAvatar","address","ensAvatar","altText","size","showLoading","onImageLoad","onImageError","disableAnimation","imageSrc","setImageSrc","useState","isLoading","setIsLoading","hasError","setHasError","imgRef","useRef","blockie","makeBlockie","bgColor","colorHex","formattedAddress","imageAltText","currentEnsAvatar","handleImageLoad","useCallback","handleImageError","containerClasses","loadingClasses","currentImageSrc","WalletIcon","icon","name","lazy","walletName","formatWalletName","cleanIconUrl","trimmedIcon","imageClasses","imageStyle","Web3Icon","IconButton","walletIcon","walletChainId","items","loading","title","isClickable","formattedChainId","accessibleLabel","tooltipText","buttonClasses","ChevronArrowWithAnim","module","RecentBadge","memo","animated","isTouch","gradientBackground","idCounter","ToastError","rawError","onCopyComplete","isCopied","copy","useCopyToClipboard","uniqueId","v","titleId","descriptionId","errorToCopy","handleCopy","e","handleKeyDown","DocumentDuplicateIcon","ErrorsProvider","store","containerId","autoClose","draggable","activeWallet","walletConnectionError","switchNetworkError","displayedErrorsRef","currentToastIdRef","errorState","hasWalletError","hasSwitchError","isConnected","errorTitle","errorHash","dismissCurrentToast","toast","showErrorToast","errorKey","success","useEffect","hasAnyError","primaryError","containerProps","ToastCloseButton","Bounce","ToastContainer","NovaConnectLabelsProvider","memoizedLabels","missingLabels","key","NovaConnectProvider","mergedLabels","deepMerge","setActiveWallet","setWalletConnectionError","isConnectModalOpen","setIsConnectModalOpen","isConnectedModalOpen","setIsConnectedModalOpen","isChainsListOpen","setIsChainsListOpen","isChainsListOpenMobile","setIsChainsListOpenMobile","connectedButtonStatus","setConnectedButtonStatus","connectModalContentType","setConnectModalContentType","selectedAdapter","setSelectedAdapter","activeConnector","setActiveConnector","impersonatedAddress","setImpersonatedAddress","setIsConnected","connectedModalContentType","setConnectedModalContentType","state","contextValue"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Chain } from 'viem/chains';\n\n/**\n * Type guard to check if a value is a valid EVM chain ID\n */\nfunction isValidEvmChainId(id: unknown): id is number {\n return id !== undefined && id !== null && typeof id === 'number' && id > 0;\n}\n\n/**\n * Get EVM chain IDs from app chains configuration\n */\nexport function getEvmChains(appChains?: readonly [Chain, ...Chain[]]): number[] {\n if (!appChains || appChains.length === 0) {\n return [];\n }\n\n return appChains.map((chain) => chain.id).filter(isValidEvmChainId);\n}\n\n/**\n * Type guard to check if a chain list contains EVM chain IDs\n */\nexport function isEvmChainList(chains: (string | number)[]): chains is number[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'number');\n}\n","import type { ChainAdapter } from './types';\n\n/**\n * EVM utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface EvmUtilsModule {\n getEvmChains?: (appChains: any) => (string | number)[];\n isEvmChainList?: (chains: (string | number)[]) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of EVM utilities.\n * This function attempts to load EVM-specific utilities without throwing errors\n * if the EVM package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to EVM utilities module or null if not available\n *\n * @example\n * ```typescript\n * const evmUtils = await getEvmUtils();\n * if (evmUtils?.getEvmChains) {\n * const chains = evmUtils.getEvmChains(appChains);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getEvmUtils(): Promise<EvmUtilsModule | null> {\n try {\n // Dynamic import of EVM utilities - fails gracefully if package not installed\n const evmUtils = await import('../../evm/utils');\n return evmUtils;\n } catch (error) {\n console.warn('EVM utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates an EVM chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides EVM-specific functionality while gracefully handling\n * environments where EVM utilities are not available. It uses intelligent\n * fallbacks to ensure basic functionality even without the full EVM package.\n *\n * @returns Promise resolving to a configured EVM ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createEvmAdapter();\n *\n * // Get EVM chain IDs from app configuration\n * const chainIds = adapter.getChains([\n * { id: 1, name: 'Ethereum' },\n * { id: 137, name: 'Polygon' }\n * ]);\n * console.log(chainIds); // [1, 137]\n *\n * // Validate chain list format\n * const isValid = adapter.isChainList([1, 137, 56]);\n * console.log(isValid); // true (numeric IDs are valid for EVM)\n * ```\n *\n * @since 1.0.0\n */\nexport async function createEvmAdapter(): Promise<ChainAdapter> {\n const evmUtils = await getEvmUtils();\n\n return {\n /**\n * Extracts chain IDs from EVM app chain configuration.\n *\n * @param appChains Array of chain configurations or chain identifiers\n * @returns Array of chain IDs (numbers or strings)\n */\n getChains(appChains: any): (string | number)[] {\n // Use imported EVM utilities if available\n if (evmUtils?.getEvmChains) {\n return evmUtils.getEvmChains(appChains);\n }\n\n // Fallback implementation for basic chain extraction\n if (!Array.isArray(appChains) || appChains.length === 0) {\n return [];\n }\n\n return appChains\n .map((chain: any) => {\n // Handle chain objects with id property\n if (typeof chain === 'object' && chain?.id !== undefined) {\n return chain.id;\n }\n // Handle direct chain identifiers\n if (typeof chain === 'number' || typeof chain === 'string') {\n return chain;\n }\n return null;\n })\n .filter((id: any): id is string | number => id !== null && (typeof id === 'string' || typeof id === 'number'));\n },\n\n /**\n * Validates whether the provided chains list conforms to EVM chain format.\n * EVM chains are typically identified by numeric IDs.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for EVM\n */\n isChainList(chains: (string | number)[]): boolean {\n if (evmUtils?.isEvmChainList) {\n return evmUtils.isEvmChainList(chains);\n }\n\n // Fallback validation: EVM chains should be numbers\n return chains.length > 0 && chains.every((chain) => typeof chain === 'number');\n },\n };\n}\n\n/**\n * Checks if the EVM adapter can be created in the current environment.\n * This function verifies that the required EVM utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if EVM adapter is available\n *\n * @example\n * ```typescript\n * const hasEvm = await isEvmAdapterAvailable();\n * if (hasEvm) {\n * const adapter = await createEvmAdapter();\n * // Use EVM functionality\n * } else {\n * console.log('EVM support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isEvmAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../evm/utils');\n return true;\n } catch {\n return false;\n }\n}\n","import { defaultRpcUrlsByMoniker, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport type { SolanaClusterMoniker } from 'gill';\n\nimport { ChainIdentifierArray } from '../types';\n\n/**\n * Extracts Solana cluster from chain identifier\n */\nfunction extractSolanaCluster(chainId: string): SolanaClusterMoniker | null {\n const parts = chainId.split(':');\n if (parts.length < 2) return null;\n\n const cluster = parts[1] as SolanaClusterMoniker;\n // Validate that it's a known cluster\n return cluster in defaultRpcUrlsByMoniker ? cluster : null;\n}\n\n/**\n * Builds available Solana RPC URLs from chain identifiers\n */\nfunction buildSolanaRpcUrls(\n chains: ChainIdentifierArray,\n solanaRPCUrls?: SolanaRPCUrls['rpcUrls'],\n): SolanaRPCUrls['rpcUrls'] {\n const availableRpcUrls: SolanaRPCUrls['rpcUrls'] = {};\n\n for (const chainId of chains) {\n if (typeof chainId !== 'string') continue;\n\n const cluster = extractSolanaCluster(chainId);\n if (!cluster) continue;\n\n // Get RPC URL with fallback to default\n const rpcUrl = solanaRPCUrls?.[cluster] ?? defaultRpcUrlsByMoniker[cluster];\n\n if (rpcUrl) {\n availableRpcUrls[cluster] = rpcUrl;\n }\n }\n\n return availableRpcUrls;\n}\n\n/**\n * Get Solana clusters from configuration\n */\nexport function getSolanaClusters(\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>,\n chains?: ChainIdentifierArray,\n): string[] {\n if (chains && chains.length > 0) {\n // For Solana, build RPC URLs and return cluster names\n const availableRpcUrls = buildSolanaRpcUrls(chains, solanaRPCUrls);\n return Object.keys(availableRpcUrls);\n }\n\n // Return configured clusters or defaults\n return Object.keys(solanaRPCUrls || defaultRpcUrlsByMoniker);\n}\n\n/**\n * Type guard to check if a chain list contains Solana cluster names\n */\nexport function isSolanaChainList(chains: (string | number)[]): chains is string[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n}\n\n/**\n * Gets available Solana clusters from the default configuration\n */\nexport function getAvailableSolanaClusters(): SolanaClusterMoniker[] {\n return Object.keys(defaultRpcUrlsByMoniker) as SolanaClusterMoniker[];\n}\n\n/**\n * Validates if a string is a valid Solana cluster moniker\n */\nexport function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker {\n return cluster in defaultRpcUrlsByMoniker;\n}\n","import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n // Dynamic import of Solana utilities - fails gracefully if package not installed\n const solanaUtils = await import('../../solana/utils');\n return solanaUtils;\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n\n/**\n * Checks if the Solana adapter can be created in the current environment.\n * This function verifies that the required Solana utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if Solana adapter is available\n *\n * @example\n * ```typescript\n * const hasSolana = await isSolanaAdapterAvailable();\n * if (hasSolana) {\n * const adapter = await createSolanaAdapter();\n * // Use Solana functionality\n * const clusters = adapter.getAvailableClusters?.();\n * } else {\n * console.log('Solana support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isSolanaAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../solana/utils');\n return true;\n } catch {\n return false;\n }\n}\n","import { NovaConnectLabels } from './types';\n\n/**\n * Default English translations for NovaConnect component\n * All text strings extracted from component files\n */\nexport const defaultLabels: NovaConnectLabels = {\n // Core actions - Primary user interactions\n connectWallet: 'Connect Wallet',\n disconnect: 'Disconnect',\n connecting: 'Connecting...',\n connected: 'Connected',\n tryAgain: 'Try again',\n back: 'Back',\n connect: 'Connect',\n close: 'Close',\n all: 'All',\n\n // Connection states - Status messages for wallet connection flow\n connectionError: 'Connection error',\n connectedSuccessfully: 'Connected successfully!',\n connectingTo: 'Connecting to',\n walletConnectionError: 'Wallet connection error',\n errorWhenChainSwitching: 'Error when chain switching',\n cannotConnectWallet: 'Cannot connect to the wallet. Please try again or use another connector.',\n\n // Transaction states - Status indicators for blockchain transactions\n success: 'Success',\n error: 'Error',\n replaced: 'Replaced',\n recent: 'Recent',\n transactionLoading: 'Transaction loading',\n transactionSuccess: 'Transaction successful',\n transactionError: 'Transaction failed',\n transactionReplaced: 'Transaction replaced',\n\n // Modal titles - Headers for different modal dialogs\n aboutWallets: 'About wallets',\n getWallet: 'Get a wallet',\n connectImpersonatedWallet: 'Connect impersonated wallet',\n transactionsInApp: 'Transactions in app',\n switchNetwork: 'Switch network',\n switchNetworks: 'Switch Networks',\n connectingEllipsis: 'Connecting...',\n\n // Wallet sections - Categories for wallet connector grouping\n installed: 'Installed',\n popular: 'Popular',\n impersonate: 'Impersonate',\n readOnlyMode: 'Read-only mode',\n\n // Information and descriptions - Educational content and explanations\n whatIsWallet: 'What is a wallet?',\n walletDescription:\n 'Wallets are essential for managing your crypto—they let you send, receive, and securely hold digital assets. Connecting your wallet grants you safe access and interaction with decentralized applications (dApps).',\n whatIsNetwork: 'What is a network?',\n networkDescription:\n 'A network (or blockchain) is a decentralized digital ledger that records transactions. Selecting a network lets you choose which blockchain you want to connect to.',\n learnMore: 'Learn more',\n listOfNetworks: 'List of networks',\n viewOnExplorer: 'View on explorer',\n viewTransactions: 'View transactions',\n\n // Impersonation form - Labels for wallet address impersonation feature\n enterWalletAddress: 'Enter wallet address to impersonate',\n walletAddressPlaceholder: '0x...',\n\n // Error messages - User-facing error notifications and descriptions\n noConnectorsFound: 'No Connectors Found',\n noConnectorsDescription: \"We couldn't find any wallets or connection methods for the selected network.\",\n somethingWentWrong: 'Something went wrong',\n networkPickingError: 'Something went wrong with wallet network selection. Please go back and try again.',\n pulsarAdapterRequired: 'Pulsar Adapter Required',\n pulsarAdapterDescription:\n 'Additional configuration is needed for viewing transactions in app. Please contact your admin.',\n selectAvailableNetwork: 'Select one of available network',\n\n // Get Wallet section - Onboarding content for new users without wallets\n startExploringWeb3: 'Start Exploring Web3',\n walletKeyToDigitalWorld:\n 'Your wallet is the key to the digital world and the technology that makes exploring web3 possible.',\n iDontHaveWallet: \"I don't have a wallet\",\n choseWallet: 'Choose a wallet',\n\n // About Wallets slides - Educational carousel content explaining wallet benefits\n keyToNewInternet: 'The Key to a New Internet',\n keyToNewInternetDescription:\n 'Your wallet is more than just storage. Think of it as your digital passport that lets you truly own, display, and exchange every digital asset you hold, from crypto tokens to unique NFTs.',\n logInWithoutHassle: 'Log In Without the Hassle',\n logInWithoutHassleDescription:\n 'Skip the endless sign-up forms! Your wallet is your unique access pass. Just connect it, and the website instantly recognizes you. It saves you time and protects your privacy.',\n\n // Copy functionality and UI feedback - Clipboard operations and user feedback\n copyRawError: 'Copy raw error',\n copied: 'Copied!',\n\n // Accessibility labels - Screen reader and ARIA labels for better accessibility\n chainSelector: 'Chain Selector',\n closeModal: 'Close modal',\n selectChain: 'Select chain',\n chainOption: 'Chain option',\n openChainSelector: 'Open chain selector',\n currentChain: 'Current chain',\n scrollToTop: 'Scroll to top',\n scrollToBottom: 'Scroll to bottom',\n chainListContainer: 'Chain list container',\n walletControls: 'Wallet controls',\n openWalletModal: 'Open wallet modal',\n walletConnected: 'Wallet connected',\n walletNotConnected: 'Wallet not connected',\n walletBalance: 'Wallet balance',\n walletAddress: 'Wallet address',\n transactionStatus: 'Transaction status',\n successIcon: 'Success icon',\n errorIcon: 'Error icon',\n replacedIcon: 'Replaced icon',\n statusIcon: 'Status icon',\n\n // Additional states - Supplementary status indicators\n loading: 'Loading',\n idle: 'Idle',\n\n // Wallet Avatar labels\n unknownWallet: 'Unknown wallet',\n walletAvatar: 'Wallet avatar',\n ensAvatar: 'ENS avatar',\n walletIcon: 'Wallet icon',\n\n // Impersonate errors\n impersonateAddressEmpty: 'Enter a wallet address to impersonate.',\n impersonateAddressNotCorrect: 'Entered wallet address is not correct. Please try again.',\n impersonateAddressConnected: 'First disconnect the wallet to impersonate another address.',\n};\n","import { createContext, useContext } from 'react';\n\nimport { defaultLabels } from '../i18n/en';\nimport { NovaConnectLabels } from '../i18n/types';\n\n/**\n * React Context for storing and providing the UI labels.\n * It is initialized with the default English labels, ensuring that components\n * work even without an explicit provider.\n */\nexport const NovaConnectLabelsContext = createContext<NovaConnectLabels>(defaultLabels);\n\n/**\n * A custom hook to easily access the i18n labels from any component\n * within the `NovaConnectLabelsProvider` tree.\n *\n * This hook provides type-safe access to all UI labels and automatically\n * falls back to default English labels if no provider is found.\n *\n * @returns {NovaConnectLabels} The complete object of UI labels for the current locale.\n *\n * @example\n * ```typescript\n * import { useNovaConnectLabels } from './hooks/useNovaConnectLabels';\n *\n * function MyComponent() {\n * const labels = useNovaConnectLabels();\n *\n * return (\n * <div>\n * <h1>{labels.connectWallet}</h1>\n * <button>{labels.connect}</button>\n * <p aria-label={labels.walletBalance}>{formattedBalance}</p>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Destructuring specific labels for better performance\n * function ConnectButton() {\n * const { connectWallet, connecting, connected } = useNovaConnectLabels();\n *\n * return (\n * <button>\n * {isConnecting ? connecting : isConnected ? connected : connectWallet}\n * </button>\n * );\n * }\n * ```\n */\nexport const useNovaConnectLabels = (): NovaConnectLabels => {\n return useContext(NovaConnectLabelsContext);\n};\n\n/**\n * Hook to get a specific label by key path with type safety\n *\n * @param key The label key to retrieve\n * @returns The specific label value\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const connectLabel = useNovaConnectLabel('connectWallet');\n * const errorLabel = useNovaConnectLabel('connectionError');\n *\n * return <button>{connectLabel}</button>;\n * }\n * ```\n */\nexport const useNovaConnectLabel = <K extends keyof NovaConnectLabels>(key: K): NovaConnectLabels[K] => {\n const labels = useNovaConnectLabels();\n return labels[key];\n};\n\n/**\n * Hook to get multiple specific labels for better performance\n *\n * @param keys Array of label keys to retrieve\n * @returns Object with only the requested labels\n *\n * @example\n * ```typescript\n * function ConnectModal() {\n * const { connectWallet, connecting, disconnect } = useNovaConnectLabelsSubset(['connectWallet', 'connecting', 'disconnect']);\n *\n * return (\n * <div>\n * <h2>{connectWallet}</h2>\n * <span>{connecting}</span>\n * <button>{disconnect}</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useNovaConnectLabelsSubset = <K extends keyof NovaConnectLabels>(\n keys: K[],\n): Pick<NovaConnectLabels, K> => {\n const allLabels = useNovaConnectLabels();\n\n const subset = {} as Pick<NovaConnectLabels, K>;\n for (const key of keys) {\n subset[key] = allLabels[key];\n }\n\n return subset;\n};\n\n/**\n * Type-safe helper to check if a label exists\n *\n * @param labels The labels object\n * @param key The key to check\n * @returns Whether the key exists and has a non-empty value\n */\nexport const hasLabel = (labels: NovaConnectLabels, key: keyof NovaConnectLabels): boolean => {\n return Boolean(labels[key]?.trim());\n};\n\n/**\n * Utility type for extracting label keys by category\n */\nexport type LabelCategory = {\n actions: Extract<\n keyof NovaConnectLabels,\n 'connectWallet' | 'disconnect' | 'connecting' | 'connected' | 'tryAgain' | 'back' | 'connect' | 'close'\n >;\n states: Extract<keyof NovaConnectLabels, 'success' | 'error' | 'replaced' | 'loading' | 'idle'>;\n accessibility: Extract<\n keyof NovaConnectLabels,\n 'chainSelector' | 'closeModal' | 'selectChain' | 'walletControls' | 'openWalletModal'\n >;\n transactions: Extract<\n keyof NovaConnectLabels,\n 'transactionLoading' | 'transactionSuccess' | 'transactionError' | 'transactionReplaced' | 'recent'\n >;\n};\n\n/**\n * Hook to get labels by category for better organization\n *\n * @param category The category of labels to retrieve\n * @returns Object with labels from the specified category\n */\nexport const useLabelsByCategory = <T extends keyof LabelCategory>(\n category: T,\n): Pick<NovaConnectLabels, LabelCategory[T]> => {\n const allLabels = useNovaConnectLabels();\n\n const categoryKeys: Record<keyof LabelCategory, (keyof NovaConnectLabels)[]> = {\n actions: ['connectWallet', 'disconnect', 'connecting', 'connected', 'tryAgain', 'back', 'connect', 'close'],\n states: ['success', 'error', 'replaced', 'loading', 'idle'],\n accessibility: ['chainSelector', 'closeModal', 'selectChain', 'walletControls', 'openWalletModal'],\n transactions: ['transactionLoading', 'transactionSuccess', 'transactionError', 'transactionReplaced', 'recent'],\n };\n\n const keys = categoryKeys[category] as LabelCategory[T][];\n const categoryLabels = {} as Pick<NovaConnectLabels, LabelCategory[T]>;\n\n for (const key of keys) {\n // eslint-disable-next-line\n (categoryLabels as any)[key] = allLabels[key as keyof NovaConnectLabels];\n }\n\n return categoryLabels;\n};\n\n/**\n * Utility function to check if labels are default ones (for external use)\n * This is a regular function, not a hook, so it can be used anywhere\n *\n * @param labels The labels to check\n * @returns Whether the labels are the default English labels\n *\n * @example\n * ```typescript\n * function SomeUtilityFunction(labels: NovaConnectLabels) {\n * if (isDefaultLabels(labels)) {\n * console.log('Using default English labels');\n * }\n * }\n * ```\n */\nexport const isDefaultLabels = (labels: NovaConnectLabels): boolean => {\n return labels === defaultLabels;\n};\n\n/**\n * Utility function to get a formatted label with fallback\n *\n * @param labels The labels object\n * @param key The label key\n * @param fallback Optional fallback text\n * @returns The label value or fallback\n *\n * @example\n * ```typescript\n * const buttonText = getLabelWithFallback(labels, 'connectWallet', 'Connect');\n * ```\n */\nexport const getLabelWithFallback = (\n labels: NovaConnectLabels,\n key: keyof NovaConnectLabels,\n fallback?: string,\n): string => {\n const value = labels[key];\n if (value && value.trim()) {\n return value;\n }\n return fallback || defaultLabels[key] || key.toString();\n};\n\n/**\n * Utility function to create a labels subset (for use outside of React components)\n *\n * @param labels The source labels object\n * @param keys Array of keys to extract\n * @returns Object with only the requested labels\n *\n * @example\n * ```typescript\n * const actionLabels = createLabelsSubset(labels, ['connect', 'disconnect', 'tryAgain']);\n * ```\n */\nexport const createLabelsSubset = <K extends keyof NovaConnectLabels>(\n labels: NovaConnectLabels,\n keys: K[],\n): Pick<NovaConnectLabels, K> => {\n const subset = {} as Pick<NovaConnectLabels, K>;\n for (const key of keys) {\n subset[key] = labels[key];\n }\n return subset;\n};\n","import { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport * as Select from '@radix-ui/react-select';\nimport { cn } from '@tuwaio/nova-core';\nimport React, { type ComponentPropsWithoutRef, type ElementRef, forwardRef } from 'react';\n\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\n\ninterface ChainData {\n formattedChainId: string | number;\n chain: string | number;\n}\n\ninterface ChainListRendererProps {\n chainsList: (string | number)[];\n selectValue: string;\n handleValueChange: (newChainId: string) => void;\n getChainData: (chain: string | number) => ChainData;\n onClose: () => void;\n isMobile?: boolean;\n}\n\nconst SelectItemBase = forwardRef<ElementRef<typeof Select.Item>, ComponentPropsWithoutRef<typeof Select.Item>>(\n ({ children, className, ...props }, forwardedRef) => {\n const labels = useNovaConnectLabels();\n const isActive = props.value === props['aria-label'];\n\n return (\n <Select.Item\n ref={forwardedRef}\n className={cn(\n 'novacon:flex novacon:items-center novacon:w-full novacon:text-left novacon:px-2 novacon:py-2 novacon:rounded-md novacon:transition-colors novacon:space-x-3 novacon:cursor-pointer novacon:outline-none',\n 'novacon:text-[var(--tuwa-text-primary)] novacon:hover:bg-[var(--tuwa-bg-muted)] novacon:focus:bg-[var(--tuwa-bg-muted)] novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-border-primary)] novacon:focus:ring-offset-2',\n { 'novacon:bg-[var(--tuwa-bg-muted)]': isActive },\n className,\n )}\n role=\"option\"\n aria-selected={isActive}\n tabIndex={0}\n {...props}\n >\n {children}\n {isActive && (\n <>\n <span\n className=\"novacon:ml-auto novacon:text-xs novacon:font-semibold novacon:w-2 novacon:h-2 novacon:rounded-full novacon:bg-[var(--tuwa-success-text)]\"\n aria-label={labels.connected}\n role=\"status\"\n />\n <span className=\"novacon:sr-only\">{labels.connected}</span>\n </>\n )}\n </Select.Item>\n );\n },\n);\nSelectItemBase.displayName = 'SelectItemBase';\n\nexport const ChainListRenderer: React.FC<ChainListRendererProps> = ({\n chainsList,\n selectValue,\n handleValueChange,\n getChainData,\n onClose,\n isMobile = false,\n}) => {\n const labels = useNovaConnectLabels();\n\n return (\n <div role=\"listbox\" aria-label={labels.selectChain}>\n {chainsList.map((chain) => {\n const { formattedChainId } = getChainData(chain);\n const isActive = String(formattedChainId) === selectValue;\n const chainName = getChainName(formattedChainId);\n\n const itemClasses = cn(\n 'novacon:flex novacon:items-center novacon:w-full novacon:text-left novacon:px-2 novacon:py-2 novacon:rounded-md novacon:transition-colors novacon:space-x-3 novacon:cursor-pointer novacon:outline-none',\n 'novacon:text-[var(--tuwa-text-primary)] novacon:hover:bg-[var(--tuwa-bg-muted)] novacon:focus:bg-[var(--tuwa-bg-muted)] novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-border-primary)] novacon:focus:ring-offset-2',\n { 'novacon:bg-[var(--tuwa-bg-muted)]': isActive },\n );\n\n const content = (\n <div className=\"novacon:flex novacon:items-center novacon:space-x-3 novacon:[&_img]:w-6 novacon:[&_img]:h-6\">\n <div aria-hidden=\"true\">\n <Web3Icon chainId={formattedChainId} />\n </div>\n <span className=\"novacon:text-sm novacon:font-medium\">{chainName}</span>\n </div>\n );\n\n const handleClick = () => {\n handleValueChange(String(formattedChainId));\n onClose();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n\n if (isMobile) {\n return (\n <div\n key={chain}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(itemClasses, 'novacon:justify-between')}\n role=\"option\"\n aria-selected={isActive}\n aria-label={`${labels.chainOption}: ${chainName}`}\n tabIndex={0}\n >\n {content}\n {isActive && (\n <div className=\"novacon:flex novacon:items-center novacon:space-x-2 novacon:text-xs novacon:font-semibold novacon:text-[var(--tuwa-text-tertiary)]\">\n <span aria-label={labels.connected}>{labels.connected}</span>\n <span\n className=\"novacon:ml-auto novacon:text-xs novacon:font-semibold novacon:w-2 novacon:h-2 novacon:rounded-full novacon:bg-[var(--tuwa-success-text)]\"\n aria-hidden=\"true\"\n role=\"status\"\n />\n </div>\n )}\n </div>\n );\n }\n\n return (\n <SelectItemBase\n value={String(formattedChainId)}\n aria-label={`${labels.chainOption}: ${chainName}`}\n key={chain}\n onSelect={handleClick}\n >\n {content}\n </SelectItemBase>\n );\n })}\n </div>\n );\n};\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { ISatelliteConnectStore } from '@tuwaio/satellite-core';\nimport { BaseWallet } from '@tuwaio/satellite-core';\nimport { createContext, useContext } from 'react';\nimport { StoreApi } from 'zustand/index';\n\nimport { NovaConnectLabels } from '../i18n/types';\nimport { Connector, Wallet } from '../types';\n\nexport type ButtonTxStatus = 'idle' | 'loading' | 'succeed' | 'failed' | 'replaced';\nexport type ConnectContentType = 'network' | 'connectors' | 'about' | 'getWallet' | 'connecting' | 'impersonate';\nexport type ConnectedContentType = 'main' | 'transactions' | 'chains';\n\n// Provider props interface\nexport interface NovaConnectProviderProps {\n store: StoreApi<ISatelliteConnectStore<Connector, Wallet>>;\n children: React.ReactNode;\n labels?: Partial<NovaConnectLabels>;\n}\n\n// Balance type for better type safety\nexport interface WalletBalance {\n value: string;\n symbol: string;\n}\n\n// Provider context type with better organization\nexport interface NovaConnectProviderType {\n activeWallet: BaseWallet | undefined;\n walletConnectionError: string | undefined;\n // Modal states\n isConnectModalOpen: boolean;\n setIsConnectModalOpen: (value: boolean) => void;\n isConnectedModalOpen: boolean;\n setIsConnectedModalOpen: (value: boolean) => void;\n\n // Chain selection states\n isChainsListOpen: boolean;\n setIsChainsListOpen: (value: boolean) => void;\n isChainsListOpenMobile: boolean;\n setIsChainsListOpenMobile: (value: boolean) => void;\n\n // Connection states\n connectedButtonStatus: ButtonTxStatus;\n setConnectedButtonStatus: (value: ButtonTxStatus) => void;\n isConnected: boolean;\n setIsConnected: (value: boolean) => void;\n\n // Modal content types\n connectedModalContentType: ConnectedContentType;\n setConnectedModalContentType: (value: ConnectedContentType) => void;\n connectModalContentType: ConnectContentType;\n setConnectModalContentType: (value: ConnectContentType) => void;\n\n // Adapter and connector states\n selectedAdapter: OrbitAdapter | undefined;\n setSelectedAdapter: (value: OrbitAdapter | undefined) => void;\n activeConnector: string | undefined;\n setActiveConnector: (value: string | undefined) => void;\n\n // Impersonation\n impersonatedAddress: string;\n setImpersonatedAddress: (value: string) => void;\n}\n\n// Custom error for hook usage outside provider\nexport class NovaConnectProviderError extends Error {\n constructor(message = 'useNovaConnect must be used within NovaConnectProvider') {\n super(message);\n this.name = 'NovaConnectProviderError';\n }\n}\n\n// Create context with undefined default to enforce provider usage\nexport const NovaConnectProviderContext = createContext<NovaConnectProviderType | undefined>(undefined);\n\n/**\n * Hook to access NovaConnect context\n *\n * @throws {NovaConnectProviderError} When used outside of NovaConnectProvider\n * @returns {NovaConnectProviderType} The NovaConnect context value\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { isConnected, handleConnectButtonClick } = useNovaConnect();\n *\n * return (\n * <button onClick={handleConnectButtonClick}>\n * {isConnected ? 'Connected' : 'Connect Wallet'}\n * </button>\n * );\n * }\n * ```\n */\nexport const useNovaConnect = (): NovaConnectProviderType => {\n const context = useContext(NovaConnectProviderContext);\n\n if (!context) {\n throw new NovaConnectProviderError();\n }\n\n return context;\n};\n\n/**\n * Hook to check if NovaConnect context is available\n *\n * @returns {boolean} True if context is available, false otherwise\n *\n * @example\n * ```typescript\n * function ConditionalComponent() {\n * const hasContext = useHasNovaConnectContext();\n *\n * if (!hasContext) {\n * return <div>NovaConnect provider not found</div>;\n * }\n *\n * return <ConnectedComponent />;\n * }\n * ```\n */\nexport const useHasNovaConnectContext = (): boolean => {\n const context = useContext(NovaConnectProviderContext);\n return context !== undefined;\n};\n\n/**\n * Optional hook that returns null if provider is not available\n *\n * @returns {NovaConnectProviderType | null} Context value or null if not available\n *\n * @example\n * ```typescript\n * function OptionalComponent() {\n * const context = useNovaConnectOptional();\n *\n * if (!context) {\n * return <div>No wallet provider available</div>;\n * }\n *\n * return <div>Connected: {context.isConnected}</div>;\n * }\n * ```\n */\nexport const useNovaConnectOptional = (): NovaConnectProviderType | null => {\n const context = useContext(NovaConnectProviderContext);\n return context ?? null;\n};\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\n\nimport { InitialChains } from '../types';\n\n// Default fallback chain IDs\nconst DEFAULT_CHAIN_IDS = {\n [OrbitAdapter.EVM]: 1, // Ethereum Mainnet\n [OrbitAdapter.SOLANA]: 'mainnet',\n [OrbitAdapter.Starknet]: '0x534e5f4d41494e',\n} as const;\n\n/**\n * Basic interface for chain objects to handle the any type safely\n */\ninterface BasicChain {\n id: number | string;\n [key: string]: any;\n}\n\n/**\n * Gets the appropriate chain ID for connecting based on the selected adapter.\n * Returns the first available chain for the adapter, or a sensible default.\n *\n * @param params - Configuration object\n * @param params.selectedAdapter - The blockchain adapter to use\n * @param params.appChains - Available EVM chains\n * @param params.solanaRPCUrls - Available Solana networks\n * @returns Chain ID (number for EVM/Starknet, string for Solana)\n */\nexport function getConnectChainId({\n selectedAdapter,\n appChains,\n solanaRPCUrls,\n}: { selectedAdapter: OrbitAdapter } & InitialChains): number | string {\n switch (selectedAdapter) {\n case OrbitAdapter.EVM: {\n // Return first available EVM chain or default to Ethereum\n const firstChain = appChains?.[0];\n if (firstChain?.id && typeof firstChain.id === 'number') {\n return firstChain.id;\n }\n\n if (process.env.NODE_ENV === 'development' && !appChains?.length) {\n console.warn('getConnectChainId: No EVM chains configured, using Ethereum Mainnet');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.EVM];\n }\n\n case OrbitAdapter.SOLANA: {\n // Return first available Solana network or default to mainnet\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n const networks = Object.keys(solanaRPCUrls);\n if (networks.length > 0) {\n return networks[0];\n }\n }\n\n if (process.env.NODE_ENV === 'development' && !solanaRPCUrls) {\n console.warn('getConnectChainId: No Solana RPC URLs configured, using mainnet');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.SOLANA];\n }\n\n case OrbitAdapter.Starknet: {\n if (process.env.NODE_ENV === 'development') {\n console.info('getConnectChainId: Using default Starknet chain ID');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.Starknet];\n }\n\n default: {\n // Handle unknown adapter types gracefully\n if (process.env.NODE_ENV === 'development') {\n console.error('getConnectChainId: Unknown adapter:', selectedAdapter);\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.EVM];\n }\n }\n}\n\n/**\n * Helper to get all available chain IDs for an adapter\n */\nexport function getAvailableChainIds({\n selectedAdapter,\n appChains,\n solanaRPCUrls,\n}: { selectedAdapter: OrbitAdapter } & InitialChains): Array<number | string> {\n switch (selectedAdapter) {\n case OrbitAdapter.EVM:\n return appChains?.map((chain: BasicChain) => chain.id).filter(Boolean) ?? [DEFAULT_CHAIN_IDS[OrbitAdapter.EVM]];\n\n case OrbitAdapter.SOLANA:\n return solanaRPCUrls ? Object.keys(solanaRPCUrls) : [DEFAULT_CHAIN_IDS[OrbitAdapter.SOLANA]];\n\n case OrbitAdapter.Starknet:\n return [DEFAULT_CHAIN_IDS[OrbitAdapter.Starknet]];\n\n default:\n return [DEFAULT_CHAIN_IDS[OrbitAdapter.EVM]];\n }\n}\n","// TODO: migrate to @tuwaio/nova-core\n\n/**\n * @fileoverview Utility function to determine if the current environment supports touch input.\n * This is safe to use in Next.js applications as it checks for the `window` object existence.\n */\n\n/**\n * Determines if the current browsing device supports touch input,\n * while also excluding large screens (typically desktop-sized touch monitors).\n *\n * It checks for:\n * 1. The presence of 'ontouchstart' or navigator.maxTouchPoints > 0 or '(pointer: coarse)'.\n * 2. ONLY returns true if the screen width is less than or equal to the specified threshold (e.g., 1200px).\n *\n * This function is safe for server-side rendering (SSR) environments like Next.js.\n *\n * @param {number} [maxWidth=1200] The maximum screen width (in pixels) for a device to be considered 'touch' (default is 1200).\n * @returns {boolean} Returns true if the environment is determined to support touch input AND is within the width limit, otherwise false.\n */\nexport function isTouchDevice(maxWidth: number = 1200): boolean {\n // 1. Check if we are running in a browser environment (Client Side).\n if (typeof window === 'undefined') {\n // If not in a browser (SSR), we assume no touch support for safety.\n return false;\n }\n\n // --- Core Touch Support Checks (Client Side Only) ---\n\n // A. Check for 'ontouchstart' event property (classic check).\n const hasTouchStart = 'ontouchstart' in window;\n\n // B. Check for maxTouchPoints (reliable modern check).\n const hasMaxTouchPoints = navigator.maxTouchPoints > 0;\n\n // C. Check for 'pointer: coarse' media query (detects \"rough\" pointer like a finger).\n let hasCoarsePointer = false;\n if (window.matchMedia) {\n hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;\n }\n\n // Determine if the device inherently supports touch input.\n const supportsTouch = hasTouchStart || hasMaxTouchPoints || hasCoarsePointer;\n\n // 2. Check the screen size condition.\n // The device must support touch AND its current width must be less than or equal to the defined maxWidth.\n const isSmallScreen = window.innerWidth <= maxWidth;\n\n // Return true only if both conditions are met.\n return supportsTouch && isSmallScreen;\n}\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\n\nexport const networksLinks: Partial<\n Record<OrbitAdapter, { aboutNetwork: string; choseWallet: string; about: string }>\n> = {\n [OrbitAdapter.EVM]: {\n aboutNetwork: 'https://ethereum.org/developers/docs/intro-to-ethereum/',\n choseWallet: 'https://ethereum.org/wallets/find-wallet/',\n about: 'https://ethereum.org/wallets/',\n },\n [OrbitAdapter.SOLANA]: {\n aboutNetwork: 'https://solana.com/en/learn/what-is-solana',\n choseWallet: 'https://solana.com/en/solana-wallets',\n about: 'https://solana.com/en/learn/what-is-a-wallet',\n },\n};\n","import { ChevronDownIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { forwardRef } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\ninterface ToBottomButtonProps {\n /** Custom CSS classes for the button */\n className?: string;\n /** Custom aria-label for the button */\n 'aria-label'?: string;\n /** Callback fired when button is clicked */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Whether the button is disabled */\n disabled?: boolean;\n}\n\nexport const ToBottomButton = forwardRef<HTMLButtonElement, ToBottomButtonProps>(\n ({ className, 'aria-label': ariaLabel, onClick, disabled = false, ...props }, ref) => {\n const labels = useNovaConnectLabels();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent default scroll behavior if custom handler provided\n if (onClick) {\n event.preventDefault();\n onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n // Handle keyboard activation\n if ((event.key === 'Enter' || event.key === ' ') && onClick) {\n event.preventDefault();\n // eslint-disable-next-line\n onClick(event as any);\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={cn(\n 'novacon:flex novacon:w-full novacon:h-6 novacon:items-center novacon:justify-center',\n 'novacon:bg-[var(--tuwa-bg-secondary)] novacon:text-[var(--tuwa-text-primary)]',\n 'novacon:transition-colors novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-bg-tertiary)] novacon:hover:text-[var(--tuwa-text-secondary)]',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-text-accent)] novacon:focus:ring-inset',\n 'novacon:active:bg-[var(--tuwa-bg-quaternary)]',\n 'novacon:disabled:opacity-50 novacon:disabled:cursor-not-allowed novacon:disabled:hover:bg-[var(--tuwa-bg-secondary)]',\n onClick ? 'novacon:cursor-pointer' : 'novacon:cursor-default',\n className,\n )}\n aria-label={ariaLabel || labels.scrollToBottom}\n title={ariaLabel || labels.scrollToBottom}\n {...props}\n >\n <ChevronDownIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-transform novacon:duration-200',\n disabled && 'novacon:opacity-50',\n )}\n aria-hidden=\"true\"\n />\n </button>\n );\n },\n);\n\nToBottomButton.displayName = 'ToBottomButton';\n","import { ChevronUpIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { forwardRef } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\ninterface ToTopButtonProps {\n /** Custom CSS classes for the button */\n className?: string;\n /** Custom aria-label for the button */\n 'aria-label'?: string;\n /** Callback fired when button is clicked */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Whether the button is disabled */\n disabled?: boolean;\n}\n\nexport const ToTopButton = forwardRef<HTMLButtonElement, ToTopButtonProps>(\n ({ className, 'aria-label': ariaLabel, onClick, disabled = false, ...props }, ref) => {\n const labels = useNovaConnectLabels();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent default scroll behavior if custom handler provided\n if (onClick) {\n event.preventDefault();\n onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n // Handle keyboard activation\n if ((event.key === 'Enter' || event.key === ' ') && onClick) {\n event.preventDefault();\n // eslint-disable-next-line\n onClick(event as any);\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={cn(\n 'novacon:flex novacon:w-full novacon:h-6 novacon:items-center novacon:justify-center',\n 'novacon:bg-[var(--tuwa-bg-secondary)] novacon:text-[var(--tuwa-text-primary)]',\n 'novacon:transition-colors novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-bg-tertiary)] novacon:hover:text-[var(--tuwa-text-secondary)]',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-text-accent)] novacon:focus:ring-inset',\n 'novacon:active:bg-[var(--tuwa-bg-quaternary)]',\n 'novacon:disabled:opacity-50 novacon:disabled:cursor-not-allowed novacon:disabled:hover:bg-[var(--tuwa-bg-secondary)]',\n onClick ? 'novacon:cursor-pointer' : 'novacon:cursor-default',\n className,\n )}\n aria-label={ariaLabel || labels.scrollToTop}\n title={ariaLabel || labels.scrollToTop}\n {...props}\n >\n <ChevronUpIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-transform novacon:duration-200',\n disabled && 'novacon:opacity-50',\n )}\n aria-hidden=\"true\"\n />\n </button>\n );\n },\n);\n\nToTopButton.displayName = 'ToTopButton';\n","import * as Select from '@radix-ui/react-select';\nimport { cn } from '@tuwaio/nova-core';\nimport { AnimatePresence, type Easing, motion } from 'framer-motion';\nimport { type ComponentPropsWithoutRef, type ElementRef, forwardRef, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\nimport { ToBottomButton } from './ToBottomButton';\nimport { ToTopButton } from './ToTopButton';\n\ninterface SelectContentAnimatedProps extends ComponentPropsWithoutRef<typeof Select.Content> {\n /** Custom CSS classes to apply to the content container */\n className?: string;\n /** ARIA label for the select content */\n 'aria-label'?: string;\n /** Whether the select content should have reduced motion for accessibility */\n reduceMotion?: boolean;\n}\n\nexport const SelectContentAnimated = forwardRef<ElementRef<typeof Select.Content>, SelectContentAnimatedProps>(\n (\n { className, children, position = 'popper', 'aria-label': ariaLabel, reduceMotion = false, ...props },\n forwardedRef,\n ) => {\n const labels = useNovaConnectLabels();\n\n // Memoize animation configuration based on reduce motion preference\n const animationConfig = useMemo(() => {\n if (reduceMotion) {\n return {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.15 },\n };\n }\n\n return {\n initial: { opacity: 0, scaleY: 0.8, y: -5 },\n animate: { opacity: 1, scaleY: 1, y: 0 },\n exit: { opacity: 0, scaleY: 0.8, y: -5 },\n transition: {\n duration: 0.2,\n ease: 'easeOut',\n },\n };\n }, [reduceMotion]);\n\n // Memoize layout transition configuration\n const layoutTransition = useMemo(() => {\n if (reduceMotion) {\n return {};\n }\n return {\n duration: 0.15,\n ease: 'easeOut' as Easing,\n };\n }, [reduceMotion]);\n\n // Memoize content container classes\n const contentClasses = useMemo(\n () =>\n cn(\n 'novacon:p-1 novacon:bg-[var(--tuwa-bg-secondary)] novacon:rounded-lg novacon:shadow-xl',\n 'novacon:ring-1 novacon:ring-[var(--tuwa-border-primary)] novacon:overflow-hidden',\n className,\n ),\n [className],\n );\n\n // Memoize select content classes\n const selectContentClasses = useMemo(\n () =>\n cn(\n 'novacon:max-h-[300px] novacon:w-[--radix-select-trigger-width] novacon:overflow-hidden',\n 'novacon:data-[state=open]:animate-in novacon:data-[state=closed]:animate-out',\n 'novacon:data-[state=closed]:fade-out-0 novacon:data-[state=open]:novacon:fade-in-0',\n 'novacon:data-[state=closed]:zoom-out-95 novacon:data-[state=open]:novacon:zoom-in-95',\n 'novacon:data-[side=bottom]:slide-in-from-top-2 novacon:data-[side=left]:slide-in-from-right-2',\n 'novacon:data-[side=right]:slide-in-from-left-2 novacon:data-[side=top]:slide-in-from-bottom-2',\n ),\n [],\n );\n\n return (\n <Select.Portal>\n <Select.Content\n className={selectContentClasses}\n ref={forwardedRef}\n position={position}\n role=\"listbox\"\n aria-label={ariaLabel || labels.chainListContainer}\n {...props}\n >\n {/* Scroll to top button */}\n <Select.ScrollUpButton asChild>\n <ToTopButton />\n </Select.ScrollUpButton>\n\n {/* Main content viewport */}\n <Select.Viewport role=\"presentation\">\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n {...animationConfig}\n className={contentClasses}\n layout={!reduceMotion}\n transition={{\n layout: layoutTransition,\n }}\n role=\"group\"\n aria-live=\"polite\"\n >\n {children}\n </motion.div>\n </AnimatePresence>\n </Select.Viewport>\n\n {/* Scroll to bottom button */}\n <Select.ScrollDownButton asChild>\n <ToBottomButton />\n </Select.ScrollDownButton>\n </Select.Content>\n </Select.Portal>\n );\n },\n);\n\nSelectContentAnimated.displayName = 'SelectContentAnimated';\n","/**\n * @file This file contains the `WalletAvatar` component for displaying a user's avatar.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport makeBlockie from 'ethereum-blockies-base64';\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\nexport type WalletAvatarProps = {\n /** The user's wallet address, used for the blockie fallback and background color. */\n address: string;\n /** An optional URL for the user's ENS avatar image. */\n ensAvatar?: string | null;\n /** Optional additional CSS classes for the container. */\n className?: string;\n /** Custom alt text for the avatar image */\n altText?: string;\n /** Size variant for the avatar */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Whether to show loading animation */\n showLoading?: boolean;\n /** Callback fired when image loads successfully */\n onImageLoad?: () => void;\n /** Callback fired when image fails to load */\n onImageError?: (error: Event) => void;\n /** Whether to disable the pulse animation */\n disableAnimation?: boolean;\n};\n\nfunction isHex(value: unknown, { strict = true }: { strict?: boolean | undefined } = {}): value is `0x${string}` {\n if (!value) return false;\n if (typeof value !== 'string') return false;\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x');\n}\n\nconst zeroAddress = '0x0000000000000000000000000000000000000000';\n\n// Size mapping for different avatar sizes\nconst sizeClasses = {\n sm: 'novacon:h-4 novacon:w-4',\n md: 'novacon:h-6 novacon:w-6',\n lg: 'novacon:h-8 novacon:w-8',\n xl: 'novacon:h-12 novacon:w-12',\n} as const;\n\n/**\n * A component that displays a user's avatar.\n *\n * It prioritizes showing the provided `ensAvatar`. If unavailable or if the image fails to load,\n * it falls back to a procedurally generated \"blockie\" based on the user's address.\n * It also generates a unique background color from the address as a placeholder.\n */\nexport const WalletAvatar = forwardRef<HTMLDivElement, WalletAvatarProps>(\n (\n {\n address,\n ensAvatar,\n className,\n altText,\n size = 'md',\n showLoading = true,\n onImageLoad,\n onImageError,\n disableAnimation = false,\n ...props\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n\n // State management - fix useState initialization\n const [imageSrc, setImageSrc] = useState<string | null>(ensAvatar ?? null);\n const [isLoading, setIsLoading] = useState(Boolean(ensAvatar));\n const [hasError, setHasError] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n\n // Memoize the generated blockie to avoid re-creating it on every render\n const blockie = useMemo(() => {\n try {\n return makeBlockie(isHex(address) ? address : zeroAddress);\n } catch (error) {\n console.warn('Failed to generate blockie for address:', address, error);\n return null;\n }\n }, [address]);\n\n // Memoize the background color with validation\n const bgColor = useMemo(() => {\n try {\n if (!isHex(address)) return '#6B7280'; // Fallback gray color\n const colorHex = address.slice(2, 8);\n return colorHex.length === 6 ? `#${colorHex}` : '#6B7280';\n } catch {\n return '#6B7280';\n }\n }, [address]);\n\n // Format address for screen readers\n const formattedAddress = useMemo(() => {\n if (!address) return labels.unknownWallet;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n }, [address, labels.unknownWallet]);\n\n // Generate alt text\n const imageAltText = useMemo(() => {\n if (altText) return altText;\n if (hasError || !ensAvatar) {\n return `${labels.walletAvatar} ${formattedAddress}`;\n }\n return `${labels.ensAvatar} ${formattedAddress}`;\n }, [altText, hasError, ensAvatar, formattedAddress, labels.walletAvatar, labels.ensAvatar]);\n\n // Reset image source when ensAvatar changes - fix state update issues\n const currentEnsAvatar = useMemo(() => ensAvatar ?? null, [ensAvatar]);\n\n useMemo(() => {\n setImageSrc(currentEnsAvatar);\n setIsLoading(Boolean(currentEnsAvatar));\n setHasError(false);\n }, [currentEnsAvatar]);\n\n // Handle image load success\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n setHasError(false);\n onImageLoad?.();\n }, [onImageLoad]);\n\n // Handle image load error\n const handleImageError = useCallback(\n (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false);\n setHasError(true);\n setImageSrc(blockie);\n onImageError?.(event.nativeEvent);\n },\n [blockie, onImageError],\n );\n\n // Memoize container classes\n const containerClasses = useMemo(\n () =>\n cn(\n sizeClasses[size],\n 'novacon:flex-shrink-0 novacon:rounded-full novacon:relative novacon:overflow-hidden',\n 'novacon:ring-1 novacon:ring-[var(--tuwa-border-primary)]',\n 'novacon:focus-within:ring-2 novacon:focus-within:ring-[var(--tuwa-text-accent)]',\n className,\n ),\n [size, className],\n );\n\n // Memoize loading overlay classes\n const loadingClasses = useMemo(\n () =>\n cn(\n 'novacon:absolute novacon:inset-0 novacon:rounded-full novacon:bg-[var(--tuwa-bg-muted)]',\n !disableAnimation && showLoading && isLoading && 'novacon:animate-pulse',\n (!isLoading || !showLoading) && 'novacon:opacity-0',\n 'novacon:transition-opacity novacon:duration-300',\n ),\n [disableAnimation, showLoading, isLoading],\n );\n\n // Get current image source with fallback\n const currentImageSrc = imageSrc || blockie || '';\n\n return (\n <div\n ref={ref}\n className={containerClasses}\n style={{ backgroundColor: bgColor }}\n role=\"img\"\n aria-label={imageAltText}\n title={imageAltText}\n {...props}\n >\n {/* Loading overlay */}\n <div className={loadingClasses} aria-hidden=\"true\" />\n\n {/* Avatar image */}\n {currentImageSrc && (\n <img\n ref={imgRef}\n key={`${ensAvatar || 'blockie'}-${address}`} // Force re-mount when source changes\n className={cn(\n 'novacon:h-full novacon:w-full novacon:rounded-full novacon:object-cover novacon:relative novacon:z-10',\n 'novacon:transition-opacity novacon:duration-300',\n isLoading ? 'novacon:opacity-0' : 'novacon:opacity-100',\n )}\n src={currentImageSrc}\n alt=\"\" // Empty alt since parent div has role=\"img\" and aria-label\n onLoad={handleImageLoad}\n onError={handleImageError}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n )}\n\n {/* Fallback content for extreme error cases */}\n {!currentImageSrc && (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:flex novacon:items-center novacon:justify-center novacon:text-white novacon:text-xs novacon:font-mono\"\n aria-hidden=\"true\"\n >\n {formattedAddress.slice(0, 2)}\n </div>\n )}\n </div>\n );\n },\n);\n\nWalletAvatar.displayName = 'WalletAvatar';\n","import { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { cn } from '@tuwaio/nova-core';\nimport { formatWalletName } from '@tuwaio/orbit-core';\nimport { forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\ninterface WalletIconProps {\n /** Custom icon URL for the wallet */\n icon?: string;\n /** Name of the wallet */\n name: string;\n /** Size of the icon in pixels */\n size?: number;\n /** Additional CSS classes */\n className?: string;\n /** Custom alt text for the icon */\n altText?: string;\n /** Whether to show loading state */\n showLoading?: boolean;\n /** Callback fired when image loads successfully */\n onImageLoad?: () => void;\n /** Callback fired when image fails to load */\n onImageError?: () => void;\n /** Enable lazy loading for non-critical images */\n lazy?: boolean;\n}\n\nexport const WalletIcon = forwardRef<HTMLDivElement, WalletIconProps>(\n (\n {\n icon,\n name,\n size = 32,\n className,\n altText,\n showLoading = false,\n onImageLoad,\n onImageError,\n lazy = false,\n ...props\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n const [hasError, setHasError] = useState(false);\n const [isLoading, setIsLoading] = useState(Boolean(icon));\n\n // Format wallet name for consistency\n const walletName = useMemo(() => formatWalletName(name), [name]);\n\n // Generate alt text for accessibility\n const imageAltText = useMemo(() => {\n if (altText) return altText;\n return `${walletName} ${labels.walletIcon}`;\n }, [altText, walletName, labels.walletIcon]);\n\n // Clean and validate icon URL\n const cleanIconUrl = useMemo(() => {\n if (!icon) return null;\n\n try {\n const trimmedIcon = icon.trim();\n if (!trimmedIcon) return null;\n\n // Basic URL validation\n if (\n trimmedIcon.startsWith('http://') ||\n trimmedIcon.startsWith('https://') ||\n trimmedIcon.startsWith('/') ||\n trimmedIcon.startsWith('data:')\n ) {\n return trimmedIcon;\n }\n\n return null;\n } catch {\n return null;\n }\n }, [icon]);\n\n // Handle image load success\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n setHasError(false);\n onImageLoad?.();\n }, [onImageLoad]);\n\n // Handle image load error\n const handleImageError = useCallback(() => {\n setIsLoading(false);\n setHasError(true);\n onImageError?.();\n }, [onImageError]);\n\n // Container classes\n const containerClasses = useMemo(\n () =>\n cn(\n 'novacon:relative novacon:inline-flex novacon:items-center novacon:justify-center novacon:flex-shrink-0',\n 'novacon:overflow-hidden',\n showLoading && isLoading && 'novacon:animate-pulse novacon:bg-[var(--tuwa-bg-muted)]',\n className,\n ),\n [showLoading, isLoading, className],\n );\n\n // Image classes for consistency\n const imageClasses = useMemo(\n () =>\n cn(\n 'novacon:object-cover novacon:transition-opacity novacon:duration-200',\n 'novacon:max-w-full novacon:max-h-full',\n isLoading && showLoading ? 'novacon:opacity-0' : 'novacon:opacity-100',\n ),\n [isLoading, showLoading],\n );\n\n // Image style object\n const imageStyle = useMemo(\n () => ({\n width: size,\n height: size,\n }),\n [size],\n );\n\n return (\n <div\n ref={ref}\n className={containerClasses}\n role=\"img\"\n aria-label={imageAltText}\n title={imageAltText}\n style={{ lineHeight: 0 }}\n {...props}\n >\n {/* Loading overlay */}\n {showLoading && isLoading && (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:bg-[var(--tuwa-bg-muted)] novacon:animate-pulse novacon:rounded-full\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Custom icon with error fallback */}\n {cleanIconUrl && !hasError ? (\n <img\n src={cleanIconUrl}\n alt=\"\" // Empty alt since parent div has role=\"img\" and aria-label\n className={imageClasses}\n style={imageStyle}\n onLoad={handleImageLoad}\n onError={handleImageError}\n loading={lazy ? 'lazy' : 'eager'}\n decoding=\"async\"\n // Additional attributes for better performance\n crossOrigin=\"anonymous\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n /* Fallback to Web3Icon */\n <Web3Icon walletKey={walletName} className={cn(imageClasses, 'novacon:flex-shrink-0')} style={imageStyle} />\n )}\n\n {/* Error state indicator (optional) */}\n {hasError && process.env.NODE_ENV === 'development' && (\n <div\n className=\"novacon:absolute novacon:top-0 novacon:right-0 novacon:w-2 novacon:h-2 novacon:bg-red-500 novacon:rounded-full\"\n title={`Failed to load icon for ${walletName}`}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n },\n);\n\nWalletIcon.displayName = 'WalletIcon';\n","import { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { ChevronArrowWithAnim, cn } from '@tuwaio/nova-core';\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { forwardRef, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\nimport { WalletIcon } from '../WalletIcon';\n\n/**\n * Props for the IconButton component\n */\ninterface IconButtonProps {\n /** Custom icon URL for the wallet */\n walletIcon?: string;\n /** Name of the wallet */\n walletName?: string;\n /** Chain ID for the network icon */\n walletChainId?: string | number;\n /** Number of available items/options (shows chevron if > 1) */\n items?: number;\n /** Click handler for the button */\n onClick?: () => void;\n /** Additional CSS classes for styling */\n className?: string;\n /** Whether the button is currently disabled */\n disabled?: boolean;\n /** Whether to show loading state */\n loading?: boolean;\n /** Custom aria-label for accessibility */\n 'aria-label'?: string;\n /** Custom tooltip text */\n title?: string;\n}\n\n/**\n * Multi-purpose icon button component for wallets and chains\n *\n * This component provides a unified interface for displaying wallet and chain information:\n * - Displays wallet icon with fallback to Web3Icon\n * - Shows chain/network icon when chain ID is provided\n * - Conditional chevron arrow for dropdown indicators\n * - Full WCAG accessibility support with proper ARIA labels\n * - Loading and disabled states\n * - Hover and active animations\n * - Responsive design with consistent sizing\n *\n * The button automatically becomes interactive when onClick is provided and items > 1.\n * It supports both EVM chain IDs (numbers) and Solana network identifiers (strings).\n *\n * @param props - Component props for icon button configuration\n * @returns Forwardable button element with icons and accessibility support\n *\n * @example\n * ```tsx\n * // Simple wallet button\n * <IconButton\n * walletName=\"MetaMask\"\n * walletIcon=\"https://example.com/metamask-icon.png\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Interactive chain selector\n * <IconButton\n * walletName=\"Phantom\"\n * walletChainId=\"mainnet-beta\"\n * items={3}\n * onClick={handleChainSelect}\n * aria-label=\"Select blockchain network\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Loading state with disabled interaction\n * <IconButton\n * walletName=\"WalletConnect\"\n * loading={true}\n * disabled={true}\n * title=\"Connecting to wallet...\"\n * />\n * ```\n *\n * @public\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n walletIcon,\n walletName,\n walletChainId,\n items = 0,\n onClick,\n className,\n disabled = false,\n loading = false,\n 'aria-label': ariaLabel,\n title,\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n\n /**\n * Determine if the button should be interactive\n * Button is clickable when onClick is provided, not disabled, not loading, and has multiple items\n */\n const isClickable = useMemo(\n () => Boolean(onClick && !disabled && !loading && items > 1),\n [onClick, disabled, loading, items],\n );\n\n /**\n * Generate chain ID for Web3Icon\n * Handles both EVM (numeric) and Solana (string) chain identifiers\n */\n const formattedChainId = useMemo(() => {\n if (!walletChainId) return undefined;\n\n // If it's a string, assume it's a Solana network identifier\n if (typeof walletChainId === 'string') {\n return `${OrbitAdapter.SOLANA}:${walletChainId}`;\n }\n\n // If it's a number, use it directly as EVM chain ID\n return walletChainId;\n }, [walletChainId]);\n\n /**\n * Generate accessible label for the button\n */\n const accessibleLabel = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n\n const parts: string[] = [];\n\n if (walletName) parts.push(`${walletName} wallet`);\n if (walletChainId) parts.push('network selector');\n if (isClickable) parts.push('button');\n if (loading) parts.push('loading');\n if (disabled) parts.push('disabled');\n\n return parts.join(', ') || 'Wallet controls';\n }, [ariaLabel, walletName, walletChainId, isClickable, loading, disabled]);\n\n /**\n * Generate tooltip text\n */\n const tooltipText = useMemo(() => {\n if (title) return title;\n if (loading) return 'Loading...';\n if (disabled) return 'Button is disabled';\n if (isClickable) return `Click to select ${walletName ? walletName + ' ' : ''}options`;\n return walletName ? `${walletName} wallet` : 'Wallet information';\n }, [title, loading, disabled, isClickable, walletName]);\n\n /**\n * Memoized button classes for performance\n */\n const buttonClasses = useMemo(\n () =>\n cn(\n // Base styles\n 'novacon:flex novacon:items-center novacon:justify-center novacon:gap-1 novacon:rounded-full',\n 'novacon:bg-[var(--tuwa-bg-primary)] novacon:border novacon:border-[var(--tuwa-border-primary)]',\n 'novacon:p-1.5 novacon:transition-all novacon:duration-200',\n\n // Icon sizing\n 'novacon:[&_img]:w-6! novacon:[&_img]:h-6! novacon:[&_img]:transition-transform novacon:[&_img]:duration-200',\n\n // Interactive states\n {\n 'novacon:cursor-pointer novacon:hover:[&_img]:scale-95 novacon:active:[&_img]:scale-85 novacon:hover:shadow-sm':\n isClickable,\n 'novacon:cursor-not-allowed novacon:opacity-50': disabled && !loading,\n 'novacon:cursor-wait novacon:opacity-75': loading,\n 'novacon:cursor-default': !isClickable && !disabled && !loading,\n },\n\n // Focus states for accessibility\n 'novacon:focus-visible:outline-none novacon:focus-visible:ring-2 novacon:focus-visible:ring-[var(--tuwa-border-accent)] novacon:focus-visible:ring-offset-2',\n\n className,\n ),\n [isClickable, disabled, loading, className],\n );\n\n /**\n * Handle button click with safety checks\n */\n const handleClick = () => {\n if (isClickable && onClick) {\n onClick();\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={buttonClasses}\n onClick={handleClick}\n disabled={disabled || loading}\n aria-label={accessibleLabel}\n title={tooltipText}\n role=\"button\"\n tabIndex={disabled || loading ? -1 : 0}\n >\n {/* Wallet icon */}\n {walletName && (\n <WalletIcon\n name={walletName}\n icon={walletIcon}\n altText={`${walletName} ${labels.walletIcon}`}\n showLoading={loading}\n className=\"novacon:flex-shrink-0\"\n />\n )}\n\n {/* Chain/Network icon */}\n {formattedChainId && (\n <Web3Icon chainId={formattedChainId} className=\"novacon:flex-shrink-0\" title={`Network: ${walletChainId}`} />\n )}\n\n {/* Chevron arrow for dropdown indication */}\n {isClickable && <ChevronArrowWithAnim className=\"novacon:flex-shrink-0\" aria-hidden=\"true\" />}\n\n {/* Loading indicator overlay */}\n {loading && (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:bg-[var(--tuwa-bg-primary)]/50 novacon:rounded-full novacon:flex novacon:items-center novacon:justify-center\"\n aria-hidden=\"true\"\n >\n <div className=\"novacon:w-3 novacon:h-3 novacon:border-2 novacon:border-[var(--tuwa-text-accent)] novacon:border-t-transparent novacon:rounded-full novacon:animate-spin\" />\n </div>\n )}\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { ExclamationTriangleIcon, PuzzlePieceIcon } from '@heroicons/react/24/solid';\nimport { motion } from 'framer-motion';\nimport { Component, lazy, Suspense, useMemo } from 'react';\n\nimport { useNovaConnect } from '../../hooks/useNovaConnect';\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\nimport { ConnectButtonProps } from '../ConnectButton';\n\n/**\n * Props for the ConnectedModalTxHistory component\n */\ninterface ConnectedModalTxHistoryProps extends Pick<ConnectButtonProps, 'transactionPool' | 'pulsarAdapter'> {\n /** Additional CSS classes for the container */\n className?: string;\n}\n\n/**\n * Lazy import of TransactionsHistory component with error handling\n * This allows the component to work even if the @tuwaio/nova-transactions package is not available\n */\nconst TransactionsHistory = lazy(() => {\n try {\n return import('@tuwaio/nova-transactions').then((module) => ({\n default: module.TransactionsHistory,\n }));\n } catch (error) {\n console.warn('Failed to load @tuwaio/nova-transactions package:', error);\n // Return a promise that never resolves to trigger error boundary\n return new Promise(() => {});\n }\n});\n\n/**\n * Loading component for transaction history\n */\nfunction TransactionHistoryLoading() {\n const labels = useNovaConnectLabels();\n\n return (\n <div\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:p-8 novacon:gap-4\"\n role=\"status\"\n >\n <div className=\"novacon:animate-spin novacon:rounded-full novacon:h-8 novacon:w-8 novacon:border-2 novacon:border-[var(--tuwa-text-accent)] novacon:border-t-transparent\" />\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">\n {labels.loading} {labels.transactionsInApp.toLowerCase()}...\n </p>\n </div>\n );\n}\n\n/**\n * Error fallback component when TransactionsHistory fails to load\n */\nfunction TransactionHistoryError() {\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:text-center novacon:gap-4 novacon:p-6\"\n role=\"alert\"\n >\n <div className=\"novacon:w-12 novacon:h-12 novacon:p-2 novacon:rounded-full novacon:bg-[var(--tuwa-warning-bg)] novacon:text-[var(--tuwa-warning-text)]\">\n <ExclamationTriangleIcon className=\"novacon:w-full novacon:h-full\" />\n </div>\n\n <div className=\"novacon:space-y-2\">\n <h2 className=\"novacon:text-lg novacon:font-semibold novacon:text-[var(--tuwa-text-primary)]\">\n Transaction History Not Available\n </h2>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)] novacon:max-w-md\">\n Transaction history is not supported by this application at the moment. The required package is not installed\n or configured.\n </p>\n </div>\n </motion.div>\n );\n}\n\n/**\n * Pulsar adapter required fallback component\n */\nfunction PulsarAdapterRequired() {\n const labels = useNovaConnectLabels();\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:text-center novacon:gap-4 novacon:p-6\"\n role=\"alert\"\n >\n <div className=\"novacon:w-12 novacon:h-12 novacon:p-2 novacon:rounded-full novacon:bg-gradient-to-r novacon:from-[var(--tuwa-button-gradient-from)] novacon:to-[var(--tuwa-button-gradient-to)] novacon:text-[var(--tuwa-text-on-accent)]\">\n <PuzzlePieceIcon className=\"novacon:w-full novacon:h-full\" />\n </div>\n\n <div className=\"novacon:space-y-2\">\n <h2 className=\"novacon:text-lg novacon:font-semibold novacon:text-[var(--tuwa-text-primary)]\">\n {labels.pulsarAdapterRequired}\n </h2>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)] novacon:max-w-md novacon:leading-relaxed\">\n {labels.pulsarAdapterDescription}\n </p>\n </div>\n </motion.div>\n );\n}\n\n/**\n * Component for displaying transaction history with conditional loading\n *\n * This component provides comprehensive transaction history functionality:\n * - Conditional loading of the @tuwaio/nova-transactions package\n * - Graceful fallback when the package is not available\n * - Loading states with proper accessibility support\n * - Error handling for missing configuration\n * - Full WCAG compliance with ARIA labels\n *\n * The component automatically detects if the required dependencies are available\n * and provides appropriate fallbacks for different scenarios.\n *\n * @param props - Component props including transaction pool and adapter configuration\n * @returns JSX element displaying transaction history or appropriate fallback\n *\n * @example\n * ```tsx\n * <ConnectedModalTxHistory\n * transactionPool={txPool}\n * pulsarAdapter={adapter}\n * className=\"custom-styling\"\n * />\n * ```\n *\n * @public\n */\nexport function ConnectedModalTxHistory({ transactionPool, pulsarAdapter, className }: ConnectedModalTxHistoryProps) {\n const labels = useNovaConnectLabels();\n const { activeWallet } = useNovaConnect();\n\n /**\n * Memoized container classes for better performance\n */\n const containerClasses = useMemo(\n () =>\n `novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:p-4 ${className || ''}`.trim(),\n [className],\n );\n\n /**\n * Memoized check for adapter availability\n */\n const hasValidAdapter = useMemo(() => Boolean(transactionPool && pulsarAdapter), [transactionPool, pulsarAdapter]);\n\n // Early return if no active wallet\n if (!activeWallet) {\n return (\n <div className={containerClasses}>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">No wallet connected</p>\n </div>\n );\n }\n\n return (\n <div className={containerClasses}>\n {hasValidAdapter ? (\n <Suspense fallback={<TransactionHistoryLoading />}>\n <ErrorBoundary fallback={<TransactionHistoryError />}>\n <TransactionsHistory\n transactionsPool={transactionPool!}\n adapter={pulsarAdapter!}\n connectedWalletAddress={activeWallet.address}\n className=\"novacon:w-full\"\n aria-label={`${labels.transactionsInApp} for ${activeWallet.address}`}\n />\n </ErrorBoundary>\n </Suspense>\n ) : (\n <PulsarAdapterRequired />\n )}\n </div>\n );\n}\n\n/**\n * Simple Error Boundary component for handling TransactionsHistory loading errors\n */\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n fallback: React.ReactNode;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.warn('TransactionsHistory component failed to load:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback;\n }\n\n return this.props.children;\n }\n}\n","import { cn } from '@tuwaio/nova-core';\nimport { motion } from 'framer-motion';\nimport React, { memo, useMemo } from 'react';\n\nimport { isTouchDevice } from '../../utils';\n\ninterface RecentBadgeProps {\n className?: string;\n children?: React.ReactNode;\n animated?: boolean;\n}\n\n/**\n * Badge component with animated gradient border effect\n */\nexport const RecentBadge = memo<RecentBadgeProps>(({ className, children = 'Recent', animated = true }) => {\n const isTouch = useMemo(() => isTouchDevice(), []);\n\n // Memoize gradient to prevent recreating\n const gradientBackground = useMemo(\n () => `linear-gradient(90deg, \n rgba(255, 255, 255, 0) 0%, \n var(--tuwa-text-secondary) 20%, \n rgba(255, 255, 255, 0) 40%\n )`,\n [],\n );\n\n const sizeClasses = isTouch\n ? 'novacon:px-1.5 novacon:py-0 novacon:text-[10px]'\n : 'novacon:px-2.5 novacon:py-0.5 novacon:text-xs';\n\n return (\n <span\n className={cn(\n 'novacon:inline-flex novacon:items-center novacon:rounded-full novacon:font-medium novacon:relative novacon:overflow-hidden',\n 'novacon:text-[var(--tuwa-text-secondary)] novacon:border novacon:border-[var(--tuwa-border-primary)]',\n sizeClasses,\n className,\n )}\n role=\"status\"\n aria-label={typeof children === 'string' ? children : 'Recent'}\n >\n {/* Animated gradient border */}\n <motion.span\n className=\"novacon:absolute novacon:inset-0 novacon:z-0 novacon:pointer-events-none novacon:rounded-full\"\n style={{ background: gradientBackground, backgroundSize: '200% 100%' }}\n initial={{ backgroundPositionX: '100%' }}\n animate={animated ? { backgroundPositionX: '-100%' } : {}}\n transition={{\n duration: 4,\n ease: 'linear',\n repeat: animated ? Infinity : 0,\n }}\n />\n\n {/* Background overlay */}\n <span className=\"novacon:absolute novacon:z-10 novacon:pointer-events-none novacon:rounded-full novacon:bg-[var(--tuwa-bg-primary)] novacon:inset-[1px]\" />\n\n {/* Content */}\n <span className=\"novacon:relative novacon:z-20 novacon:whitespace-nowrap\">{children}</span>\n </span>\n );\n});\n\nRecentBadge.displayName = 'RecentBadge';\n","import { DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, useCopyToClipboard } from '@tuwaio/nova-core';\nimport * as React from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\ninterface ToastErrorProps {\n /** Error title to display */\n title: string;\n /** Raw error message to display and copy */\n rawError: string;\n /** Custom CSS classes for the container */\n className?: string;\n /** Custom ARIA label for the error container */\n 'aria-label'?: string;\n /** Callback fired when copy operation completes */\n onCopyComplete?: (success: boolean) => void;\n}\n\n// Counter for unique IDs (outside component to avoid re-initialization)\nlet idCounter = 0;\n\nexport function ToastError({ title, rawError, className, 'aria-label': ariaLabel, onCopyComplete }: ToastErrorProps) {\n const labels = useNovaConnectLabels();\n const { isCopied, copy } = useCopyToClipboard();\n\n // Generate unique IDs only once per component instance\n const [uniqueId] = React.useState(() => {\n idCounter += 1;\n return `${idCounter}-${Date.now()}`;\n });\n\n const titleId = `error-title-${uniqueId}`;\n const descriptionId = `error-description-${uniqueId}`;\n\n // Memoize error text for copying\n const errorToCopy = React.useMemo(() => rawError, [rawError]);\n\n // Handle copy with error handling and callback\n const handleCopy = React.useCallback(\n async (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n try {\n await copy(errorToCopy);\n onCopyComplete?.(true);\n } catch (error) {\n console.error('Failed to copy error:', error);\n onCopyComplete?.(false);\n }\n },\n [copy, errorToCopy, onCopyComplete],\n );\n\n // Handle keyboard interaction for copy button\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n // eslint-disable-next-line\n handleCopy(e as any);\n }\n },\n [handleCopy],\n );\n\n // Memoize container classes\n const containerClasses = React.useMemo(\n () =>\n cn(\n 'novacon:bg-[var(--tuwa-bg-primary)] novacon:p-4 novacon:rounded-md novacon:w-full',\n 'novacon:border novacon:border-[var(--tuwa-border-primary)]',\n className,\n ),\n [className],\n );\n\n // Memoize button classes\n const buttonClasses = React.useMemo(\n () =>\n cn(\n 'novacon:cursor-pointer novacon:mt-2 novacon:text-xs novacon:font-medium novacon:inline-flex novacon:items-center novacon:space-x-1.5',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-error-text)] novacon:focus:ring-opacity-50',\n 'novacon:rounded-md novacon:px-2 novacon:py-1 novacon:transition-all novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-error-text)] novacon:hover:bg-opacity-10',\n 'novacon:active:bg-[var(--tuwa-error-text)] novacon:active:bg-opacity-20',\n 'novacon:text-[var(--tuwa-error-text)] novacon:hover:text-[var(--tuwa-error-text)]',\n isCopied &&\n 'novacon:bg-[var(--tuwa-success-text)] novacon:bg-opacity-10 novacon:text-[var(--tuwa-success-text)]',\n ),\n [isCopied],\n );\n\n return (\n <div\n className={containerClasses}\n role=\"alert\"\n aria-live=\"assertive\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n aria-label={ariaLabel}\n >\n {/* Error Title */}\n <p\n id={titleId}\n className=\"novacon:text-sm novacon:font-semibold novacon:truncate novacon:text-[var(--tuwa-error-text)]\"\n role=\"heading\"\n aria-level={3}\n title={title} // Show full title on hover if truncated\n >\n {title}\n </p>\n\n {/* Error Description */}\n <p\n id={descriptionId}\n className=\"novacon:mt-1 novacon:text-xs novacon:break-words novacon:text-[var(--tuwa-error-text)] novacon:opacity-80\"\n role=\"text\"\n >\n {rawError}\n </p>\n\n {/* Copy Button */}\n <button\n onClick={handleCopy}\n onKeyDown={handleKeyDown}\n className={buttonClasses}\n type=\"button\"\n aria-label={isCopied ? `${labels.copied} ${labels.copyRawError}` : labels.copyRawError}\n aria-describedby={`${titleId} ${descriptionId}`}\n disabled={!errorToCopy.trim()}\n >\n <DocumentDuplicateIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-colors',\n isCopied && 'novacon:text-[var(--tuwa-success-text)]',\n )}\n aria-hidden=\"true\"\n />\n <span className=\"novacon:select-none novacon:transition-colors\" aria-live=\"polite\" role=\"status\">\n {isCopied ? labels.copied : labels.copyRawError}\n </span>\n </button>\n </div>\n );\n}\n","import { ToastCloseButton } from '@tuwaio/nova-core';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { Bounce, toast, ToastContainer, type ToastPosition } from 'react-toastify';\n\nimport { ToastError } from '../components';\nimport { NovaConnectProviderProps, useNovaConnect } from '../hooks/useNovaConnect';\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\ninterface ErrorsProviderProps extends Pick<NovaConnectProviderProps, 'store'> {\n /** Custom container ID for toast notifications */\n containerId?: string;\n /** Custom position for toast notifications */\n position?: ToastPosition;\n /** Auto close delay in milliseconds */\n autoClose?: number | false;\n /** Whether to enable drag to dismiss */\n draggable?: boolean;\n}\n\nexport function ErrorsProvider({\n store,\n containerId = 'nova-connect-errors',\n position = 'top-center',\n autoClose = 7000,\n draggable = false,\n}: ErrorsProviderProps) {\n const labels = useNovaConnectLabels();\n const { activeWallet, walletConnectionError } = useNovaConnect();\n\n const switchNetworkError = store.getState().switchNetworkError;\n\n // Track displayed errors to prevent duplicates\n const displayedErrorsRef = useRef<Set<string>>(new Set());\n const currentToastIdRef = useRef<string | null>(null);\n\n // Memoize error state\n const errorState = useMemo(() => {\n const hasWalletError = Boolean(walletConnectionError);\n const hasSwitchError = Boolean(switchNetworkError);\n const isConnected = Boolean(activeWallet?.isConnected);\n\n return {\n hasWalletError,\n hasSwitchError,\n isConnected,\n hasAnyError: hasWalletError || hasSwitchError,\n primaryError: walletConnectionError || switchNetworkError,\n errorType: hasWalletError ? 'wallet' : hasSwitchError ? 'switch' : null,\n };\n }, [walletConnectionError, switchNetworkError, activeWallet?.isConnected]);\n\n // Memoize error title based on type\n const errorTitle = useMemo(() => {\n switch (errorState.errorType) {\n case 'wallet':\n return labels.walletConnectionError;\n case 'switch':\n return labels.errorWhenChainSwitching;\n default:\n return labels.somethingWentWrong;\n }\n }, [errorState.errorType, labels]);\n\n // Generate error hash for deduplication\n const errorHash = useMemo(() => {\n if (!errorState.primaryError) return null;\n return `${errorState.errorType}-${errorState.primaryError.substring(0, 50)}`;\n }, [errorState.primaryError, errorState.errorType]);\n\n // Dismiss current toast\n const dismissCurrentToast = useCallback(() => {\n if (currentToastIdRef.current) {\n toast.dismiss(currentToastIdRef.current);\n currentToastIdRef.current = null;\n }\n toast.dismiss({ containerId });\n }, [containerId]);\n\n // Show error toast\n const showErrorToast = useCallback(\n (title: string, rawError: string, errorKey: string) => {\n // Dismiss previous toast first\n dismissCurrentToast();\n\n // Check if this error was already displayed\n if (displayedErrorsRef.current.has(errorKey)) {\n return;\n }\n\n try {\n // Use toast.error and capture the result properly\n toast.error(\n <ToastError\n title={title}\n rawError={rawError}\n onCopyComplete={(success) => {\n if (success && process.env.NODE_ENV === 'development') {\n console.log('Error copied to clipboard:', rawError.substring(0, 100));\n }\n }}\n />,\n {\n containerId,\n toastId: errorKey,\n onClose: () => {\n displayedErrorsRef.current.delete(errorKey);\n currentToastIdRef.current = null;\n },\n },\n );\n\n displayedErrorsRef.current.add(errorKey);\n currentToastIdRef.current = errorKey;\n } catch (error) {\n console.error('Failed to show error toast:', error);\n }\n },\n [containerId, dismissCurrentToast],\n );\n\n // Main effect to handle error display logic\n useEffect(() => {\n const { hasAnyError, isConnected, primaryError } = errorState;\n\n // Clear all errors when connected successfully\n if (isConnected && !hasAnyError) {\n dismissCurrentToast();\n displayedErrorsRef.current.clear();\n return;\n }\n\n // Show error if present and not already displayed\n if (hasAnyError && primaryError && errorHash) {\n // For connected state, only show switch network errors\n if (isConnected && errorState.errorType !== 'switch') {\n return;\n }\n\n showErrorToast(errorTitle, primaryError, errorHash);\n }\n }, [errorState, errorTitle, errorHash, showErrorToast, dismissCurrentToast]);\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n dismissCurrentToast();\n // eslint-disable-next-line\n displayedErrorsRef.current.clear();\n };\n }, [dismissCurrentToast]);\n\n // Memoize container props with proper types\n const containerProps = useMemo(\n () => ({\n containerId,\n position,\n closeOnClick: false,\n icon: false as const,\n closeButton: ToastCloseButton,\n autoClose,\n hideProgressBar: false,\n newestOnTop: false,\n pauseOnFocusLoss: false,\n draggable,\n pauseOnHover: true,\n theme: 'light' as const,\n transition: Bounce,\n className: 'novacon:p-0 novacon:bg-transparent',\n }),\n [containerId, position, autoClose, draggable],\n );\n\n return (\n <ToastContainer {...containerProps} role=\"alert\" aria-live=\"assertive\" aria-label={labels.somethingWentWrong} />\n );\n}\n\n// Add display name for better debugging\nErrorsProvider.displayName = 'ErrorsProvider';\n","/**\n * @file This file sets up the React Context for providing i18n labels throughout the UI components.\n * It allows for deep customization of all text displayed by the library.\n */\n\nimport { ReactNode, useMemo } from 'react';\n\nimport { NovaConnectLabelsContext } from '../hooks/useNovaConnectLabels';\nimport { NovaConnectLabels } from '../i18n/types';\n\ninterface NovaConnectLabelsProviderProps {\n /** An object containing the custom labels */\n labels: NovaConnectLabels;\n /** The child components to render */\n children: ReactNode;\n}\n\n/**\n * A React component that provides a custom set of labels to all child components.\n * Wrap your application or component tree with this provider to apply custom translations.\n *\n * The provider uses React.memo optimization and validates labels in development mode.\n *\n * @example\n * ```typescript\n * import { NovaConnectLabelsProvider } from './NovaConnectLabelsProvider';\n * import { defaultLabels } from './i18n/en';\n *\n * function App() {\n * const customLabels = {\n * ...defaultLabels,\n * connectWallet: 'Подключить кошелек',\n * disconnect: 'Отключиться',\n * };\n *\n * return (\n * <NovaConnectLabelsProvider labels={customLabels}>\n * <YourApp />\n * </NovaConnectLabelsProvider>\n * );\n * }\n * ```\n */\nexport function NovaConnectLabelsProvider({ labels, children }: NovaConnectLabelsProviderProps) {\n // Memoize labels to prevent unnecessary re-renders\n const memoizedLabels = useMemo(() => labels, [labels]);\n\n // Development-only validation\n if (process.env.NODE_ENV === 'development') {\n // Validate that labels object is provided\n if (!labels || typeof labels !== 'object') {\n console.warn('NovaConnectLabelsProvider: labels prop should be an object');\n }\n\n // Check for missing required labels (basic validation)\n const requiredLabels = ['connectWallet', 'disconnect', 'connecting', 'connected', 'error', 'success'] as const;\n\n const missingLabels = requiredLabels.filter((key) => !(key in labels));\n if (missingLabels.length > 0) {\n console.warn(`NovaConnectLabelsProvider: Missing required labels: ${missingLabels.join(', ')}`);\n }\n }\n\n return <NovaConnectLabelsContext.Provider value={memoizedLabels}>{children}</NovaConnectLabelsContext.Provider>;\n}\n\n// Add display name for better debugging\nNovaConnectLabelsProvider.displayName = 'NovaConnectLabelsProvider';\n","import { deepMerge } from '@tuwaio/nova-core';\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { BaseWallet } from '@tuwaio/satellite-core';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport {\n ButtonTxStatus,\n ConnectContentType,\n ConnectedContentType,\n NovaConnectProviderContext,\n NovaConnectProviderProps,\n NovaConnectProviderType,\n} from '../hooks/useNovaConnect';\nimport { defaultLabels } from '../i18n/en';\nimport { ErrorsProvider } from './ErrorsProvider';\nimport { NovaConnectLabelsProvider } from './NovaConnectLabelsProvider';\n\nexport function NovaConnectProvider({ labels, store, children }: NovaConnectProviderProps) {\n const mergedLabels = useMemo(() => deepMerge(defaultLabels, labels || {}), [labels]);\n\n const [activeWallet, setActiveWallet] = useState<BaseWallet | undefined>(store.getState().activeWallet);\n const [walletConnectionError, setWalletConnectionError] = useState<string | undefined>(\n store.getState().walletConnectionError,\n );\n const [isConnectModalOpen, setIsConnectModalOpen] = useState(false);\n const [isConnectedModalOpen, setIsConnectedModalOpen] = useState(false);\n const [isChainsListOpen, setIsChainsListOpen] = useState(false);\n const [isChainsListOpenMobile, setIsChainsListOpenMobile] = useState(false);\n const [connectedButtonStatus, setConnectedButtonStatus] = useState<ButtonTxStatus>('idle');\n const [connectModalContentType, setConnectModalContentType] = useState<ConnectContentType>('connectors');\n const [selectedAdapter, setSelectedAdapter] = useState<OrbitAdapter | undefined>(undefined);\n const [activeConnector, setActiveConnector] = useState<string | undefined>(undefined);\n const [impersonatedAddress, setImpersonatedAddress] = useState('');\n const [isConnected, setIsConnected] = useState(false);\n const [connectedModalContentType, setConnectedModalContentType] = useState<ConnectedContentType>('main');\n\n useEffect(() => {\n const unsubscribe = store.subscribe((state) => {\n setActiveWallet(state.activeWallet);\n setWalletConnectionError(state.walletConnectionError);\n });\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const contextValue: NovaConnectProviderType = {\n walletConnectionError,\n activeWallet,\n isConnectModalOpen,\n setIsConnectModalOpen,\n isConnectedModalOpen,\n setIsConnectedModalOpen,\n isChainsListOpen,\n setIsChainsListOpen,\n isChainsListOpenMobile,\n setIsChainsListOpenMobile,\n connectedButtonStatus,\n setConnectedButtonStatus,\n connectedModalContentType,\n setConnectedModalContentType,\n connectModalContentType,\n setConnectModalContentType,\n selectedAdapter,\n setSelectedAdapter,\n activeConnector,\n setActiveConnector,\n impersonatedAddress,\n setImpersonatedAddress,\n isConnected,\n setIsConnected,\n };\n\n return (\n <NovaConnectProviderContext.Provider value={contextValue}>\n <ErrorsProvider store={store} />\n <NovaConnectLabelsProvider labels={mergedLabels}>{children}</NovaConnectLabelsProvider>\n </NovaConnectProviderContext.Provider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/evm/utils.ts","../../src/utils/adapters/evm.ts","../../src/solana/utils.ts","../../src/utils/adapters/solana.ts","../../src/i18n/en.ts","../../src/hooks/useNovaConnectLabels.ts","../../src/components/Chains/ChainListRenderer.tsx","../../src/hooks/useNovaConnect.ts","../../src/utils/getConnectedChainId.ts","../../src/utils/networksLinks.ts","../../src/components/ToBottomButton.tsx","../../src/components/ToTopButton.tsx","../../src/components/SelectContentAnimated.tsx","../../src/components/Chains/ScrollableChainList.tsx","../../src/components/WalletAvatar.tsx","../../src/components/WalletIcon.tsx","../../src/components/ConnectedModal/IconButton.tsx","../../src/components/ConnectedModal/ConnectedModalTxHistory.tsx","../../src/components/ConnectModal/RecentBadge.tsx","../../src/components/ToastError.tsx","../../src/providers/ErrorsProvider.tsx","../../src/providers/NovaConnectLabelsProvider.tsx","../../src/providers/NovaConnectProvider.tsx"],"names":["utils_exports","__export","getEvmChains","isEvmChainList","isValidEvmChainId","id","appChains","chain","chains","init_utils","__esmMin","evm_exports","createEvmAdapter","isEvmAdapterAvailable","getEvmUtils","error","evmUtils","getAvailableSolanaClusters","getSolanaClusters","isSolanaChainList","isValidSolanaCluster","extractSolanaCluster","chainId","parts","cluster","defaultRpcUrlsByMoniker","buildSolanaRpcUrls","solanaRPCUrls","availableRpcUrls","rpcUrl","solana_exports","createSolanaAdapter","isSolanaAdapterAvailable","getSolanaUtils","solanaUtils","defaultLabels","NovaConnectLabelsContext","createContext","useNovaConnectLabels","useContext","DefaultActiveIndicator","isActive","label","className","style","jsxs","Fragment","jsx","cn","SelectItemBase","forwardRef","children","props","forwardedRef","labels","qo","NovaConnectProviderError","message","NovaConnectProviderContext","useNovaConnect","context","OrbitAdapter","DefaultIcon","disabled","ChevronDownIcon","DefaultContent","icon","defaultClickHandler","originalHandler","event","defaultKeyDownHandler","ToBottomButton","ariaLabel","onClick","customization","ref","Icon","Content","customOnClickHandler","customOnKeyDownHandler","handleClick","useCallback","e","handleKeyDown","syntheticEvent","buttonClasses","useMemo","iconClasses","buttonStyles","iconStyles","iconElement","buttonProps","ChevronUpIcon","ToTopButton","SelectContentAnimated","contentClassName","viewportClassName","position","reduceMotion","maxHeight","animationDuration","showScrollButtons","topButtonProps","bottomButtonProps","topButtonCustomization","bottomButtonCustomization","contentStyle","viewportStyle","animationConfig","contentClasses","selectContentClasses","viewportClasses","selectContentStyles","contentStyles","viewportStyles","finalAriaLabel","F","AnimatePresence","motion","DefaultScrollContainer","React","onKeyDown","isHex","value","strict","zeroAddress","sizeClasses","DefaultLoadingOverlay","isLoading","showLoading","disableAnimation","loadingClasses","DefaultAvatarImage","src","onLoad","onError","address","ensAvatar","DefaultFallbackContent","formattedAddress","defaultGenerateBlockie","makeBlockie","defaultGenerateBgColor","colorHex","defaultFormatAddress","WalletAvatar","altText","size","onImageLoad","onImageError","imageSrc","setImageSrc","useState","setIsLoading","hasError","setHasError","LoadingOverlay","AvatarImage","FallbackContent","generateBlockie","generateBgColor","formatAddress","blockie","bgColor","imageAltText","currentEnsAvatar","handleImageLoad","handleImageError","containerClasses","containerStyles","baseStyles","currentImageSrc","containerProps","DefaultErrorIndicator","walletName","DefaultFallbackIcon","Web3Icon","WalletIcon","name","lazy","ErrorIndicator","FallbackIcon","formatWalletName","cleanIconUrl","trimmedIcon","imageClasses","imageStyle","imageProps","IconButton","walletIcon","walletChainId","items","loading","title","isClickable","formattedChainId","accessibleLabel","tooltipText","ChevronArrowWithAnim","module","RecentBadge","memo","animated","isTouch","isTouchDevice","gradientBackground","isCopied","DocumentDuplicateIcon","DefaultTitle","titleId","DefaultDescription","rawError","descriptionId","DefaultButtonContent","copyLabel","copiedLabel","idCounter","ToastError","onCopyComplete","copy","useCopyToClipboard","uniqueId","Title","Description","ButtonContent","errorToCopy","handleCopy","titleClasses","descriptionClasses","titleStyles","descriptionStyles","DefaultToastError","errorType","isConnected","DefaultContainer","ToastContainer","defaultShowErrorHandler","params","defaultDismissErrorHandler","defaultCopyCompleteHandler","success","defaultErrorTitleGenerator","defaultTitle","defaultErrorHashGenerator","defaultHash","ErrorsProvider","store","containerId","autoClose","draggable","activeWallet","walletConnectionError","switchNetworkError","CustomToastError","Container","customShowErrorHandler","customDismissErrorHandler","customCopyCompleteHandler","customErrorTitleGenerator","customErrorHashGenerator","displayedErrorsRef","useRef","currentToastIdRef","errorState","hasWalletError","hasSwitchError","defaultErrorTitle","errorTitle","defaultErrorHash","errorHash","dismissCurrentToast","toast","handleCopyComplete","originalErrorHandler","t","r","k","defaultToastOptions","customToastOptions","toastOptions","showErrorToast","errorKey","useEffect","hasAnyError","primaryError","defaultContainerProps","ToastCloseButton","Bounce","NovaConnectLabelsProvider","memoizedLabels","missingLabels","key","DefaultLabelsProvider","DefaultErrorsProvider","defaultLabelsMerge","userLabels","deepMerge","defaultLabelsTransform","mergedLabels","defaultStoreSubscribedHandler","defaultConnectionStateChangeHandler","defaultErrorStateChangeHandler","defaultContextValueTransform","defaultValue","defaultProviderTreeRenderer","defaultTree","components","NovaConnectProvider","LabelsProvider","CustomErrorsProvider","customLabelsMerge","customLabelsTransform","customStoreSubscribedHandler","customConnectionStateChangeHandler","customErrorStateChangeHandler","customContextValueTransform","customProviderTreeRenderer","setActiveWallet","setWalletConnectionError","isConnectModalOpen","setIsConnectModalOpen","isConnectedModalOpen","setIsConnectedModalOpen","isChainsListOpen","setIsChainsListOpen","isChainsListOpenMobile","setIsChainsListOpenMobile","connectedButtonStatus","setConnectedButtonStatus","connectModalContentType","setConnectModalContentType","selectedAdapter","setSelectedAdapter","activeConnector","setActiveConnector","impersonatedAddress","setImpersonatedAddress","setIsConnected","connectedModalContentType","setConnectedModalContentType","providerContext","finalLabels","handleConnectionStateChange","newIsConnected","newActiveWallet","handleErrorStateChange","newError","unsubscribe","state","contextValue","errorsProviderElement","labelsProviderElement","mainContentElement","defaultProviderTree","finalProviderTree"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Chain } from 'viem/chains';\n\n/**\n * Type guard to check if a value is a valid EVM chain ID\n */\nfunction isValidEvmChainId(id: unknown): id is number {\n return id !== undefined && id !== null && typeof id === 'number' && id > 0;\n}\n\n/**\n * Get EVM chain IDs from app chains configuration\n */\nexport function getEvmChains(appChains?: readonly [Chain, ...Chain[]]): number[] {\n if (!appChains || appChains.length === 0) {\n return [];\n }\n\n return appChains.map((chain) => chain.id).filter(isValidEvmChainId);\n}\n\n/**\n * Type guard to check if a chain list contains EVM chain IDs\n */\nexport function isEvmChainList(chains: (string | number)[]): chains is number[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'number');\n}\n","import type { ChainAdapter } from './types';\n\n/**\n * EVM utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface EvmUtilsModule {\n getEvmChains?: (appChains: any) => (string | number)[];\n isEvmChainList?: (chains: (string | number)[]) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of EVM utilities.\n * This function attempts to load EVM-specific utilities without throwing errors\n * if the EVM package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to EVM utilities module or null if not available\n *\n * @example\n * ```typescript\n * const evmUtils = await getEvmUtils();\n * if (evmUtils?.getEvmChains) {\n * const chains = evmUtils.getEvmChains(appChains);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getEvmUtils(): Promise<EvmUtilsModule | null> {\n try {\n // Dynamic import of EVM utilities - fails gracefully if package not installed\n const evmUtils = await import('../../evm/utils');\n return evmUtils;\n } catch (error) {\n console.warn('EVM utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates an EVM chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides EVM-specific functionality while gracefully handling\n * environments where EVM utilities are not available. It uses intelligent\n * fallbacks to ensure basic functionality even without the full EVM package.\n *\n * @returns Promise resolving to a configured EVM ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createEvmAdapter();\n *\n * // Get EVM chain IDs from app configuration\n * const chainIds = adapter.getChains([\n * { id: 1, name: 'Ethereum' },\n * { id: 137, name: 'Polygon' }\n * ]);\n * console.log(chainIds); // [1, 137]\n *\n * // Validate chain list format\n * const isValid = adapter.isChainList([1, 137, 56]);\n * console.log(isValid); // true (numeric IDs are valid for EVM)\n * ```\n *\n * @since 1.0.0\n */\nexport async function createEvmAdapter(): Promise<ChainAdapter> {\n const evmUtils = await getEvmUtils();\n\n return {\n /**\n * Extracts chain IDs from EVM app chain configuration.\n *\n * @param appChains Array of chain configurations or chain identifiers\n * @returns Array of chain IDs (numbers or strings)\n */\n getChains(appChains: any): (string | number)[] {\n // Use imported EVM utilities if available\n if (evmUtils?.getEvmChains) {\n return evmUtils.getEvmChains(appChains);\n }\n\n // Fallback implementation for basic chain extraction\n if (!Array.isArray(appChains) || appChains.length === 0) {\n return [];\n }\n\n return appChains\n .map((chain: any) => {\n // Handle chain objects with id property\n if (typeof chain === 'object' && chain?.id !== undefined) {\n return chain.id;\n }\n // Handle direct chain identifiers\n if (typeof chain === 'number' || typeof chain === 'string') {\n return chain;\n }\n return null;\n })\n .filter((id: any): id is string | number => id !== null && (typeof id === 'string' || typeof id === 'number'));\n },\n\n /**\n * Validates whether the provided chains list conforms to EVM chain format.\n * EVM chains are typically identified by numeric IDs.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for EVM\n */\n isChainList(chains: (string | number)[]): boolean {\n if (evmUtils?.isEvmChainList) {\n return evmUtils.isEvmChainList(chains);\n }\n\n // Fallback validation: EVM chains should be numbers\n return chains.length > 0 && chains.every((chain) => typeof chain === 'number');\n },\n };\n}\n\n/**\n * Checks if the EVM adapter can be created in the current environment.\n * This function verifies that the required EVM utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if EVM adapter is available\n *\n * @example\n * ```typescript\n * const hasEvm = await isEvmAdapterAvailable();\n * if (hasEvm) {\n * const adapter = await createEvmAdapter();\n * // Use EVM functionality\n * } else {\n * console.log('EVM support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isEvmAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../evm/utils');\n return true;\n } catch {\n return false;\n }\n}\n","import { defaultRpcUrlsByMoniker, SolanaRPCUrls } from '@tuwaio/orbit-solana';\nimport type { SolanaClusterMoniker } from 'gill';\n\nimport { ChainIdentifierArray } from '../types';\n\n/**\n * Extracts Solana cluster from chain identifier\n */\nfunction extractSolanaCluster(chainId: string): SolanaClusterMoniker | null {\n const parts = chainId.split(':');\n if (parts.length < 2) return null;\n\n const cluster = parts[1] as SolanaClusterMoniker;\n // Validate that it's a known cluster\n return cluster in defaultRpcUrlsByMoniker ? cluster : null;\n}\n\n/**\n * Builds available Solana RPC URLs from chain identifiers\n */\nfunction buildSolanaRpcUrls(\n chains: ChainIdentifierArray,\n solanaRPCUrls?: SolanaRPCUrls['rpcUrls'],\n): SolanaRPCUrls['rpcUrls'] {\n const availableRpcUrls: SolanaRPCUrls['rpcUrls'] = {};\n\n for (const chainId of chains) {\n if (typeof chainId !== 'string') continue;\n\n const cluster = extractSolanaCluster(chainId);\n if (!cluster) continue;\n\n // Get RPC URL with fallback to default\n const rpcUrl = solanaRPCUrls?.[cluster] ?? defaultRpcUrlsByMoniker[cluster];\n\n if (rpcUrl) {\n availableRpcUrls[cluster] = rpcUrl;\n }\n }\n\n return availableRpcUrls;\n}\n\n/**\n * Get Solana clusters from configuration\n */\nexport function getSolanaClusters(\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>,\n chains?: ChainIdentifierArray,\n): string[] {\n if (chains && chains.length > 0) {\n // For Solana, build RPC URLs and return cluster names\n const availableRpcUrls = buildSolanaRpcUrls(chains, solanaRPCUrls);\n return Object.keys(availableRpcUrls);\n }\n\n // Return configured clusters or defaults\n return Object.keys(solanaRPCUrls || defaultRpcUrlsByMoniker);\n}\n\n/**\n * Type guard to check if a chain list contains Solana cluster names\n */\nexport function isSolanaChainList(chains: (string | number)[]): chains is string[] {\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n}\n\n/**\n * Gets available Solana clusters from the default configuration\n */\nexport function getAvailableSolanaClusters(): SolanaClusterMoniker[] {\n return Object.keys(defaultRpcUrlsByMoniker) as SolanaClusterMoniker[];\n}\n\n/**\n * Validates if a string is a valid Solana cluster moniker\n */\nexport function isValidSolanaCluster(cluster: string): cluster is SolanaClusterMoniker {\n return cluster in defaultRpcUrlsByMoniker;\n}\n","import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n // Dynamic import of Solana utilities - fails gracefully if package not installed\n const solanaUtils = await import('../../solana/utils');\n return solanaUtils;\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n\n/**\n * Checks if the Solana adapter can be created in the current environment.\n * This function verifies that the required Solana utilities are available\n * by attempting to import them.\n *\n * @returns Promise resolving to true if Solana adapter is available\n *\n * @example\n * ```typescript\n * const hasSolana = await isSolanaAdapterAvailable();\n * if (hasSolana) {\n * const adapter = await createSolanaAdapter();\n * // Use Solana functionality\n * const clusters = adapter.getAvailableClusters?.();\n * } else {\n * console.log('Solana support not available in this build');\n * }\n * ```\n *\n * @since 1.0.0\n */\nexport async function isSolanaAdapterAvailable(): Promise<boolean> {\n try {\n await import('../../solana/utils');\n return true;\n } catch {\n return false;\n }\n}\n","import { NovaConnectLabels } from './types';\n\n/**\n * Default English translations for NovaConnect component\n * All text strings extracted from component files\n */\nexport const defaultLabels: NovaConnectLabels = {\n // Core actions - Primary user interactions\n connectWallet: 'Connect Wallet',\n disconnect: 'Disconnect',\n connecting: 'Connecting...',\n connected: 'Connected',\n tryAgain: 'Try again',\n back: 'Back',\n connect: 'Connect',\n close: 'Close',\n all: 'All',\n\n // Connection states - Status messages for wallet connection flow\n connectionError: 'Connection error',\n connectedSuccessfully: 'Connected successfully!',\n connectingTo: 'Connecting to',\n walletConnectionError: 'Wallet connection error',\n errorWhenChainSwitching: 'Error when chain switching',\n cannotConnectWallet: 'Cannot connect to the wallet. Please try again or use another connector.',\n\n // Transaction states - Status indicators for blockchain transactions\n success: 'Success',\n error: 'Error',\n replaced: 'Replaced',\n recent: 'Recent',\n transactionLoading: 'Transaction loading',\n transactionSuccess: 'Transaction successful',\n transactionError: 'Transaction failed',\n transactionReplaced: 'Transaction replaced',\n\n // Modal titles - Headers for different modal dialogs\n aboutWallets: 'About wallets',\n getWallet: 'Get a wallet',\n connectImpersonatedWallet: 'Connect impersonated wallet',\n transactionsInApp: 'Transactions in app',\n switchNetwork: 'Switch network',\n switchNetworks: 'Switch Networks',\n connectingEllipsis: 'Connecting...',\n\n // Wallet sections - Categories for wallet connector grouping\n installed: 'Installed',\n popular: 'Popular',\n impersonate: 'Impersonate',\n readOnlyMode: 'Read-only mode',\n\n // Information and descriptions - Educational content and explanations\n whatIsWallet: 'What is a wallet?',\n walletDescription:\n 'Wallets are essential for managing your crypto—they let you send, receive, and securely hold digital assets. Connecting your wallet grants you safe access and interaction with decentralized applications (dApps).',\n whatIsNetwork: 'What is a network?',\n networkDescription:\n 'A network (or blockchain) is a decentralized digital ledger that records transactions. Selecting a network lets you choose which blockchain you want to connect to.',\n learnMore: 'Learn more',\n listOfNetworks: 'List of networks',\n viewOnExplorer: 'View on explorer',\n viewTransactions: 'View transactions',\n\n // Impersonation form - Labels for wallet address impersonation feature\n enterWalletAddress: 'Enter wallet address to impersonate',\n walletAddressPlaceholder: '0x...',\n\n // Error messages - User-facing error notifications and descriptions\n noConnectorsFound: 'No Connectors Found',\n noConnectorsDescription: \"We couldn't find any wallets or connection methods for the selected network.\",\n somethingWentWrong: 'Something went wrong',\n networkPickingError: 'Something went wrong with wallet network selection. Please go back and try again.',\n pulsarAdapterRequired: 'Pulsar Adapter Required',\n pulsarAdapterDescription:\n 'Additional configuration is needed for viewing transactions in app. Please contact your admin.',\n selectAvailableNetwork: 'Select one of available network',\n\n // Get Wallet section - Onboarding content for new users without wallets\n startExploringWeb3: 'Start Exploring Web3',\n walletKeyToDigitalWorld:\n 'Your wallet is the key to the digital world and the technology that makes exploring web3 possible.',\n iDontHaveWallet: \"I don't have a wallet\",\n choseWallet: 'Choose a wallet',\n\n // About Wallets slides - Educational carousel content explaining wallet benefits\n keyToNewInternet: 'The Key to a New Internet',\n keyToNewInternetDescription:\n 'Your wallet is more than just storage. Think of it as your digital passport that lets you truly own, display, and exchange every digital asset you hold, from crypto tokens to unique NFTs.',\n logInWithoutHassle: 'Log In Without the Hassle',\n logInWithoutHassleDescription:\n 'Skip the endless sign-up forms! Your wallet is your unique access pass. Just connect it, and the website instantly recognizes you. It saves you time and protects your privacy.',\n\n // Copy functionality and UI feedback - Clipboard operations and user feedback\n copyRawError: 'Copy raw error',\n copied: 'Copied!',\n\n // Accessibility labels - Screen reader and ARIA labels for better accessibility\n chainSelector: 'Chain Selector',\n closeModal: 'Close modal',\n selectChain: 'Select chain',\n chainOption: 'Chain option',\n openChainSelector: 'Open chain selector',\n currentChain: 'Current chain',\n scrollToTop: 'Scroll to top',\n scrollToBottom: 'Scroll to bottom',\n chainListContainer: 'Chain list container',\n walletControls: 'Wallet controls',\n openWalletModal: 'Open wallet modal',\n walletConnected: 'Wallet connected',\n walletNotConnected: 'Wallet not connected',\n walletBalance: 'Wallet balance',\n walletAddress: 'Wallet address',\n transactionStatus: 'Transaction status',\n successIcon: 'Success icon',\n errorIcon: 'Error icon',\n replacedIcon: 'Replaced icon',\n statusIcon: 'Status icon',\n\n // Additional states - Supplementary status indicators\n loading: 'Loading',\n idle: 'Idle',\n\n // Wallet Avatar labels\n unknownWallet: 'Unknown wallet',\n walletAvatar: 'Wallet avatar',\n ensAvatar: 'ENS avatar',\n walletIcon: 'Wallet icon',\n\n // Impersonate errors\n impersonateAddressEmpty: 'Enter a wallet address to impersonate.',\n impersonateAddressNotCorrect: 'Entered wallet address is not correct. Please try again.',\n impersonateAddressConnected: 'First disconnect the wallet to impersonate another address.',\n};\n","import { createContext, useContext } from 'react';\n\nimport { defaultLabels } from '../i18n/en';\nimport { NovaConnectLabels } from '../i18n/types';\n\n/**\n * React Context for storing and providing the UI labels.\n * It is initialized with the default English labels, ensuring that components\n * work even without an explicit provider.\n */\nexport const NovaConnectLabelsContext = createContext<NovaConnectLabels>(defaultLabels);\n\n/**\n * A custom hook to easily access the i18n labels from any component\n * within the `NovaConnectLabelsProvider` tree.\n *\n * This hook provides type-safe access to all UI labels and automatically\n * falls back to default English labels if no provider is found.\n *\n * @returns {NovaConnectLabels} The complete object of UI labels for the current locale.\n *\n * @example\n * ```typescript\n * import { useNovaConnectLabels } from './hooks/useNovaConnectLabels';\n *\n * function MyComponent() {\n * const labels = useNovaConnectLabels();\n *\n * return (\n * <div>\n * <h1>{labels.connectWallet}</h1>\n * <button>{labels.connect}</button>\n * <p aria-label={labels.walletBalance}>{formattedBalance}</p>\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Destructuring specific labels for better performance\n * function ConnectButton() {\n * const { connectWallet, connecting, connected } = useNovaConnectLabels();\n *\n * return (\n * <button>\n * {isConnecting ? connecting : isConnected ? connected : connectWallet}\n * </button>\n * );\n * }\n * ```\n */\nexport const useNovaConnectLabels = (): NovaConnectLabels => {\n return useContext(NovaConnectLabelsContext);\n};\n\n/**\n * Hook to get a specific label by key path with type safety\n *\n * @param key The label key to retrieve\n * @returns The specific label value\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const connectLabel = useNovaConnectLabel('connectWallet');\n * const errorLabel = useNovaConnectLabel('connectionError');\n *\n * return <button>{connectLabel}</button>;\n * }\n * ```\n */\nexport const useNovaConnectLabel = <K extends keyof NovaConnectLabels>(key: K): NovaConnectLabels[K] => {\n const labels = useNovaConnectLabels();\n return labels[key];\n};\n\n/**\n * Hook to get multiple specific labels for better performance\n *\n * @param keys Array of label keys to retrieve\n * @returns Object with only the requested labels\n *\n * @example\n * ```typescript\n * function ConnectModal() {\n * const { connectWallet, connecting, disconnect } = useNovaConnectLabelsSubset(['connectWallet', 'connecting', 'disconnect']);\n *\n * return (\n * <div>\n * <h2>{connectWallet}</h2>\n * <span>{connecting}</span>\n * <button>{disconnect}</button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useNovaConnectLabelsSubset = <K extends keyof NovaConnectLabels>(\n keys: K[],\n): Pick<NovaConnectLabels, K> => {\n const allLabels = useNovaConnectLabels();\n\n const subset = {} as Pick<NovaConnectLabels, K>;\n for (const key of keys) {\n subset[key] = allLabels[key];\n }\n\n return subset;\n};\n\n/**\n * Type-safe helper to check if a label exists\n *\n * @param labels The labels object\n * @param key The key to check\n * @returns Whether the key exists and has a non-empty value\n */\nexport const hasLabel = (labels: NovaConnectLabels, key: keyof NovaConnectLabels): boolean => {\n return Boolean(labels[key]?.trim());\n};\n\n/**\n * Utility type for extracting label keys by category\n */\nexport type LabelCategory = {\n actions: Extract<\n keyof NovaConnectLabels,\n 'connectWallet' | 'disconnect' | 'connecting' | 'connected' | 'tryAgain' | 'back' | 'connect' | 'close'\n >;\n states: Extract<keyof NovaConnectLabels, 'success' | 'error' | 'replaced' | 'loading' | 'idle'>;\n accessibility: Extract<\n keyof NovaConnectLabels,\n 'chainSelector' | 'closeModal' | 'selectChain' | 'walletControls' | 'openWalletModal'\n >;\n transactions: Extract<\n keyof NovaConnectLabels,\n 'transactionLoading' | 'transactionSuccess' | 'transactionError' | 'transactionReplaced' | 'recent'\n >;\n};\n\n/**\n * Hook to get labels by category for better organization\n *\n * @param category The category of labels to retrieve\n * @returns Object with labels from the specified category\n */\nexport const useLabelsByCategory = <T extends keyof LabelCategory>(\n category: T,\n): Pick<NovaConnectLabels, LabelCategory[T]> => {\n const allLabels = useNovaConnectLabels();\n\n const categoryKeys: Record<keyof LabelCategory, (keyof NovaConnectLabels)[]> = {\n actions: ['connectWallet', 'disconnect', 'connecting', 'connected', 'tryAgain', 'back', 'connect', 'close'],\n states: ['success', 'error', 'replaced', 'loading', 'idle'],\n accessibility: ['chainSelector', 'closeModal', 'selectChain', 'walletControls', 'openWalletModal'],\n transactions: ['transactionLoading', 'transactionSuccess', 'transactionError', 'transactionReplaced', 'recent'],\n };\n\n const keys = categoryKeys[category] as LabelCategory[T][];\n const categoryLabels = {} as Pick<NovaConnectLabels, LabelCategory[T]>;\n\n for (const key of keys) {\n // eslint-disable-next-line\n (categoryLabels as any)[key] = allLabels[key as keyof NovaConnectLabels];\n }\n\n return categoryLabels;\n};\n\n/**\n * Utility function to check if labels are default ones (for external use)\n * This is a regular function, not a hook, so it can be used anywhere\n *\n * @param labels The labels to check\n * @returns Whether the labels are the default English labels\n *\n * @example\n * ```typescript\n * function SomeUtilityFunction(labels: NovaConnectLabels) {\n * if (isDefaultLabels(labels)) {\n * console.log('Using default English labels');\n * }\n * }\n * ```\n */\nexport const isDefaultLabels = (labels: NovaConnectLabels): boolean => {\n return labels === defaultLabels;\n};\n\n/**\n * Utility function to get a formatted label with fallback\n *\n * @param labels The labels object\n * @param key The label key\n * @param fallback Optional fallback text\n * @returns The label value or fallback\n *\n * @example\n * ```typescript\n * const buttonText = getLabelWithFallback(labels, 'connectWallet', 'Connect');\n * ```\n */\nexport const getLabelWithFallback = (\n labels: NovaConnectLabels,\n key: keyof NovaConnectLabels,\n fallback?: string,\n): string => {\n const value = labels[key];\n if (value && value.trim()) {\n return value;\n }\n return fallback || defaultLabels[key] || key.toString();\n};\n\n/**\n * Utility function to create a labels subset (for use outside of React components)\n *\n * @param labels The source labels object\n * @param keys Array of keys to extract\n * @returns Object with only the requested labels\n *\n * @example\n * ```typescript\n * const actionLabels = createLabelsSubset(labels, ['connect', 'disconnect', 'tryAgain']);\n * ```\n */\nexport const createLabelsSubset = <K extends keyof NovaConnectLabels>(\n labels: NovaConnectLabels,\n keys: K[],\n): Pick<NovaConnectLabels, K> => {\n const subset = {} as Pick<NovaConnectLabels, K>;\n for (const key of keys) {\n subset[key] = labels[key];\n }\n return subset;\n};\n","/**\n * @file Highly customizable chain list renderer with comprehensive styling and behavior control.\n * @module ChainListRenderer\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { getChainName } from '@bgd-labs/react-web3-icons/dist/utils';\nimport * as Select from '@radix-ui/react-select';\nimport { cn } from '@tuwaio/nova-core';\nimport {\n type AnyResolvedKeyframe,\n type LegacyAnimationControls,\n motion,\n type TargetAndTransition,\n type Transition,\n type VariantLabels,\n} from 'framer-motion';\nimport React, {\n type ComponentPropsWithoutRef,\n type ComponentType,\n type ElementRef,\n forwardRef,\n ReactNode,\n useCallback,\n useMemo,\n} from 'react';\n\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\n\n// === TYPES AND INTERFACES ===\n\n/**\n * Chain data structure returned by getChainData function\n */\ninterface ChainData {\n formattedChainId: string | number;\n chain: string | number;\n}\n\n/**\n * Props for custom chain icon component\n */\ninterface CustomChainIconProps {\n chainId: string | number;\n className?: string;\n style?: React.CSSProperties;\n 'aria-hidden'?: boolean;\n}\n\n/**\n * Props for custom chain content component\n */\ninterface CustomChainContentProps {\n chainId: string | number;\n isActive: boolean;\n icon: ReactNode;\n children?: ReactNode;\n}\n\n/**\n * Props for custom active indicator component\n */\ninterface CustomActiveIndicatorProps {\n isActive: boolean;\n label: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Animation configuration for container\n */\ninterface ContainerAnimationConfig {\n initial?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n animate?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n exit?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n transition?: Transition<AnyResolvedKeyframe>;\n}\n\n/**\n * Animation configuration for items\n */\ninterface ItemAnimationConfig {\n initial?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n animate?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n transition?: Transition<AnyResolvedKeyframe>;\n}\n\n/**\n * Comprehensive customization options for ChainListRenderer\n */\nexport interface ChainListRendererCustomization {\n /** Custom components */\n components?: {\n /** Custom chain icon component */\n ChainIcon?: ComponentType<CustomChainIconProps>;\n /** Custom chain content layout component */\n ChainContent?: ComponentType<CustomChainContentProps>;\n /** Custom active indicator component */\n ActiveIndicator?: ComponentType<CustomActiveIndicatorProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Container classes */\n container?: (params: { isMobile: boolean; itemCount: number }) => string;\n /** Item classes */\n item?: (params: { isActive: boolean; isMobile: boolean; chainId: string | number }) => string;\n /** Content wrapper classes */\n content?: (params: { isActive: boolean; isMobile: boolean }) => string;\n /** Icon classes */\n icon?: (params: { isActive: boolean; chainId: string | number }) => string;\n /** Chain name classes */\n chainName?: (params: { isActive: boolean; isMobile: boolean }) => string;\n /** Active indicator classes */\n activeIndicator?: (params: { isMobile: boolean }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Container styles */\n container?: (params: { isMobile: boolean; itemCount: number }) => React.CSSProperties;\n /** Item styles */\n item?: (params: { isActive: boolean; isMobile: boolean; chainId: string | number }) => React.CSSProperties;\n /** Content wrapper styles */\n content?: (params: { isActive: boolean; isMobile: boolean }) => React.CSSProperties;\n /** Icon styles */\n icon?: (params: { isActive: boolean; chainId: string | number }) => React.CSSProperties;\n /** Chain name styles */\n chainName?: (params: { isActive: boolean; isMobile: boolean }) => React.CSSProperties;\n /** Active indicator styles */\n activeIndicator?: (params: { isMobile: boolean }) => React.CSSProperties;\n };\n /** Custom event handlers */\n handlers?: {\n /** Custom click handler wrapper */\n onClick?: (\n originalHandler: () => void,\n context: { chainId: string | number; chainName: string; isActive: boolean },\n ) => void;\n /** Custom keydown handler wrapper */\n onKeyDown?: (\n originalHandler: (event: React.KeyboardEvent) => void,\n event: React.KeyboardEvent,\n context: { chainId: string | number; chainName: string; isActive: boolean },\n ) => void;\n /** Chain selection handler wrapper */\n onSelect?: (\n originalHandler: (chainId: string) => void,\n chainId: string,\n context: { chainName: string; isActive: boolean },\n ) => void;\n };\n /** Animation configuration */\n animations?: {\n /** Container animation */\n container?: ContainerAnimationConfig;\n /** Item animation */\n item?: ItemAnimationConfig;\n };\n /** Behavior configuration */\n behavior?: {\n /** Auto-focus first item */\n autoFocus?: boolean;\n /** Enable animation on mount */\n animateOnMount?: boolean;\n /** Show loading states */\n showLoading?: boolean;\n /** Custom loading message */\n loadingMessage?: string;\n };\n}\n\n/**\n * Props for the ChainListRenderer component\n */\nexport interface ChainListRendererProps {\n /** List of chain identifiers to render */\n chainsList: (string | number)[];\n /** Currently selected chain value */\n selectValue: string;\n /** Handler for chain selection changes */\n handleValueChange: (newChainId: string) => void;\n /** Function to get formatted chain data */\n getChainData: (chain: string | number) => ChainData;\n /** Handler called when list should close */\n onClose: () => void;\n /** Whether this is being rendered on mobile */\n isMobile?: boolean;\n /** Custom CSS classes for container (added to defaults) */\n className?: string;\n /** Custom CSS classes for individual items (added to defaults) */\n itemClassName?: string;\n /** Custom inline styles for container */\n style?: React.CSSProperties;\n /** Custom inline styles for individual items */\n itemStyle?: React.CSSProperties;\n /** Comprehensive customization options */\n customization?: ChainListRendererCustomization;\n /** ARIA label for the list container */\n 'aria-label'?: string;\n /** Loading state */\n isLoading?: boolean;\n /** Error state */\n error?: string | null;\n}\n\n// === DEFAULT COMPONENTS ===\n\n/**\n * Default chain icon component using Web3Icon\n */\nconst DefaultChainIcon: React.FC<CustomChainIconProps> = ({ chainId, className, style, ...props }) => (\n <Web3Icon chainId={chainId} className={className} style={style} {...props} />\n);\n\n/**\n * Default chain content component\n */\nconst DefaultChainContent: React.FC<CustomChainContentProps> = ({ icon, children }) => (\n <div className=\"novacon:flex novacon:items-center novacon:space-x-3 novacon:[&_img]:w-6 novacon:[&_img]:h-6\">\n <div aria-hidden=\"true\">{icon}</div>\n {children}\n </div>\n);\n\n/**\n * Default active indicator component\n */\nconst DefaultActiveIndicator: React.FC<CustomActiveIndicatorProps> = ({ isActive, label, className, style }) => {\n if (!isActive) return null;\n\n return (\n <>\n <span\n className={cn(\n 'novacon:ml-auto novacon:text-xs novacon:font-semibold novacon:w-2 novacon:h-2 novacon:rounded-full novacon:bg-[var(--tuwa-success-text)]',\n className,\n )}\n style={style}\n aria-label={label}\n role=\"status\"\n />\n <span className=\"novacon:sr-only\">{label}</span>\n </>\n );\n};\n\n/**\n * Enhanced SelectItem component for desktop use\n */\nconst SelectItemBase = forwardRef<ElementRef<typeof Select.Item>, ComponentPropsWithoutRef<typeof Select.Item>>(\n ({ children, className, ...props }, forwardedRef) => {\n const labels = useNovaConnectLabels();\n const isActive = props.value === props['aria-selected'];\n\n return (\n <Select.Item\n ref={forwardedRef}\n className={cn(\n // Base styles\n 'novacon:flex novacon:items-center novacon:w-full novacon:text-left novacon:px-2 novacon:py-2',\n 'novacon:rounded-md novacon:transition-colors novacon:space-x-3 novacon:cursor-pointer novacon:outline-none',\n // Interactive states\n 'novacon:text-[var(--tuwa-text-primary)] novacon:hover:bg-[var(--tuwa-bg-muted)]',\n 'novacon:focus:bg-[var(--tuwa-bg-muted)] novacon:focus:outline-none',\n 'novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-border-primary)] novacon:focus:ring-offset-2',\n // Active state\n { 'novacon:bg-[var(--tuwa-bg-muted)]': isActive },\n // Custom classes\n className,\n )}\n role=\"option\"\n aria-selected={isActive}\n tabIndex={0}\n {...props}\n >\n {children}\n {isActive && <DefaultActiveIndicator isActive={true} label={labels.connected} className=\"novacon:ml-auto\" />}\n </Select.Item>\n );\n },\n);\nSelectItemBase.displayName = 'SelectItemBase';\n\n// === MAIN COMPONENT ===\n\n/**\n * Highly customizable chain list renderer with comprehensive styling and behavior control.\n */\nexport const ChainListRenderer: React.FC<ChainListRendererProps> = ({\n chainsList,\n selectValue,\n handleValueChange,\n getChainData,\n onClose,\n isMobile = false,\n className,\n itemClassName,\n style,\n itemStyle,\n customization,\n 'aria-label': ariaLabel,\n isLoading = false,\n error = null,\n}) => {\n const labels = useNovaConnectLabels();\n\n // Extract customization options with defaults\n const {\n ChainIcon = DefaultChainIcon,\n ChainContent = DefaultChainContent,\n ActiveIndicator = DefaultActiveIndicator,\n } = customization?.components ?? {};\n\n const animations = customization?.animations;\n const behavior = customization?.behavior ?? {};\n\n // Memoize container classes and styles\n const containerClasses = useMemo(() => {\n const baseClasses = '';\n const customClasses = customization?.classNames?.container?.({ isMobile, itemCount: chainsList.length });\n return cn(baseClasses, customClasses, className);\n }, [customization, isMobile, chainsList.length, className]);\n\n const containerStyles = useMemo(() => {\n const customStyles = customization?.styles?.container?.({ isMobile, itemCount: chainsList.length });\n return { ...customStyles, ...style };\n }, [customization, isMobile, chainsList.length, style]);\n\n // Create event handlers at top level to avoid hooks violations\n const createClickHandler = useCallback(\n (formattedChainId: string | number, chainName: string, isActive: boolean) => {\n const originalHandler = () => {\n if (customization?.handlers?.onSelect) {\n customization.handlers.onSelect(handleValueChange, String(formattedChainId), { chainName, isActive });\n } else {\n handleValueChange(String(formattedChainId));\n }\n onClose();\n };\n\n return () => {\n if (customization?.handlers?.onClick) {\n customization.handlers.onClick(originalHandler, {\n chainId: formattedChainId,\n chainName,\n isActive,\n });\n } else {\n originalHandler();\n }\n };\n },\n [customization, handleValueChange, onClose],\n );\n\n const createKeyDownHandler = useCallback(\n (clickHandler: () => void, formattedChainId: string | number, chainName: string, isActive: boolean) => {\n const originalHandler = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n clickHandler();\n }\n };\n\n return (event: React.KeyboardEvent) => {\n if (customization?.handlers?.onKeyDown) {\n customization.handlers.onKeyDown(originalHandler, event, {\n chainId: formattedChainId,\n chainName,\n isActive,\n });\n } else {\n originalHandler(event);\n }\n };\n },\n [customization],\n );\n\n // Handle loading state\n if (isLoading) {\n const loadingMessage = behavior.loadingMessage || `${labels.loading}...`;\n return (\n <div\n className={cn('novacon:flex novacon:justify-center novacon:items-center novacon:py-4', containerClasses)}\n style={containerStyles}\n role=\"status\"\n aria-label={loadingMessage}\n >\n <span className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">{loadingMessage}</span>\n </div>\n );\n }\n\n // Handle error state\n if (error) {\n return (\n <div\n className={cn('novacon:flex novacon:justify-center novacon:items-center novacon:py-4', containerClasses)}\n style={containerStyles}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <span className=\"novacon:text-sm novacon:text-[var(--tuwa-text-error)]\">{error}</span>\n </div>\n );\n }\n\n // Handle empty state\n if (chainsList.length === 0) {\n return (\n <div\n className={cn('novacon:flex novacon:justify-center novacon:items-center novacon:py-4', containerClasses)}\n style={containerStyles}\n role=\"status\"\n >\n <span className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">{labels.noConnectorsFound}</span>\n </div>\n );\n }\n\n // Main render method for individual chain items\n const renderChainItem = (chain: string | number) => {\n const { formattedChainId } = getChainData(chain);\n const isActive = String(formattedChainId) === selectValue;\n const chainName = getChainName(formattedChainId);\n\n // Generate custom classes and styles\n const itemClasses = cn(\n // Default item styles\n 'novacon:flex novacon:items-center novacon:w-full novacon:text-left novacon:px-2 novacon:py-2',\n 'novacon:rounded-md novacon:transition-colors novacon:space-x-3 novacon:cursor-pointer novacon:outline-none',\n 'novacon:text-[var(--tuwa-text-primary)] novacon:hover:bg-[var(--tuwa-bg-muted)]',\n 'novacon:focus:bg-[var(--tuwa-bg-muted)] novacon:focus:outline-none',\n 'novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-border-primary)] novacon:focus:ring-offset-2',\n { 'novacon:bg-[var(--tuwa-bg-muted)]': isActive },\n isMobile && 'novacon:justify-between',\n // Custom classes\n customization?.classNames?.item?.({ isActive, isMobile, chainId: formattedChainId }),\n itemClassName,\n );\n\n const itemStyles = {\n ...customization?.styles?.item?.({ isActive, isMobile, chainId: formattedChainId }),\n ...itemStyle,\n };\n\n const iconClasses = customization?.classNames?.icon?.({ isActive, chainId: formattedChainId });\n const iconStyles = customization?.styles?.icon?.({ isActive, chainId: formattedChainId });\n\n const chainNameClasses = customization?.classNames?.chainName?.({ isActive, isMobile });\n const chainNameStyles = customization?.styles?.chainName?.({ isActive, isMobile });\n\n // Create event handlers\n const handleClick = createClickHandler(formattedChainId, chainName, isActive);\n const handleKeyDown = createKeyDownHandler(handleClick, formattedChainId, chainName, isActive);\n\n // Create icon element\n const iconElement = (\n <ChainIcon chainId={formattedChainId} className={iconClasses} style={iconStyles} aria-hidden={true} />\n );\n\n // Create content element\n const contentElement = (\n <ChainContent chainId={formattedChainId} isActive={isActive} icon={iconElement}>\n <span className={cn('novacon:text-sm novacon:font-medium', chainNameClasses)} style={chainNameStyles}>\n {chainName}\n </span>\n </ChainContent>\n );\n\n // Create active indicator\n const activeIndicatorClasses = customization?.classNames?.activeIndicator?.({ isMobile });\n const activeIndicatorStyles = customization?.styles?.activeIndicator?.({ isMobile });\n\n const activeIndicator = isMobile ? (\n <div className=\"novacon:flex novacon:items-center novacon:space-x-2 novacon:text-xs novacon:font-semibold novacon:text-[var(--tuwa-text-tertiary)]\">\n <span aria-label={labels.connected}>{labels.connected}</span>\n <ActiveIndicator\n isActive={isActive}\n label={labels.connected}\n className={activeIndicatorClasses}\n style={activeIndicatorStyles}\n />\n </div>\n ) : (\n <ActiveIndicator\n isActive={isActive}\n label={labels.connected}\n className={activeIndicatorClasses}\n style={activeIndicatorStyles}\n />\n );\n\n const ariaLabel = `${labels.chainOption}: ${chainName}`;\n\n // Render mobile version\n if (isMobile) {\n const MotionItem = animations?.item ? motion.div : 'div';\n const motionProps = animations?.item || {};\n\n return (\n <MotionItem\n key={chain}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={itemClasses}\n style={itemStyles}\n role=\"option\"\n aria-selected={isActive}\n aria-label={ariaLabel}\n tabIndex={0}\n {...motionProps}\n >\n {contentElement}\n {activeIndicator}\n </MotionItem>\n );\n }\n\n // Render desktop version with Select.Item\n return (\n <SelectItemBase\n key={chain}\n value={String(formattedChainId)}\n aria-label={ariaLabel}\n onSelect={handleClick}\n className={itemClasses}\n style={itemStyles}\n >\n {contentElement}\n </SelectItemBase>\n );\n };\n\n // Container animation wrapper\n const MotionContainer = animations?.container ? motion.div : 'div';\n const containerMotionProps = animations?.container || {};\n\n return (\n <MotionContainer\n role=\"listbox\"\n aria-label={ariaLabel || labels.selectChain}\n className={containerClasses}\n style={containerStyles}\n {...containerMotionProps}\n >\n {chainsList.map(renderChainItem)}\n </MotionContainer>\n );\n};\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { ISatelliteConnectStore } from '@tuwaio/satellite-core';\nimport { BaseWallet } from '@tuwaio/satellite-core';\nimport { createContext, useContext } from 'react';\nimport { StoreApi } from 'zustand/index';\n\nimport { NovaConnectLabels } from '../i18n/types';\nimport { Connector, Wallet } from '../types';\n\nexport type ButtonTxStatus = 'idle' | 'loading' | 'succeed' | 'failed' | 'replaced';\nexport type ConnectContentType = 'network' | 'connectors' | 'about' | 'getWallet' | 'connecting' | 'impersonate';\nexport type ConnectedContentType = 'main' | 'transactions' | 'chains';\n\n// Provider props interface\nexport interface NovaConnectProviderProps {\n store: StoreApi<ISatelliteConnectStore<Connector, Wallet>>;\n children: React.ReactNode;\n labels?: Partial<NovaConnectLabels>;\n}\n\n// Balance type for better type safety\nexport interface WalletBalance {\n value: string;\n symbol: string;\n}\n\n// Provider context type with better organization\nexport interface NovaConnectProviderType {\n activeWallet: BaseWallet | undefined;\n walletConnectionError: string | undefined;\n // Modal states\n isConnectModalOpen: boolean;\n setIsConnectModalOpen: (value: boolean) => void;\n isConnectedModalOpen: boolean;\n setIsConnectedModalOpen: (value: boolean) => void;\n\n // Chain selection states\n isChainsListOpen: boolean;\n setIsChainsListOpen: (value: boolean) => void;\n isChainsListOpenMobile: boolean;\n setIsChainsListOpenMobile: (value: boolean) => void;\n\n // Connection states\n connectedButtonStatus: ButtonTxStatus;\n setConnectedButtonStatus: (value: ButtonTxStatus) => void;\n isConnected: boolean;\n setIsConnected: (value: boolean) => void;\n\n // Modal content types\n connectedModalContentType: ConnectedContentType;\n setConnectedModalContentType: (value: ConnectedContentType) => void;\n connectModalContentType: ConnectContentType;\n setConnectModalContentType: (value: ConnectContentType) => void;\n\n // Adapter and connector states\n selectedAdapter: OrbitAdapter | undefined;\n setSelectedAdapter: (value: OrbitAdapter | undefined) => void;\n activeConnector: string | undefined;\n setActiveConnector: (value: string | undefined) => void;\n\n // Impersonation\n impersonatedAddress: string;\n setImpersonatedAddress: (value: string) => void;\n}\n\n// Custom error for hook usage outside provider\nexport class NovaConnectProviderError extends Error {\n constructor(message = 'useNovaConnect must be used within NovaConnectProvider') {\n super(message);\n this.name = 'NovaConnectProviderError';\n }\n}\n\n// Create context with undefined default to enforce provider usage\nexport const NovaConnectProviderContext = createContext<NovaConnectProviderType | undefined>(undefined);\n\n/**\n * Hook to access NovaConnect context\n *\n * @throws {NovaConnectProviderError} When used outside of NovaConnectProvider\n * @returns {NovaConnectProviderType} The NovaConnect context value\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { isConnected, handleConnectButtonClick } = useNovaConnect();\n *\n * return (\n * <button onClick={handleConnectButtonClick}>\n * {isConnected ? 'Connected' : 'Connect Wallet'}\n * </button>\n * );\n * }\n * ```\n */\nexport const useNovaConnect = (): NovaConnectProviderType => {\n const context = useContext(NovaConnectProviderContext);\n\n if (!context) {\n throw new NovaConnectProviderError();\n }\n\n return context;\n};\n\n/**\n * Hook to check if NovaConnect context is available\n *\n * @returns {boolean} True if context is available, false otherwise\n *\n * @example\n * ```typescript\n * function ConditionalComponent() {\n * const hasContext = useHasNovaConnectContext();\n *\n * if (!hasContext) {\n * return <div>NovaConnect provider not found</div>;\n * }\n *\n * return <ConnectedComponent />;\n * }\n * ```\n */\nexport const useHasNovaConnectContext = (): boolean => {\n const context = useContext(NovaConnectProviderContext);\n return context !== undefined;\n};\n\n/**\n * Optional hook that returns null if provider is not available\n *\n * @returns {NovaConnectProviderType | null} Context value or null if not available\n *\n * @example\n * ```typescript\n * function OptionalComponent() {\n * const context = useNovaConnectOptional();\n *\n * if (!context) {\n * return <div>No wallet provider available</div>;\n * }\n *\n * return <div>Connected: {context.isConnected}</div>;\n * }\n * ```\n */\nexport const useNovaConnectOptional = (): NovaConnectProviderType | null => {\n const context = useContext(NovaConnectProviderContext);\n return context ?? null;\n};\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\n\nimport { InitialChains } from '../types';\n\n// Default fallback chain IDs\nconst DEFAULT_CHAIN_IDS = {\n [OrbitAdapter.EVM]: 1, // Ethereum Mainnet\n [OrbitAdapter.SOLANA]: 'mainnet',\n [OrbitAdapter.Starknet]: '0x534e5f4d41494e',\n} as const;\n\n/**\n * Basic interface for chain objects to handle the any type safely\n */\ninterface BasicChain {\n id: number | string;\n [key: string]: any;\n}\n\n/**\n * Gets the appropriate chain ID for connecting based on the selected adapter.\n * Returns the first available chain for the adapter, or a sensible default.\n *\n * @param params - Configuration object\n * @param params.selectedAdapter - The blockchain adapter to use\n * @param params.appChains - Available EVM chains\n * @param params.solanaRPCUrls - Available Solana networks\n * @returns Chain ID (number for EVM/Starknet, string for Solana)\n */\nexport function getConnectChainId({\n selectedAdapter,\n appChains,\n solanaRPCUrls,\n}: { selectedAdapter: OrbitAdapter } & InitialChains): number | string {\n switch (selectedAdapter) {\n case OrbitAdapter.EVM: {\n // Return first available EVM chain or default to Ethereum\n const firstChain = appChains?.[0];\n if (firstChain?.id && typeof firstChain.id === 'number') {\n return firstChain.id;\n }\n\n if (process.env.NODE_ENV === 'development' && !appChains?.length) {\n console.warn('getConnectChainId: No EVM chains configured, using Ethereum Mainnet');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.EVM];\n }\n\n case OrbitAdapter.SOLANA: {\n // Return first available Solana network or default to mainnet\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n const networks = Object.keys(solanaRPCUrls);\n if (networks.length > 0) {\n return networks[0];\n }\n }\n\n if (process.env.NODE_ENV === 'development' && !solanaRPCUrls) {\n console.warn('getConnectChainId: No Solana RPC URLs configured, using mainnet');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.SOLANA];\n }\n\n case OrbitAdapter.Starknet: {\n if (process.env.NODE_ENV === 'development') {\n console.info('getConnectChainId: Using default Starknet chain ID');\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.Starknet];\n }\n\n default: {\n // Handle unknown adapter types gracefully\n if (process.env.NODE_ENV === 'development') {\n console.error('getConnectChainId: Unknown adapter:', selectedAdapter);\n }\n\n return DEFAULT_CHAIN_IDS[OrbitAdapter.EVM];\n }\n }\n}\n\n/**\n * Helper to get all available chain IDs for an adapter\n */\nexport function getAvailableChainIds({\n selectedAdapter,\n appChains,\n solanaRPCUrls,\n}: { selectedAdapter: OrbitAdapter } & InitialChains): Array<number | string> {\n switch (selectedAdapter) {\n case OrbitAdapter.EVM:\n return appChains?.map((chain: BasicChain) => chain.id).filter(Boolean) ?? [DEFAULT_CHAIN_IDS[OrbitAdapter.EVM]];\n\n case OrbitAdapter.SOLANA:\n return solanaRPCUrls ? Object.keys(solanaRPCUrls) : [DEFAULT_CHAIN_IDS[OrbitAdapter.SOLANA]];\n\n case OrbitAdapter.Starknet:\n return [DEFAULT_CHAIN_IDS[OrbitAdapter.Starknet]];\n\n default:\n return [DEFAULT_CHAIN_IDS[OrbitAdapter.EVM]];\n }\n}\n","import { OrbitAdapter } from '@tuwaio/orbit-core';\n\nexport const networksLinks: Partial<\n Record<OrbitAdapter, { aboutNetwork: string; choseWallet: string; about: string }>\n> = {\n [OrbitAdapter.EVM]: {\n aboutNetwork: 'https://ethereum.org/developers/docs/intro-to-ethereum/',\n choseWallet: 'https://ethereum.org/wallets/find-wallet/',\n about: 'https://ethereum.org/wallets/',\n },\n [OrbitAdapter.SOLANA]: {\n aboutNetwork: 'https://solana.com/en/learn/what-is-solana',\n choseWallet: 'https://solana.com/en/solana-wallets',\n about: 'https://solana.com/en/learn/what-is-a-wallet',\n },\n};\n","/**\n * @file This file contains the `ToBottomButton` component, a customizable scroll-to-bottom button with full styling control.\n */\n\nimport { ChevronDownIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { ComponentPropsWithoutRef, ComponentType, forwardRef, ReactNode, useCallback, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomIconProps = {\n disabled: boolean;\n className?: string;\n style?: React.CSSProperties;\n 'aria-hidden'?: boolean;\n};\n\ntype CustomContentProps = {\n icon: ReactNode;\n disabled: boolean;\n ariaLabel?: string;\n};\n\n/**\n * Customization options for ToBottomButton component\n */\nexport type ToBottomButtonCustomization = {\n /** Override button element props */\n buttonProps?: Partial<ComponentPropsWithoutRef<'button'>>;\n /** Custom components */\n components?: {\n /** Custom icon component */\n Icon?: ComponentType<CustomIconProps>;\n /** Custom button content component (wraps the icon) */\n Content?: ComponentType<CustomContentProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Function to generate button classes */\n button?: (params: { disabled: boolean; hasOnClick: boolean }) => string;\n /** Function to generate icon classes */\n icon?: (params: { disabled: boolean }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Function to generate button styles */\n button?: (params: { disabled: boolean; hasOnClick: boolean }) => React.CSSProperties;\n /** Function to generate icon styles */\n icon?: (params: { disabled: boolean }) => React.CSSProperties;\n };\n /** Custom event handlers */\n handlers?: {\n /** Custom click handler wrapper */\n onClick?: (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n ) => void;\n /** Custom keydown handler wrapper */\n onKeyDown?: (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n ) => void;\n };\n};\n\nexport interface ToBottomButtonProps\n extends Omit<ComponentPropsWithoutRef<'button'>, 'type' | 'onClick' | 'onKeyDown'> {\n /** Custom CSS classes for the button */\n className?: string;\n /** Custom aria-label for the button */\n 'aria-label'?: string;\n /** Callback fired when button is clicked */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Customization options */\n customization?: ToBottomButtonCustomization;\n}\n\n// --- Default Sub-Components ---\nconst DefaultIcon = ({ disabled, className, style, ...props }: CustomIconProps) => {\n return (\n <ChevronDownIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-transform novacon:duration-200',\n disabled && 'novacon:opacity-50',\n className,\n )}\n style={style}\n {...props}\n />\n );\n};\n\nconst DefaultContent = ({ icon }: CustomContentProps) => {\n return <>{icon}</>;\n};\n\n// --- Default Event Handlers ---\nconst defaultClickHandler = (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\nconst defaultKeyDownHandler = (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\n/**\n * A highly customizable scroll-to-bottom button component with extensive styling options and accessibility features.\n * Provides comprehensive customization for appearance, behavior, and event handling while maintaining keyboard navigation support.\n */\nexport const ToBottomButton = forwardRef<HTMLButtonElement, ToBottomButtonProps>(\n ({ className, 'aria-label': ariaLabel, onClick, disabled = false, customization, ...props }, ref) => {\n const labels = useNovaConnectLabels();\n\n // Extract custom components and handlers\n const { Icon = DefaultIcon, Content = DefaultContent } = customization?.components ?? {};\n\n const {\n onClick: customOnClickHandler = defaultClickHandler,\n onKeyDown: customOnKeyDownHandler = defaultKeyDownHandler,\n } = customization?.handlers ?? {};\n\n // Handle click events\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n const originalHandler = (e: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent default scroll behavior if custom handler provided\n if (onClick) {\n e.preventDefault();\n onClick(e);\n }\n };\n\n customOnClickHandler(originalHandler, event);\n },\n [onClick, customOnClickHandler],\n );\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n const originalHandler = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // Handle keyboard activation\n if ((e.key === 'Enter' || e.key === ' ') && onClick) {\n e.preventDefault();\n // Create a synthetic mouse event for onClick compatibility\n const syntheticEvent = {\n ...e,\n button: 0,\n buttons: 1,\n clientX: 0,\n clientY: 0,\n movementX: 0,\n movementY: 0,\n offsetX: 0,\n offsetY: 0,\n pageX: 0,\n pageY: 0,\n relatedTarget: null,\n screenX: 0,\n screenY: 0,\n x: 0,\n y: 0,\n getModifierState: () => false,\n initMouseEvent: () => {},\n };\n // eslint-disable-next-line\n onClick(syntheticEvent as any);\n }\n };\n\n customOnKeyDownHandler(originalHandler, event);\n },\n [onClick, customOnKeyDownHandler],\n );\n\n // Generate button classes\n const buttonClasses = useMemo(() => {\n if (customization?.classNames?.button) {\n return customization.classNames.button({ disabled, hasOnClick: Boolean(onClick) });\n }\n\n return cn(\n 'novacon:flex novacon:w-full novacon:h-6 novacon:items-center novacon:justify-center',\n 'novacon:bg-[var(--tuwa-bg-secondary)] novacon:text-[var(--tuwa-text-primary)]',\n 'novacon:transition-colors novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-bg-tertiary)] novacon:hover:text-[var(--tuwa-text-secondary)]',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-text-accent)] novacon:focus:ring-inset',\n 'novacon:active:bg-[var(--tuwa-bg-quaternary)]',\n 'novacon:disabled:opacity-50 novacon:disabled:cursor-not-allowed novacon:disabled:hover:bg-[var(--tuwa-bg-secondary)]',\n onClick ? 'novacon:cursor-pointer' : 'novacon:cursor-default',\n className,\n );\n }, [customization, disabled, onClick, className]);\n\n // Generate icon classes\n const iconClasses = useMemo(() => {\n if (customization?.classNames?.icon) {\n return customization.classNames.icon({ disabled });\n }\n\n return undefined; // Let DefaultIcon handle its own classes\n }, [customization, disabled]);\n\n // Generate button styles\n const buttonStyles = useMemo(() => {\n if (customization?.styles?.button) {\n return customization.styles.button({ disabled, hasOnClick: Boolean(onClick) });\n }\n\n return undefined;\n }, [customization, disabled, onClick]);\n\n // Generate icon styles\n const iconStyles = useMemo(() => {\n if (customization?.styles?.icon) {\n return customization.styles.icon({ disabled });\n }\n\n return undefined;\n }, [customization, disabled]);\n\n // Create icon element\n const iconElement = useMemo(\n () => <Icon disabled={disabled} className={iconClasses} style={iconStyles} aria-hidden />,\n [Icon, disabled, iconClasses, iconStyles],\n );\n\n // Merge button props\n const buttonProps = useMemo(\n () => ({\n ...customization?.buttonProps,\n ...props,\n ref,\n type: 'button' as const,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n disabled,\n className: buttonClasses,\n style: { ...buttonStyles, ...customization?.buttonProps?.style, ...props.style },\n 'aria-label': ariaLabel || labels.scrollToBottom,\n title: ariaLabel || labels.scrollToBottom,\n }),\n [\n customization?.buttonProps,\n props,\n ref,\n handleClick,\n handleKeyDown,\n disabled,\n buttonClasses,\n buttonStyles,\n ariaLabel,\n labels.scrollToBottom,\n ],\n );\n\n return (\n <button {...buttonProps}>\n <Content icon={iconElement} disabled={disabled} ariaLabel={ariaLabel} />\n </button>\n );\n },\n);\n\nToBottomButton.displayName = 'ToBottomButton';\n","/**\n * @file This file contains the `ToTopButton` component, a customizable scroll-to-top button with full styling control.\n */\n\nimport { ChevronUpIcon } from '@heroicons/react/24/solid';\nimport { cn } from '@tuwaio/nova-core';\nimport { ComponentPropsWithoutRef, ComponentType, forwardRef, ReactNode, useCallback, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomIconProps = {\n disabled: boolean;\n className?: string;\n style?: React.CSSProperties;\n 'aria-hidden'?: boolean;\n};\n\ntype CustomContentProps = {\n icon: ReactNode;\n disabled: boolean;\n ariaLabel?: string;\n};\n\n/**\n * Customization options for ToTopButton component\n */\nexport type ToTopButtonCustomization = {\n /** Override button element props */\n buttonProps?: Partial<ComponentPropsWithoutRef<'button'>>;\n /** Custom components */\n components?: {\n /** Custom icon component */\n Icon?: ComponentType<CustomIconProps>;\n /** Custom button content component (wraps the icon) */\n Content?: ComponentType<CustomContentProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Function to generate button classes */\n button?: (params: { disabled: boolean; hasOnClick: boolean }) => string;\n /** Function to generate icon classes */\n icon?: (params: { disabled: boolean }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Function to generate button styles */\n button?: (params: { disabled: boolean; hasOnClick: boolean }) => React.CSSProperties;\n /** Function to generate icon styles */\n icon?: (params: { disabled: boolean }) => React.CSSProperties;\n };\n /** Custom event handlers */\n handlers?: {\n /** Custom click handler wrapper */\n onClick?: (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n ) => void;\n /** Custom keydown handler wrapper */\n onKeyDown?: (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n ) => void;\n };\n};\n\nexport interface ToTopButtonProps extends Omit<ComponentPropsWithoutRef<'button'>, 'type' | 'onClick' | 'onKeyDown'> {\n /** Custom CSS classes for the button */\n className?: string;\n /** Custom aria-label for the button */\n 'aria-label'?: string;\n /** Callback fired when button is clicked */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Customization options */\n customization?: ToTopButtonCustomization;\n}\n\n// --- Default Sub-Components ---\nconst DefaultIcon = ({ disabled, className, style, ...props }: CustomIconProps) => {\n return (\n <ChevronUpIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-transform novacon:duration-200',\n disabled && 'novacon:opacity-50',\n className,\n )}\n style={style}\n {...props}\n />\n );\n};\n\nconst DefaultContent = ({ icon }: CustomContentProps) => {\n return <>{icon}</>;\n};\n\n// --- Default Event Handlers ---\nconst defaultClickHandler = (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\nconst defaultKeyDownHandler = (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\n/**\n * A highly customizable scroll-to-top button component with extensive styling options and accessibility features.\n * Provides comprehensive customization for appearance, behavior, and event handling while maintaining keyboard navigation support.\n */\nexport const ToTopButton = forwardRef<HTMLButtonElement, ToTopButtonProps>(\n ({ className, 'aria-label': ariaLabel, onClick, disabled = false, customization, ...props }, ref) => {\n const labels = useNovaConnectLabels();\n\n // Extract custom components and handlers\n const { Icon = DefaultIcon, Content = DefaultContent } = customization?.components ?? {};\n\n const {\n onClick: customOnClickHandler = defaultClickHandler,\n onKeyDown: customOnKeyDownHandler = defaultKeyDownHandler,\n } = customization?.handlers ?? {};\n\n // Handle click events\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n const originalHandler = (e: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent default scroll behavior if custom handler provided\n if (onClick) {\n e.preventDefault();\n onClick(e);\n }\n };\n\n customOnClickHandler(originalHandler, event);\n },\n [onClick, customOnClickHandler],\n );\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n const originalHandler = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // Handle keyboard activation\n if ((e.key === 'Enter' || e.key === ' ') && onClick) {\n e.preventDefault();\n // Create a synthetic mouse event for onClick compatibility\n const syntheticEvent = {\n ...e,\n button: 0,\n buttons: 1,\n clientX: 0,\n clientY: 0,\n movementX: 0,\n movementY: 0,\n offsetX: 0,\n offsetY: 0,\n pageX: 0,\n pageY: 0,\n relatedTarget: null,\n screenX: 0,\n screenY: 0,\n x: 0,\n y: 0,\n getModifierState: () => false,\n initMouseEvent: () => {},\n };\n // eslint-disable-next-line\n onClick(syntheticEvent as any);\n }\n };\n\n customOnKeyDownHandler(originalHandler, event);\n },\n [onClick, customOnKeyDownHandler],\n );\n\n // Generate button classes\n const buttonClasses = useMemo(() => {\n if (customization?.classNames?.button) {\n return customization.classNames.button({ disabled, hasOnClick: Boolean(onClick) });\n }\n\n return cn(\n 'novacon:flex novacon:w-full novacon:h-6 novacon:items-center novacon:justify-center',\n 'novacon:bg-[var(--tuwa-bg-secondary)] novacon:text-[var(--tuwa-text-primary)]',\n 'novacon:transition-colors novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-bg-tertiary)] novacon:hover:text-[var(--tuwa-text-secondary)]',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-text-accent)] novacon:focus:ring-inset',\n 'novacon:active:bg-[var(--tuwa-bg-quaternary)]',\n 'novacon:disabled:opacity-50 novacon:disabled:cursor-not-allowed novacon:disabled:hover:bg-[var(--tuwa-bg-secondary)]',\n onClick ? 'novacon:cursor-pointer' : 'novacon:cursor-default',\n className,\n );\n }, [customization, disabled, onClick, className]);\n\n // Generate icon classes\n const iconClasses = useMemo(() => {\n if (customization?.classNames?.icon) {\n return customization.classNames.icon({ disabled });\n }\n\n return undefined; // Let DefaultIcon handle its own classes\n }, [customization, disabled]);\n\n // Generate button styles\n const buttonStyles = useMemo(() => {\n if (customization?.styles?.button) {\n return customization.styles.button({ disabled, hasOnClick: Boolean(onClick) });\n }\n\n return undefined;\n }, [customization, disabled, onClick]);\n\n // Generate icon styles\n const iconStyles = useMemo(() => {\n if (customization?.styles?.icon) {\n return customization.styles.icon({ disabled });\n }\n\n return undefined;\n }, [customization, disabled]);\n\n // Create icon element\n const iconElement = useMemo(\n () => <Icon disabled={disabled} className={iconClasses} style={iconStyles} aria-hidden />,\n [Icon, disabled, iconClasses, iconStyles],\n );\n\n // Merge button props\n const buttonProps = useMemo(\n () => ({\n ...customization?.buttonProps,\n ...props,\n ref,\n type: 'button' as const,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n disabled,\n className: buttonClasses,\n style: { ...buttonStyles, ...customization?.buttonProps?.style, ...props.style },\n 'aria-label': ariaLabel || labels.scrollToTop,\n title: ariaLabel || labels.scrollToTop,\n }),\n [\n customization?.buttonProps,\n props,\n ref,\n handleClick,\n handleKeyDown,\n disabled,\n buttonClasses,\n buttonStyles,\n ariaLabel,\n labels.scrollToTop,\n ],\n );\n\n return (\n <button {...buttonProps}>\n <Content icon={iconElement} disabled={disabled} ariaLabel={ariaLabel} />\n </button>\n );\n },\n);\n\nToTopButton.displayName = 'ToTopButton';\n","/**\n * @file Animated select content component with comprehensive customization capabilities.\n * @module SelectContentAnimated\n */\n\nimport * as Select from '@radix-ui/react-select';\nimport { cn } from '@tuwaio/nova-core';\nimport { AnimatePresence, type Easing, motion } from 'framer-motion';\nimport { type ComponentPropsWithoutRef, type ElementRef, forwardRef, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\nimport { ToBottomButton, type ToBottomButtonCustomization } from './ToBottomButton';\nimport { ToTopButton, type ToTopButtonCustomization } from './ToTopButton';\n\n/**\n * Props for the SelectContentAnimated component\n */\nexport interface SelectContentAnimatedProps extends ComponentPropsWithoutRef<typeof Select.Content> {\n /** Custom CSS classes to apply to the select content container (added to defaults) */\n className?: string;\n /** Custom CSS classes to apply to the animated inner content (added to defaults) */\n contentClassName?: string;\n /** Custom CSS classes to apply to the viewport (added to defaults) */\n viewportClassName?: string;\n /** ARIA label for the select content */\n 'aria-label'?: string;\n /** Whether the select content should have reduced motion for accessibility */\n reduceMotion?: boolean;\n /** Maximum height for the content in pixels */\n maxHeight?: number;\n /** Custom animation duration in seconds */\n animationDuration?: number;\n /** Whether to show scroll buttons */\n showScrollButtons?: boolean;\n /** Custom props for the ToTopButton */\n topButtonProps?: Omit<ComponentPropsWithoutRef<typeof ToTopButton>, 'ref'>;\n /** Custom props for the ToBottomButton */\n bottomButtonProps?: Omit<ComponentPropsWithoutRef<typeof ToBottomButton>, 'ref'>;\n /** Customization options for ToTopButton */\n topButtonCustomization?: ToTopButtonCustomization;\n /** Customization options for ToBottomButton */\n bottomButtonCustomization?: ToBottomButtonCustomization;\n /** Custom inline styles for select content container */\n style?: React.CSSProperties;\n /** Custom inline styles for animated inner content */\n contentStyle?: React.CSSProperties;\n /** Custom inline styles for viewport */\n viewportStyle?: React.CSSProperties;\n}\n\n/**\n * Animated select content component with smooth enter/exit animations.\n *\n * This component provides animated dropdown content for select components\n * with accessibility support and extensive customization capabilities.\n *\n * Features:\n * - Smooth enter/exit animations with Framer Motion\n * - Accessibility-first design with ARIA support\n * - Fully customizable scroll buttons with ToTopButton/ToBottomButton\n * - Reduced motion support for accessibility\n * - Customizable max height and animation duration\n * - Full control over styling via className props (additive, not replacement)\n * - Separate styling for container, content, and viewport\n * - Custom button props and customization options\n *\n * @example Basic usage\n * ```tsx\n * <Select.Root>\n * <Select.Trigger>Select an option</Select.Trigger>\n * <SelectContentAnimated>\n * <Select.Item value=\"option1\">Option 1</Select.Item>\n * <Select.Item value=\"option2\">Option 2</Select.Item>\n * </SelectContentAnimated>\n * </Select.Root>\n * ```\n *\n * @example With full customization\n * ```tsx\n * <SelectContentAnimated\n * className=\"novacon:shadow-2xl novacon:border-2\"\n * contentClassName=\"novacon:p-4 novacon:bg-gradient-to-b\"\n * viewportClassName=\"novacon:scrollbar-thin\"\n * maxHeight={400}\n * animationDuration={0.3}\n * reduceMotion={false}\n * showScrollButtons={true}\n * topButtonProps={{\n * className: \"novacon:bg-blue-500\",\n * onClick: () => console.log(\"Top button clicked\"),\n * }}\n * topButtonCustomization={{\n * classNames: {\n * button: () => \"novacon:bg-red-500 novacon:hover:bg-red-600\",\n * },\n * }}\n * bottomButtonCustomization={{\n * components: {\n * Icon: ({ className }) => <div className={className}>⬇️</div>,\n * },\n * }}\n * >\n * <Select.Item value=\"item1\">Item 1</Select.Item>\n * </SelectContentAnimated>\n * ```\n */\nexport const SelectContentAnimated = forwardRef<ElementRef<typeof Select.Content>, SelectContentAnimatedProps>(\n (\n {\n className,\n contentClassName,\n viewportClassName,\n children,\n position = 'popper',\n 'aria-label': ariaLabel,\n reduceMotion = false,\n maxHeight = 300,\n animationDuration = 0.2,\n showScrollButtons = true,\n topButtonProps,\n bottomButtonProps,\n topButtonCustomization,\n bottomButtonCustomization,\n style,\n contentStyle,\n viewportStyle,\n ...props\n },\n forwardedRef,\n ) => {\n const labels = useNovaConnectLabels();\n\n // Memoize animation configuration based on reduce motion preference\n const animationConfig = useMemo(() => {\n if (reduceMotion) {\n return {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.15, layout: { duration: 0 } },\n };\n }\n\n return {\n initial: { opacity: 0, scaleY: 0.8, y: -5 },\n animate: { opacity: 1, scaleY: 1, y: 0 },\n exit: { opacity: 0, scaleY: 0.8, y: -5 },\n transition: {\n duration: animationDuration,\n ease: 'easeOut' as Easing,\n layout: {\n duration: 0.15,\n ease: 'easeOut' as Easing,\n },\n },\n };\n }, [reduceMotion, animationDuration]);\n\n // Memoize content container classes (additive approach)\n const contentClasses = useMemo(\n () =>\n cn(\n // Default styles always applied\n 'novacon:p-1 novacon:bg-[var(--tuwa-bg-secondary)] novacon:rounded-lg novacon:shadow-xl',\n 'novacon:ring-1 novacon:ring-[var(--tuwa-border-primary)] novacon:overflow-hidden',\n // Custom classes added to defaults\n contentClassName,\n ),\n [contentClassName],\n );\n\n // Memoize select content classes (additive approach)\n const selectContentClasses = useMemo(\n () =>\n cn(\n // Default styles always applied\n 'novacon:overflow-hidden',\n 'novacon:w-[--radix-select-trigger-width]',\n 'novacon:data-[state=open]:animate-in novacon:data-[state=closed]:animate-out',\n 'novacon:data-[state=closed]:fade-out-0 novacon:data-[state=open]:fade-in-0',\n 'novacon:data-[state=closed]:zoom-out-95 novacon:data-[state=open]:zoom-in-95',\n 'novacon:data-[side=bottom]:slide-in-from-top-2 novacon:data-[side=left]:slide-in-from-right-2',\n 'novacon:data-[side=right]:slide-in-from-left-2 novacon:data-[side=top]:slide-in-from-bottom-2',\n // Custom classes added to defaults\n className,\n ),\n [className],\n );\n\n // Memoize viewport classes (additive approach)\n const viewportClasses = useMemo(\n () =>\n cn(\n // Default viewport styles (minimal by default)\n '',\n // Custom classes added\n viewportClassName,\n ),\n [viewportClassName],\n );\n\n // Memoize inline styles for containers\n const selectContentStyles = useMemo(\n () => ({\n // Apply maxHeight as inline style (can be overridden by style prop)\n maxHeight: `${maxHeight}px`,\n // Merge with custom styles (custom styles take precedence)\n ...style,\n }),\n [maxHeight, style],\n );\n\n const contentStyles = useMemo(\n () => ({\n // Custom content styles\n ...contentStyle,\n }),\n [contentStyle],\n );\n\n const viewportStyles = useMemo(\n () => ({\n // Custom viewport styles\n ...viewportStyle,\n }),\n [viewportStyle],\n );\n\n // Generate ARIA label\n const finalAriaLabel = ariaLabel || labels.chainListContainer;\n\n return (\n <Select.Portal>\n <Select.Content\n className={selectContentClasses}\n style={selectContentStyles}\n ref={forwardedRef}\n position={position}\n role=\"listbox\"\n aria-label={finalAriaLabel}\n {...props}\n >\n {/* Scroll to top button - only render if showScrollButtons is true */}\n {showScrollButtons && (\n <Select.ScrollUpButton asChild>\n <ToTopButton customization={topButtonCustomization} {...topButtonProps} />\n </Select.ScrollUpButton>\n )}\n\n {/* Main content viewport */}\n <Select.Viewport role=\"presentation\" className={viewportClasses} style={viewportStyles}>\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n initial={animationConfig.initial}\n animate={animationConfig.animate}\n exit={animationConfig.exit}\n transition={animationConfig.transition}\n className={contentClasses}\n style={contentStyles}\n layout={!reduceMotion}\n role=\"group\"\n aria-live=\"polite\"\n >\n {children}\n </motion.div>\n </AnimatePresence>\n </Select.Viewport>\n\n {/* Scroll to bottom button - only render if showScrollButtons is true */}\n {showScrollButtons && (\n <Select.ScrollDownButton asChild>\n <ToBottomButton customization={bottomButtonCustomization} {...bottomButtonProps} />\n </Select.ScrollDownButton>\n )}\n </Select.Content>\n </Select.Portal>\n );\n },\n);\n\nSelectContentAnimated.displayName = 'SelectContentAnimated';\n","/**\n * @file Highly customizable scrollable chain list with comprehensive styling and behavior control.\n * @module ScrollableChainList\n */\n\nimport {\n AnimatePresence,\n type AnyResolvedKeyframe,\n type LegacyAnimationControls,\n motion,\n type TargetAndTransition,\n type Transition,\n type VariantLabels,\n} from 'framer-motion';\nimport React, { type ComponentType, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\nimport { ToBottomButton, type ToBottomButtonCustomization } from '../ToBottomButton';\nimport { ToTopButton, type ToTopButtonCustomization } from '../ToTopButton';\nimport { ChainListRenderer, type ChainListRendererCustomization } from './ChainListRenderer';\n\n// === TYPES AND INTERFACES ===\n\n/**\n * Chain data structure returned by getChainData function\n */\ninterface ChainData {\n formattedChainId: string | number;\n chain: string | number;\n}\n\n/**\n * Scroll button state context\n */\ninterface ScrollButtonContext {\n showTopButton: boolean;\n showBottomButton: boolean;\n isScrolling: boolean;\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n}\n\n/**\n * Props for custom scroll container component\n */\ninterface CustomScrollContainerProps {\n children: ReactNode;\n ref: React.RefObject<HTMLDivElement | null>;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n role: string;\n 'aria-label': string;\n tabIndex: number;\n}\n\n/**\n * Props for custom wrapper component\n */\ninterface CustomWrapperProps {\n children: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n role: string;\n 'aria-label': string;\n}\n\n/**\n * Props for custom button animations wrapper\n */\ninterface CustomButtonAnimationWrapperProps {\n children: ReactNode;\n isVisible: boolean;\n position: 'top' | 'bottom';\n animationKey: string;\n}\n\n/**\n * Animation configuration for scroll buttons\n */\ninterface ScrollButtonAnimationConfig {\n initial?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n animate?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n exit?: TargetAndTransition | VariantLabels | LegacyAnimationControls | undefined;\n transition?: Transition<AnyResolvedKeyframe>;\n}\n\n/**\n * Comprehensive customization options for ScrollableChainList\n */\nexport interface ScrollableChainListCustomization {\n /** Custom components */\n components?: {\n /** Custom scroll container component */\n ScrollContainer?: ComponentType<CustomScrollContainerProps>;\n /** Custom wrapper component */\n Wrapper?: ComponentType<CustomWrapperProps>;\n /** Custom button animation wrapper */\n ButtonAnimationWrapper?: ComponentType<CustomButtonAnimationWrapperProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Wrapper classes */\n wrapper?: (params: { itemCount: number; hasScrollableContent: boolean }) => string;\n /** Scroll container classes */\n container?: (params: {\n itemCount: number;\n hasScrollableContent: boolean;\n showTopButton: boolean;\n showBottomButton: boolean;\n }) => string;\n /** Button animation wrapper classes */\n buttonWrapper?: (params: { position: 'top' | 'bottom'; isVisible: boolean }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Wrapper styles */\n wrapper?: (params: { itemCount: number; hasScrollableContent: boolean }) => React.CSSProperties;\n /** Scroll container styles */\n container?: (params: {\n itemCount: number;\n hasScrollableContent: boolean;\n showTopButton: boolean;\n showBottomButton: boolean;\n }) => React.CSSProperties;\n /** Button animation wrapper styles */\n buttonWrapper?: (params: { position: 'top' | 'bottom'; isVisible: boolean }) => React.CSSProperties;\n /** Top button styles */\n topButton?: (params: { isVisible: boolean; context: ScrollButtonContext }) => React.CSSProperties;\n /** Bottom button styles */\n bottomButton?: (params: { isVisible: boolean; context: ScrollButtonContext }) => React.CSSProperties;\n };\n /** Custom event handlers */\n handlers?: {\n /** Custom scroll handler wrapper */\n onScroll?: (originalHandler: () => void, event: Event, context: ScrollButtonContext) => void;\n /** Custom key handler wrapper for container */\n onKeyDown?: (\n originalHandler: (event: React.KeyboardEvent<HTMLDivElement>) => void,\n event: React.KeyboardEvent<HTMLDivElement>,\n context: { scrollContainer: HTMLDivElement | null },\n ) => void;\n /** Custom top button click handler wrapper */\n onTopButtonClick?: (originalHandler: () => void, context: ScrollButtonContext) => void;\n /** Custom bottom button click handler wrapper */\n onBottomButtonClick?: (originalHandler: () => void, context: ScrollButtonContext) => void;\n };\n /** Animation configuration */\n animations?: {\n /** Button animation */\n scrollButtons?: ScrollButtonAnimationConfig;\n };\n /** Scroll behavior configuration */\n scrollBehavior?: {\n /** Scroll behavior type */\n behavior?: ScrollBehavior;\n /** Page scroll percentage (0-1) */\n pageScrollPercentage?: number;\n /** Scroll update throttle in ms */\n updateThrottle?: number;\n /** Enable auto-scroll to active item */\n autoScrollToActive?: boolean;\n };\n /** Button customization */\n buttons?: {\n /** Top button customization */\n topButton?: ToTopButtonCustomization;\n /** Bottom button customization */\n bottomButton?: ToBottomButtonCustomization;\n /** Hide buttons when content fits */\n hideWhenContentFits?: boolean;\n /** Custom button positioning */\n positioning?: {\n /** Top button position offset */\n topOffset?: string | number;\n /** Bottom button position offset */\n bottomOffset?: string | number;\n /** Button z-index */\n zIndex?: number;\n };\n };\n /** Chain list renderer customization */\n chainListRenderer?: ChainListRendererCustomization;\n}\n\n/**\n * Props for the ScrollableChainList component\n */\nexport interface ScrollableChainListProps {\n /** List of chain identifiers to render */\n chainsList: (string | number)[];\n /** Currently selected chain value */\n selectValue: string;\n /** Handler for chain selection changes */\n handleValueChange: (newChainId: string) => void;\n /** Function to get formatted chain data */\n getChainData: (chain: string | number) => ChainData;\n /** Handler called when list should close */\n onClose: () => void;\n /** Custom inline styles for wrapper */\n style?: React.CSSProperties;\n /** Custom inline styles for scroll container */\n containerStyle?: React.CSSProperties;\n /** Comprehensive customization options */\n customization?: ScrollableChainListCustomization;\n /** ARIA label for the wrapper */\n 'aria-label'?: string;\n /** Loading state */\n isLoading?: boolean;\n /** Error state */\n error?: string | null;\n}\n\n// === DEFAULT COMPONENTS ===\n\n/**\n * Default scroll container component\n */\nconst DefaultScrollContainer: React.FC<CustomScrollContainerProps> = React.forwardRef<\n HTMLDivElement,\n CustomScrollContainerProps\n>(({ children, className, style, onKeyDown, ...props }, ref) => (\n <div ref={ref} className={className} style={style} onKeyDown={onKeyDown} {...props}>\n {children}\n </div>\n));\n\nDefaultScrollContainer.displayName = 'DefaultScrollContainer';\n\n/**\n * Default wrapper component\n */\nconst DefaultWrapper: React.FC<CustomWrapperProps> = ({ children, className, style, ...props }) => (\n <div className={className} style={style} {...props}>\n {children}\n </div>\n);\n\n/**\n * Default button animation wrapper\n */\nconst DefaultButtonAnimationWrapper: React.FC<CustomButtonAnimationWrapperProps> = ({\n children,\n isVisible,\n animationKey,\n}) => {\n if (!isVisible) return null;\n\n return (\n <motion.div\n key={animationKey}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n >\n {children}\n </motion.div>\n );\n};\n\n// === MAIN COMPONENT ===\n\n/**\n * Highly customizable scrollable chain list with comprehensive styling and behavior control.\n */\nexport const ScrollableChainList: React.FC<ScrollableChainListProps> = ({\n chainsList,\n selectValue,\n handleValueChange,\n getChainData,\n onClose,\n style,\n containerStyle,\n customization,\n 'aria-label': ariaLabel,\n isLoading = false,\n error = null,\n}) => {\n const labels = useNovaConnectLabels();\n const containerRef = useRef<HTMLDivElement>(null);\n const [showTopButton, setShowTopButton] = useState(false);\n const [showBottomButton, setShowBottomButton] = useState(false);\n const [isScrolling, setIsScrolling] = useState(false);\n const [hasScrollableContent, setHasScrollableContent] = useState(false);\n const [scrollContext, setScrollContext] = useState<ScrollButtonContext>({\n showTopButton: false,\n showBottomButton: false,\n isScrolling: false,\n scrollTop: 0,\n scrollHeight: 0,\n clientHeight: 0,\n });\n\n // Extract customization options with defaults\n const {\n ScrollContainer = DefaultScrollContainer,\n Wrapper = DefaultWrapper,\n ButtonAnimationWrapper = DefaultButtonAnimationWrapper,\n } = customization?.components ?? {};\n\n const scrollBehavior = customization?.scrollBehavior ?? {};\n const buttonConfig = customization?.buttons ?? {};\n const animations = customization?.animations;\n\n // Scroll behavior settings\n const scrollBehaviorType = scrollBehavior.behavior ?? 'smooth';\n const pageScrollPercentage = scrollBehavior.pageScrollPercentage ?? 0.8;\n\n // Update scroll context\n const updateScrollContext = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n setScrollContext({\n showTopButton,\n showBottomButton,\n isScrolling,\n scrollTop,\n scrollHeight,\n clientHeight,\n });\n }, [showTopButton, showBottomButton, isScrolling]);\n\n // Update scroll buttons visibility\n const updateScrollButtons = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const hasContent = scrollHeight > clientHeight;\n\n setHasScrollableContent(hasContent);\n\n if (buttonConfig.hideWhenContentFits && !hasContent) {\n setShowTopButton(false);\n setShowBottomButton(false);\n return;\n }\n\n setShowTopButton(scrollTop > 0);\n setShowBottomButton(scrollTop + clientHeight < scrollHeight - 1);\n\n // Call custom scroll handler if provided\n if (customization?.handlers?.onScroll) {\n customization.handlers.onScroll(() => {}, new Event('scroll'), {\n showTopButton: scrollTop > 0,\n showBottomButton: scrollTop + clientHeight < scrollHeight - 1,\n isScrolling,\n scrollTop,\n scrollHeight,\n clientHeight,\n });\n }\n }, [buttonConfig.hideWhenContentFits, customization, isScrolling]);\n\n // Update context after button states change\n useEffect(() => {\n updateScrollContext();\n }, [updateScrollContext]);\n\n // Setup scroll listeners and observers\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let scrollTimeout: NodeJS.Timeout;\n\n const handleScroll = () => {\n setIsScrolling(true);\n updateScrollButtons();\n\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n setIsScrolling(false);\n }, 150);\n };\n\n updateScrollButtons();\n container.addEventListener('scroll', handleScroll);\n\n const resizeObserver = new ResizeObserver(updateScrollButtons);\n resizeObserver.observe(container);\n\n return () => {\n container.removeEventListener('scroll', handleScroll);\n resizeObserver.disconnect();\n clearTimeout(scrollTimeout);\n };\n }, [chainsList, updateScrollButtons]);\n\n // Scroll to extreme positions\n const scrollToExtreme = useCallback(\n (isTop: boolean) => {\n const container = containerRef.current;\n if (container) {\n container.scrollTo({\n top: isTop ? 0 : container.scrollHeight,\n behavior: scrollBehaviorType,\n });\n }\n },\n [scrollBehaviorType],\n );\n\n // Handle scroll button clicks\n const handleTopButtonClick = useCallback(() => {\n const originalHandler = () => scrollToExtreme(true);\n\n if (customization?.handlers?.onTopButtonClick) {\n customization.handlers.onTopButtonClick(originalHandler, scrollContext);\n } else {\n originalHandler();\n }\n }, [customization, scrollToExtreme, scrollContext]);\n\n const handleBottomButtonClick = useCallback(() => {\n const originalHandler = () => scrollToExtreme(false);\n\n if (customization?.handlers?.onBottomButtonClick) {\n customization.handlers.onBottomButtonClick(originalHandler, scrollContext);\n } else {\n originalHandler();\n }\n }, [customization, scrollToExtreme, scrollContext]);\n\n // Handle keyboard navigation\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const originalHandler = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Handle arrow key navigation within the scrollable area\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Let the ChainListRenderer handle the focus management\n return;\n }\n\n // Handle Page Up/Page Down for large scrolls\n if (e.key === 'PageUp') {\n e.preventDefault();\n const container = containerRef.current;\n if (container) {\n container.scrollBy({\n top: -container.clientHeight * pageScrollPercentage,\n behavior: scrollBehaviorType,\n });\n }\n }\n\n if (e.key === 'PageDown') {\n e.preventDefault();\n const container = containerRef.current;\n if (container) {\n container.scrollBy({\n top: container.clientHeight * pageScrollPercentage,\n behavior: scrollBehaviorType,\n });\n }\n }\n };\n\n if (customization?.handlers?.onKeyDown) {\n customization.handlers.onKeyDown(originalHandler, event, {\n scrollContainer: containerRef.current,\n });\n } else {\n originalHandler(event);\n }\n },\n [customization, pageScrollPercentage, scrollBehaviorType],\n );\n\n // Generate wrapper classes and styles\n const wrapperClasses = useMemo(() => {\n const customClasses = customization?.classNames?.wrapper?.({\n itemCount: chainsList.length,\n hasScrollableContent,\n });\n return customClasses || 'novacon:relative novacon:py-[24px]';\n }, [customization, chainsList.length, hasScrollableContent]);\n\n const wrapperStyles = useMemo(() => {\n const customStyles = customization?.styles?.wrapper?.({\n itemCount: chainsList.length,\n hasScrollableContent,\n });\n return { ...customStyles, ...style };\n }, [customization, chainsList.length, hasScrollableContent, style]);\n\n // Generate container classes and styles\n const containerClasses = useMemo(() => {\n const customClasses = customization?.classNames?.container?.({\n itemCount: chainsList.length,\n hasScrollableContent,\n showTopButton,\n showBottomButton,\n });\n return (\n customClasses ||\n 'NovaCustomScroll novacon:relative novacon:flex novacon:w-full novacon:flex-col novacon:p-2 novacon:gap-1 novacon:max-h-[312px] novacon:overflow-x-hidden novacon:overflow-y-auto'\n );\n }, [customization, chainsList.length, hasScrollableContent, showTopButton, showBottomButton]);\n\n const containerStyles = useMemo(() => {\n const customStyles = customization?.styles?.container?.({\n itemCount: chainsList.length,\n hasScrollableContent,\n showTopButton,\n showBottomButton,\n });\n return { ...customStyles, ...containerStyle };\n }, [customization, chainsList.length, hasScrollableContent, showTopButton, showBottomButton, containerStyle]);\n\n // Generate button styles - now using state instead of accessing refs\n const topButtonStyles = useMemo(() => {\n const customStyles = customization?.styles?.topButton?.({ isVisible: showTopButton, context: scrollContext });\n const positioning = buttonConfig.positioning;\n\n return {\n ...customStyles,\n ...(positioning?.topOffset && { top: positioning.topOffset }),\n ...(positioning?.zIndex && { zIndex: positioning.zIndex }),\n };\n }, [customization, showTopButton, scrollContext, buttonConfig]);\n\n const bottomButtonStyles = useMemo(() => {\n const customStyles = customization?.styles?.bottomButton?.({ isVisible: showBottomButton, context: scrollContext });\n const positioning = buttonConfig.positioning;\n\n return {\n ...customStyles,\n ...(positioning?.bottomOffset && { bottom: positioning.bottomOffset }),\n ...(positioning?.zIndex && { zIndex: positioning.zIndex }),\n };\n }, [customization, showBottomButton, scrollContext, buttonConfig]);\n\n // Button animation wrapper classes and styles\n const topButtonWrapperClasses = useMemo(() => {\n return (\n customization?.classNames?.buttonWrapper?.({ position: 'top', isVisible: showTopButton }) ||\n 'novacon:absolute novacon:top-0 novacon:z-10 novacon:w-full'\n );\n }, [customization, showTopButton]);\n\n const bottomButtonWrapperClasses = useMemo(() => {\n return (\n customization?.classNames?.buttonWrapper?.({ position: 'bottom', isVisible: showBottomButton }) ||\n 'novacon:absolute novacon:bottom-0 novacon:z-10 novacon:w-full'\n );\n }, [customization, showBottomButton]);\n\n const topButtonWrapperStyles = useMemo(() => {\n return customization?.styles?.buttonWrapper?.({ position: 'top', isVisible: showTopButton });\n }, [customization, showTopButton]);\n\n const bottomButtonWrapperStyles = useMemo(() => {\n return customization?.styles?.buttonWrapper?.({ position: 'bottom', isVisible: showBottomButton });\n }, [customization, showBottomButton]);\n\n // Create button animation wrapper with custom animations\n const createButtonWrapper = useCallback(\n (\n children: ReactNode,\n isVisible: boolean,\n position: 'top' | 'bottom',\n wrapperClasses: string,\n wrapperStyles?: React.CSSProperties,\n ) => {\n const animationConfig = animations?.scrollButtons;\n const animationKey = `${position}-button`;\n\n const wrapperElement = (\n <div className={wrapperClasses} style={wrapperStyles}>\n {children}\n </div>\n );\n\n return (\n <ButtonAnimationWrapper isVisible={isVisible} position={position} animationKey={animationKey}>\n {animationConfig ? <motion.div {...animationConfig}>{wrapperElement}</motion.div> : wrapperElement}\n </ButtonAnimationWrapper>\n );\n },\n [animations, ButtonAnimationWrapper],\n );\n\n return (\n <Wrapper\n className={wrapperClasses}\n style={wrapperStyles}\n role=\"region\"\n aria-label={ariaLabel || labels.chainListContainer}\n >\n <AnimatePresence>\n {createButtonWrapper(\n <ToTopButton\n onClick={handleTopButtonClick}\n aria-label={labels.scrollToTop}\n className=\"novacon:w-full\"\n customization={buttonConfig.topButton}\n style={topButtonStyles}\n />,\n showTopButton,\n 'top',\n topButtonWrapperClasses,\n topButtonWrapperStyles,\n )}\n </AnimatePresence>\n\n <ScrollContainer\n ref={containerRef}\n className={containerClasses}\n style={containerStyles}\n role=\"listbox\"\n aria-label={labels.selectChain}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n <ChainListRenderer\n chainsList={chainsList}\n selectValue={selectValue}\n handleValueChange={handleValueChange}\n getChainData={getChainData}\n onClose={onClose}\n isMobile={true}\n isLoading={isLoading}\n error={error}\n customization={customization?.chainListRenderer}\n />\n </ScrollContainer>\n\n <AnimatePresence>\n {createButtonWrapper(\n <ToBottomButton\n onClick={handleBottomButtonClick}\n aria-label={labels.scrollToBottom}\n className=\"novacon:w-full\"\n customization={buttonConfig.bottomButton}\n style={bottomButtonStyles}\n />,\n showBottomButton,\n 'bottom',\n bottomButtonWrapperClasses,\n bottomButtonWrapperStyles,\n )}\n </AnimatePresence>\n </Wrapper>\n );\n};\n","/**\n * @file This file contains the `WalletAvatar` component, a customizable user avatar renderer with ENS support and blockie fallback.\n */\n\nimport { cn } from '@tuwaio/nova-core';\nimport makeBlockie from 'ethereum-blockies-base64';\nimport { ComponentPropsWithoutRef, ComponentType, forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomLoadingOverlayProps = {\n isLoading: boolean;\n showLoading: boolean;\n disableAnimation: boolean;\n size: WalletAvatarSize;\n};\n\ntype CustomAvatarImageProps = {\n src: string;\n isLoading: boolean;\n onLoad: () => void;\n onError: (event: React.SyntheticEvent<HTMLImageElement, Event>) => void;\n address: string;\n ensAvatar?: string | null;\n size: WalletAvatarSize;\n};\n\ntype CustomFallbackContentProps = {\n address: string;\n formattedAddress: string;\n size: WalletAvatarSize;\n};\n\nexport type WalletAvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Customization options for WalletAvatar component\n */\nexport type WalletAvatarCustomization = {\n /** Override container element props */\n containerProps?: Partial<ComponentPropsWithoutRef<'div'>>;\n /** Override image element props */\n imageProps?: Partial<ComponentPropsWithoutRef<'img'>>;\n /** Custom components */\n components?: {\n /** Custom loading overlay component */\n LoadingOverlay?: ComponentType<CustomLoadingOverlayProps>;\n /** Custom avatar image component */\n AvatarImage?: ComponentType<CustomAvatarImageProps>;\n /** Custom fallback content component for extreme error cases */\n FallbackContent?: ComponentType<CustomFallbackContentProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Function to generate container classes */\n container?: (params: { size: WalletAvatarSize; bgColor: string; address: string }) => string;\n /** Function to generate loading overlay classes */\n loadingOverlay?: (params: { isLoading: boolean; showLoading: boolean; disableAnimation: boolean }) => string;\n /** Function to generate image classes */\n image?: (params: { isLoading: boolean; size: WalletAvatarSize; hasError: boolean }) => string;\n /** Function to generate fallback content classes */\n fallbackContent?: (params: { size: WalletAvatarSize; address: string }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Function to generate container styles */\n container?: (params: { bgColor: string; size: WalletAvatarSize; address: string }) => React.CSSProperties;\n };\n /** Custom utilities */\n utils?: {\n /** Custom blockie generator function */\n generateBlockie?: (address: string) => string | null;\n /** Custom background color generator function */\n generateBgColor?: (address: string) => string;\n /** Custom address formatter function */\n formatAddress?: (address: string, labels: any) => string;\n };\n};\n\nexport interface WalletAvatarProps extends Omit<ComponentPropsWithoutRef<'div'>, 'role'> {\n /** The user's wallet address, used for the blockie fallback and background color. */\n address: string;\n /** An optional URL for the user's ENS avatar image. */\n ensAvatar?: string | null;\n /** Custom alt text for the avatar image */\n altText?: string;\n /** Size variant for the avatar */\n size?: WalletAvatarSize;\n /** Whether to show loading animation */\n showLoading?: boolean;\n /** Callback fired when image loads successfully */\n onImageLoad?: () => void;\n /** Callback fired when image fails to load */\n onImageError?: (error: Event) => void;\n /** Whether to disable the pulse animation */\n disableAnimation?: boolean;\n /** Customization options */\n customization?: WalletAvatarCustomization;\n}\n\n// --- Utility Functions ---\nfunction isHex(value: unknown, { strict = true }: { strict?: boolean | undefined } = {}): value is `0x${string}` {\n if (!value) return false;\n if (typeof value !== 'string') return false;\n return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x');\n}\n\nconst zeroAddress = '0x0000000000000000000000000000000000000000';\n\n// Size mapping for different avatar sizes\nconst sizeClasses = {\n sm: 'novacon:h-4 novacon:w-4',\n md: 'novacon:h-6 novacon:w-6',\n lg: 'novacon:h-8 novacon:w-8',\n xl: 'novacon:h-12 novacon:w-12',\n} as const;\n\n// --- Default Sub-Components ---\nconst DefaultLoadingOverlay = ({ isLoading, showLoading, disableAnimation }: CustomLoadingOverlayProps) => {\n const loadingClasses = cn(\n 'novacon:absolute novacon:inset-0 novacon:rounded-full novacon:bg-[var(--tuwa-bg-muted)]',\n !disableAnimation && showLoading && isLoading && 'novacon:animate-pulse',\n (!isLoading || !showLoading) && 'novacon:opacity-0',\n 'novacon:transition-opacity novacon:duration-300',\n );\n\n return <div className={loadingClasses} aria-hidden=\"true\" />;\n};\n\nconst DefaultAvatarImage = ({ src, isLoading, onLoad, onError, address, ensAvatar }: CustomAvatarImageProps) => {\n return (\n <img\n key={`${ensAvatar || 'blockie'}-${address}`}\n className={cn(\n 'novacon:h-full novacon:w-full novacon:rounded-full novacon:object-cover novacon:relative novacon:z-10',\n 'novacon:transition-opacity novacon:duration-300',\n isLoading ? 'novacon:opacity-0' : 'novacon:opacity-100',\n )}\n src={src}\n alt=\"\"\n onLoad={onLoad}\n onError={onError}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n );\n};\n\nconst DefaultFallbackContent = ({ formattedAddress }: CustomFallbackContentProps) => {\n return (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:flex novacon:items-center novacon:justify-center novacon:text-white novacon:text-xs novacon:font-mono\"\n aria-hidden=\"true\"\n >\n {formattedAddress.slice(0, 2)}\n </div>\n );\n};\n\n// --- Default Utility Functions ---\nconst defaultGenerateBlockie = (address: string): string | null => {\n try {\n return makeBlockie(isHex(address) ? address : zeroAddress);\n } catch (error) {\n console.warn('Failed to generate blockie for address:', address, error);\n return null;\n }\n};\n\nconst defaultGenerateBgColor = (address: string): string => {\n try {\n if (!isHex(address)) return '#6B7280';\n const colorHex = address.slice(2, 8);\n return colorHex.length === 6 ? `#${colorHex}` : '#6B7280';\n } catch {\n return '#6B7280';\n }\n};\n\nconst defaultFormatAddress = (address: string, labels: any): string => {\n if (!address) return labels.unknownWallet;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n};\n\n/**\n * A highly customizable wallet avatar component with ENS support, blockie fallback, and extensive styling options.\n * Provides comprehensive customization for container, image, loading states, and fallback content while maintaining accessibility.\n */\nexport const WalletAvatar = forwardRef<HTMLDivElement, WalletAvatarProps>(\n (\n {\n address,\n ensAvatar,\n className,\n altText,\n size = 'md',\n showLoading = true,\n onImageLoad,\n onImageError,\n disableAnimation = false,\n customization,\n ...props\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n\n // State management\n const [imageSrc, setImageSrc] = useState<string | null>(ensAvatar ?? null);\n const [isLoading, setIsLoading] = useState(Boolean(ensAvatar));\n const [hasError, setHasError] = useState(false);\n\n // Extract custom components and utilities\n const {\n LoadingOverlay = DefaultLoadingOverlay,\n AvatarImage = DefaultAvatarImage,\n FallbackContent = DefaultFallbackContent,\n } = customization?.components ?? {};\n\n const {\n generateBlockie = defaultGenerateBlockie,\n generateBgColor = defaultGenerateBgColor,\n formatAddress = defaultFormatAddress,\n } = customization?.utils ?? {};\n\n // Generate blockie using custom or default function\n const blockie = useMemo(() => generateBlockie(address), [address, generateBlockie]);\n\n // Generate background color using custom or default function\n const bgColor = useMemo(() => generateBgColor(address), [address, generateBgColor]);\n\n // Format address using custom or default function\n const formattedAddress = useMemo(() => formatAddress(address, labels), [address, labels, formatAddress]);\n\n // Generate alt text for accessibility\n const imageAltText = useMemo(() => {\n if (altText) return altText;\n if (hasError || !ensAvatar) {\n return `${labels.walletAvatar} ${formattedAddress}`;\n }\n return `${labels.ensAvatar} ${formattedAddress}`;\n }, [altText, hasError, ensAvatar, formattedAddress, labels.walletAvatar, labels.ensAvatar]);\n\n // Reset image source when ensAvatar changes\n const currentEnsAvatar = useMemo(() => ensAvatar ?? null, [ensAvatar]);\n\n useMemo(() => {\n setImageSrc(currentEnsAvatar);\n setIsLoading(Boolean(currentEnsAvatar));\n setHasError(false);\n }, [currentEnsAvatar]);\n\n // Handle image load success\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n setHasError(false);\n onImageLoad?.();\n }, [onImageLoad]);\n\n // Handle image load error\n const handleImageError = useCallback(\n (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false);\n setHasError(true);\n setImageSrc(blockie);\n onImageError?.(event.nativeEvent);\n },\n [blockie, onImageError],\n );\n\n // Generate container classes\n const containerClasses = useMemo(() => {\n if (customization?.classNames?.container) {\n return customization.classNames.container({ size, bgColor, address });\n }\n\n return cn(\n sizeClasses[size],\n 'novacon:flex-shrink-0 novacon:rounded-full novacon:relative novacon:overflow-hidden',\n 'novacon:ring-1 novacon:ring-[var(--tuwa-border-primary)]',\n 'novacon:focus-within:ring-2 novacon:focus-within:ring-[var(--tuwa-text-accent)]',\n className,\n );\n }, [customization?.classNames?.container, size, bgColor, address, className]);\n\n // Generate container styles\n const containerStyles = useMemo(() => {\n const baseStyles = { backgroundColor: bgColor };\n if (customization?.styles?.container) {\n return {\n ...baseStyles,\n ...customization.styles.container({ bgColor, size, address }),\n };\n }\n return baseStyles;\n }, [customization?.styles?.container, bgColor, size, address]);\n\n // Get current image source with fallback\n const currentImageSrc = imageSrc || blockie || '';\n\n // Merge container props\n const containerProps = useMemo(\n () => ({\n ...customization?.containerProps,\n ...props,\n ref,\n className: containerClasses,\n style: { ...containerStyles, ...customization?.containerProps?.style, ...props.style },\n role: 'img' as const,\n 'aria-label': imageAltText,\n title: imageAltText,\n }),\n [customization?.containerProps, props, ref, containerClasses, containerStyles, imageAltText],\n );\n\n return (\n <div {...containerProps}>\n {/* Loading overlay */}\n <LoadingOverlay\n isLoading={isLoading}\n showLoading={showLoading}\n disableAnimation={disableAnimation}\n size={size}\n />\n\n {/* Avatar image */}\n {currentImageSrc && (\n <AvatarImage\n src={currentImageSrc}\n isLoading={isLoading}\n onLoad={handleImageLoad}\n onError={handleImageError}\n address={address}\n ensAvatar={ensAvatar}\n size={size}\n />\n )}\n\n {/* Fallback content for extreme error cases */}\n {!currentImageSrc && <FallbackContent address={address} formattedAddress={formattedAddress} size={size} />}\n </div>\n );\n },\n);\n\nWalletAvatar.displayName = 'WalletAvatar';\n","/**\n * @file This file contains the `WalletIcon` component, a customizable wallet icon renderer with fallback support.\n */\n\nimport { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { cn } from '@tuwaio/nova-core';\nimport { formatWalletName } from '@tuwaio/orbit-core';\nimport { ComponentPropsWithoutRef, ComponentType, forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomLoadingOverlayProps = {\n size: number;\n isLoading: boolean;\n};\n\ntype CustomErrorIndicatorProps = {\n walletName: string;\n hasError: boolean;\n};\n\ntype CustomFallbackIconProps = {\n walletName: string;\n size: number;\n className?: string;\n style?: React.CSSProperties;\n};\n\n/**\n * Customization options for WalletIcon component\n */\nexport type WalletIconCustomization = {\n /** Override container element props */\n containerProps?: Partial<ComponentPropsWithoutRef<'div'>>;\n /** Override image element props */\n imageProps?: Partial<ComponentPropsWithoutRef<'img'>>;\n /** Custom components */\n components?: {\n /** Custom loading overlay component */\n LoadingOverlay?: ComponentType<CustomLoadingOverlayProps>;\n /** Custom error indicator component (only shown in development) */\n ErrorIndicator?: ComponentType<CustomErrorIndicatorProps>;\n /** Custom fallback icon component */\n FallbackIcon?: ComponentType<CustomFallbackIconProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Function to generate container classes */\n container?: (params: { isLoading: boolean; showLoading: boolean; size: number }) => string;\n /** Function to generate image classes */\n image?: (params: { isLoading: boolean; showLoading: boolean; hasError: boolean }) => string;\n };\n};\n\nexport interface WalletIconProps extends Omit<ComponentPropsWithoutRef<'div'>, 'role'> {\n /** Custom icon URL for the wallet */\n icon?: string;\n /** Name of the wallet */\n name: string;\n /** Size of the icon in pixels */\n size?: number;\n /** Custom alt text for the icon */\n altText?: string;\n /** Whether to show loading state */\n showLoading?: boolean;\n /** Callback fired when image loads successfully */\n onImageLoad?: () => void;\n /** Callback fired when image fails to load */\n onImageError?: () => void;\n /** Enable lazy loading for non-critical images */\n lazy?: boolean;\n /** Customization options */\n customization?: WalletIconCustomization;\n}\n\n// --- Default Sub-Components ---\nconst DefaultLoadingOverlay = ({ isLoading }: CustomLoadingOverlayProps) => {\n if (!isLoading) return null;\n\n return (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:bg-[var(--tuwa-bg-muted)] novacon:animate-pulse novacon:rounded-full\"\n aria-hidden=\"true\"\n />\n );\n};\n\nconst DefaultErrorIndicator = ({ walletName, hasError }: CustomErrorIndicatorProps) => {\n if (!hasError || process.env.NODE_ENV !== 'development') return null;\n\n return (\n <div\n className=\"novacon:absolute novacon:top-0 novacon:right-0 novacon:w-2 novacon:h-2 novacon:bg-red-500 novacon:rounded-full\"\n title={`Failed to load icon for ${walletName}`}\n aria-hidden=\"true\"\n />\n );\n};\n\nconst DefaultFallbackIcon = ({ walletName, className, style }: CustomFallbackIconProps) => {\n return <Web3Icon walletKey={walletName} className={cn('novacon:flex-shrink-0', className)} style={style} />;\n};\n\n/**\n * A highly customizable wallet icon component with loading states, error handling, and fallback support.\n * Provides extensive customization options for container, image, and sub-components while maintaining accessibility.\n */\nexport const WalletIcon = forwardRef<HTMLDivElement, WalletIconProps>(\n (\n {\n icon,\n name,\n size = 32,\n className,\n altText,\n showLoading = false,\n onImageLoad,\n onImageError,\n lazy = false,\n customization,\n ...props\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n const [hasError, setHasError] = useState(false);\n const [isLoading, setIsLoading] = useState(Boolean(icon));\n\n // Extract custom components\n const {\n LoadingOverlay = DefaultLoadingOverlay,\n ErrorIndicator = DefaultErrorIndicator,\n FallbackIcon = DefaultFallbackIcon,\n } = customization?.components ?? {};\n\n // Format wallet name for consistency\n const walletName = useMemo(() => formatWalletName(name), [name]);\n\n // Generate alt text for accessibility\n const imageAltText = useMemo(() => {\n if (altText) return altText;\n return `${walletName} ${labels.walletIcon}`;\n }, [altText, walletName, labels.walletIcon]);\n\n // Clean and validate icon URL\n const cleanIconUrl = useMemo(() => {\n if (!icon) return null;\n\n try {\n const trimmedIcon = icon.trim();\n if (!trimmedIcon) return null;\n\n // Basic URL validation\n if (\n trimmedIcon.startsWith('http://') ||\n trimmedIcon.startsWith('https://') ||\n trimmedIcon.startsWith('/') ||\n trimmedIcon.startsWith('data:')\n ) {\n return trimmedIcon;\n }\n\n return null;\n } catch {\n return null;\n }\n }, [icon]);\n\n // Handle image load success\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n setHasError(false);\n onImageLoad?.();\n }, [onImageLoad]);\n\n // Handle image load error\n const handleImageError = useCallback(() => {\n setIsLoading(false);\n setHasError(true);\n onImageError?.();\n }, [onImageError]);\n\n // Generate container classes\n const containerClasses = useMemo(() => {\n if (customization?.classNames?.container) {\n return customization.classNames.container({ isLoading, showLoading, size });\n }\n\n return cn(\n 'novacon:relative novacon:inline-flex novacon:items-center novacon:justify-center novacon:flex-shrink-0',\n 'novacon:overflow-hidden',\n showLoading && isLoading && 'novacon:animate-pulse novacon:bg-[var(--tuwa-bg-muted)]',\n className,\n );\n // eslint-disable-next-line\n }, [customization?.classNames?.container, isLoading, showLoading, size, className]);\n\n // Generate image classes\n const imageClasses = useMemo(() => {\n if (customization?.classNames?.image) {\n return customization.classNames.image({ isLoading, showLoading, hasError });\n }\n\n return cn(\n 'novacon:object-cover novacon:transition-opacity novacon:duration-200',\n 'novacon:max-w-full novacon:max-h-full',\n isLoading && showLoading ? 'novacon:opacity-0' : 'novacon:opacity-100',\n );\n // eslint-disable-next-line\n }, [customization?.classNames?.image, isLoading, showLoading, hasError]);\n\n // Image style object\n const imageStyle = useMemo(\n () => ({\n width: size,\n height: size,\n }),\n [size],\n );\n\n // Merge container props\n const containerProps = useMemo(\n () => ({\n ...customization?.containerProps,\n ...props,\n ref,\n className: containerClasses,\n role: 'img' as const,\n 'aria-label': imageAltText,\n title: imageAltText,\n style: { lineHeight: 0, ...customization?.containerProps?.style, ...props.style },\n }),\n [customization?.containerProps, props, ref, containerClasses, imageAltText],\n );\n\n // Merge image props\n const imageProps = useMemo(\n () => ({\n ...customization?.imageProps,\n src: cleanIconUrl!,\n alt: '', // Empty alt since parent div has role=\"img\" and aria-label\n className: cn(imageClasses, customization?.imageProps?.className),\n style: { ...imageStyle, ...customization?.imageProps?.style },\n onLoad: handleImageLoad,\n onError: handleImageError,\n loading: (lazy ? 'lazy' : 'eager') as 'lazy' | 'eager',\n decoding: 'async' as const,\n crossOrigin: 'anonymous' as const,\n referrerPolicy: 'no-referrer' as const,\n }),\n [customization?.imageProps, cleanIconUrl, imageClasses, imageStyle, handleImageLoad, handleImageError, lazy],\n );\n\n return (\n <div {...containerProps}>\n {/* Loading overlay */}\n <LoadingOverlay size={size} isLoading={showLoading && isLoading} />\n\n {/* Custom icon with error fallback */}\n {cleanIconUrl && !hasError ? (\n <img {...imageProps} />\n ) : (\n <FallbackIcon walletName={walletName} size={size} className={imageClasses} style={imageStyle} />\n )}\n\n {/* Error state indicator */}\n <ErrorIndicator walletName={walletName} hasError={hasError} />\n </div>\n );\n },\n);\n\nWalletIcon.displayName = 'WalletIcon';\n","import { Web3Icon } from '@bgd-labs/react-web3-icons';\nimport { ChevronArrowWithAnim, cn } from '@tuwaio/nova-core';\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { forwardRef, useMemo } from 'react';\n\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\nimport { WalletIcon } from '../WalletIcon';\n\n/**\n * Props for the IconButton component\n */\ninterface IconButtonProps {\n /** Custom icon URL for the wallet */\n walletIcon?: string;\n /** Name of the wallet */\n walletName?: string;\n /** Chain ID for the network icon */\n walletChainId?: string | number;\n /** Number of available items/options (shows chevron if > 1) */\n items?: number;\n /** Click handler for the button */\n onClick?: () => void;\n /** Additional CSS classes for styling */\n className?: string;\n /** Whether the button is currently disabled */\n disabled?: boolean;\n /** Whether to show loading state */\n loading?: boolean;\n /** Custom aria-label for accessibility */\n 'aria-label'?: string;\n /** Custom tooltip text */\n title?: string;\n}\n\n/**\n * Multi-purpose icon button component for wallets and chains\n *\n * This component provides a unified interface for displaying wallet and chain information:\n * - Displays wallet icon with fallback to Web3Icon\n * - Shows chain/network icon when chain ID is provided\n * - Conditional chevron arrow for dropdown indicators\n * - Full WCAG accessibility support with proper ARIA labels\n * - Loading and disabled states\n * - Hover and active animations\n * - Responsive design with consistent sizing\n *\n * The button automatically becomes interactive when onClick is provided and items > 1.\n * It supports both EVM chain IDs (numbers) and Solana network identifiers (strings).\n *\n * @param props - Component props for icon button configuration\n * @returns Forwardable button element with icons and accessibility support\n *\n * @example\n * ```tsx\n * // Simple wallet button\n * <IconButton\n * walletName=\"MetaMask\"\n * walletIcon=\"https://example.com/metamask-icon.png\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Interactive chain selector\n * <IconButton\n * walletName=\"Phantom\"\n * walletChainId=\"mainnet-beta\"\n * items={3}\n * onClick={handleChainSelect}\n * aria-label=\"Select blockchain network\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Loading state with disabled interaction\n * <IconButton\n * walletName=\"WalletConnect\"\n * loading={true}\n * disabled={true}\n * title=\"Connecting to wallet...\"\n * />\n * ```\n *\n * @public\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n walletIcon,\n walletName,\n walletChainId,\n items = 0,\n onClick,\n className,\n disabled = false,\n loading = false,\n 'aria-label': ariaLabel,\n title,\n },\n ref,\n ) => {\n const labels = useNovaConnectLabels();\n\n /**\n * Determine if the button should be interactive\n * Button is clickable when onClick is provided, not disabled, not loading, and has multiple items\n */\n const isClickable = useMemo(\n () => Boolean(onClick && !disabled && !loading && items > 1),\n [onClick, disabled, loading, items],\n );\n\n /**\n * Generate chain ID for Web3Icon\n * Handles both EVM (numeric) and Solana (string) chain identifiers\n */\n const formattedChainId = useMemo(() => {\n if (!walletChainId) return undefined;\n\n // If it's a string, assume it's a Solana network identifier\n if (typeof walletChainId === 'string') {\n return `${OrbitAdapter.SOLANA}:${walletChainId}`;\n }\n\n // If it's a number, use it directly as EVM chain ID\n return walletChainId;\n }, [walletChainId]);\n\n /**\n * Generate accessible label for the button\n */\n const accessibleLabel = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n\n const parts: string[] = [];\n\n if (walletName) parts.push(`${walletName} wallet`);\n if (walletChainId) parts.push('network selector');\n if (isClickable) parts.push('button');\n if (loading) parts.push('loading');\n if (disabled) parts.push('disabled');\n\n return parts.join(', ') || 'Wallet controls';\n }, [ariaLabel, walletName, walletChainId, isClickable, loading, disabled]);\n\n /**\n * Generate tooltip text\n */\n const tooltipText = useMemo(() => {\n if (title) return title;\n if (loading) return 'Loading...';\n if (disabled) return 'Button is disabled';\n if (isClickable) return `Click to select ${walletName ? walletName + ' ' : ''}options`;\n return walletName ? `${walletName} wallet` : 'Wallet information';\n }, [title, loading, disabled, isClickable, walletName]);\n\n /**\n * Memoized button classes for performance\n */\n const buttonClasses = useMemo(\n () =>\n cn(\n // Base styles\n 'novacon:flex novacon:items-center novacon:justify-center novacon:gap-1 novacon:rounded-full',\n 'novacon:bg-[var(--tuwa-bg-primary)] novacon:border novacon:border-[var(--tuwa-border-primary)]',\n 'novacon:p-1.5 novacon:transition-all novacon:duration-200',\n\n // Icon sizing\n 'novacon:[&_img]:w-6! novacon:[&_img]:h-6! novacon:[&_img]:transition-transform novacon:[&_img]:duration-200',\n\n // Interactive states\n {\n 'novacon:cursor-pointer novacon:hover:[&_img]:scale-95 novacon:active:[&_img]:scale-85 novacon:hover:shadow-sm':\n isClickable,\n 'novacon:cursor-not-allowed novacon:opacity-50': disabled && !loading,\n 'novacon:cursor-wait novacon:opacity-75': loading,\n 'novacon:cursor-default': !isClickable && !disabled && !loading,\n },\n\n // Focus states for accessibility\n 'novacon:focus-visible:outline-none novacon:focus-visible:ring-2 novacon:focus-visible:ring-[var(--tuwa-border-accent)] novacon:focus-visible:ring-offset-2',\n\n className,\n ),\n [isClickable, disabled, loading, className],\n );\n\n /**\n * Handle button click with safety checks\n */\n const handleClick = () => {\n if (isClickable && onClick) {\n onClick();\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={buttonClasses}\n onClick={handleClick}\n disabled={disabled || loading}\n aria-label={accessibleLabel}\n title={tooltipText}\n role=\"button\"\n tabIndex={disabled || loading ? -1 : 0}\n >\n {/* Wallet icon */}\n {walletName && (\n <WalletIcon\n name={walletName}\n icon={walletIcon}\n altText={`${walletName} ${labels.walletIcon}`}\n showLoading={loading}\n className=\"novacon:flex-shrink-0\"\n />\n )}\n\n {/* Chain/Network icon */}\n {formattedChainId && (\n <Web3Icon chainId={formattedChainId} className=\"novacon:flex-shrink-0\" title={`Network: ${walletChainId}`} />\n )}\n\n {/* Chevron arrow for dropdown indication */}\n {isClickable && <ChevronArrowWithAnim className=\"novacon:flex-shrink-0\" aria-hidden=\"true\" />}\n\n {/* Loading indicator overlay */}\n {loading && (\n <div\n className=\"novacon:absolute novacon:inset-0 novacon:bg-[var(--tuwa-bg-primary)]/50 novacon:rounded-full novacon:flex novacon:items-center novacon:justify-center\"\n aria-hidden=\"true\"\n >\n <div className=\"novacon:w-3 novacon:h-3 novacon:border-2 novacon:border-[var(--tuwa-text-accent)] novacon:border-t-transparent novacon:rounded-full novacon:animate-spin\" />\n </div>\n )}\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { ExclamationTriangleIcon, PuzzlePieceIcon } from '@heroicons/react/24/solid';\nimport { motion } from 'framer-motion';\nimport { Component, lazy, Suspense, useMemo } from 'react';\n\nimport { useNovaConnect } from '../../hooks/useNovaConnect';\nimport { useNovaConnectLabels } from '../../hooks/useNovaConnectLabels';\nimport { ConnectButtonProps } from '../ConnectButton';\n\n/**\n * Props for the ConnectedModalTxHistory component\n */\ninterface ConnectedModalTxHistoryProps extends Pick<ConnectButtonProps, 'transactionPool' | 'pulsarAdapter'> {\n /** Additional CSS classes for the container */\n className?: string;\n}\n\n/**\n * Lazy import of TransactionsHistory component with error handling\n * This allows the component to work even if the @tuwaio/nova-transactions package is not available\n */\nconst TransactionsHistory = lazy(() => {\n try {\n return import('@tuwaio/nova-transactions').then((module) => ({\n default: module.TransactionsHistory,\n }));\n } catch (error) {\n console.warn('Failed to load @tuwaio/nova-transactions package:', error);\n // Return a promise that never resolves to trigger error boundary\n return new Promise(() => {});\n }\n});\n\n/**\n * Loading component for transaction history\n */\nfunction TransactionHistoryLoading() {\n const labels = useNovaConnectLabels();\n\n return (\n <div\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:p-8 novacon:gap-4\"\n role=\"status\"\n >\n <div className=\"novacon:animate-spin novacon:rounded-full novacon:h-8 novacon:w-8 novacon:border-2 novacon:border-[var(--tuwa-text-accent)] novacon:border-t-transparent\" />\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">\n {labels.loading} {labels.transactionsInApp.toLowerCase()}...\n </p>\n </div>\n );\n}\n\n/**\n * Error fallback component when TransactionsHistory fails to load\n */\nfunction TransactionHistoryError() {\n return (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:text-center novacon:gap-4 novacon:p-6\"\n role=\"alert\"\n >\n <div className=\"novacon:w-12 novacon:h-12 novacon:p-2 novacon:rounded-full novacon:bg-[var(--tuwa-warning-bg)] novacon:text-[var(--tuwa-warning-text)]\">\n <ExclamationTriangleIcon className=\"novacon:w-full novacon:h-full\" />\n </div>\n\n <div className=\"novacon:space-y-2\">\n <h2 className=\"novacon:text-lg novacon:font-semibold novacon:text-[var(--tuwa-text-primary)]\">\n Transaction History Not Available\n </h2>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)] novacon:max-w-md\">\n Transaction history is not supported by this application at the moment. The required package is not installed\n or configured.\n </p>\n </div>\n </motion.div>\n );\n}\n\n/**\n * Pulsar adapter required fallback component\n */\nfunction PulsarAdapterRequired() {\n const labels = useNovaConnectLabels();\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className=\"novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:text-center novacon:gap-4 novacon:p-6\"\n role=\"alert\"\n >\n <div className=\"novacon:w-12 novacon:h-12 novacon:p-2 novacon:rounded-full novacon:bg-gradient-to-r novacon:from-[var(--tuwa-button-gradient-from)] novacon:to-[var(--tuwa-button-gradient-to)] novacon:text-[var(--tuwa-text-on-accent)]\">\n <PuzzlePieceIcon className=\"novacon:w-full novacon:h-full\" />\n </div>\n\n <div className=\"novacon:space-y-2\">\n <h2 className=\"novacon:text-lg novacon:font-semibold novacon:text-[var(--tuwa-text-primary)]\">\n {labels.pulsarAdapterRequired}\n </h2>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)] novacon:max-w-md novacon:leading-relaxed\">\n {labels.pulsarAdapterDescription}\n </p>\n </div>\n </motion.div>\n );\n}\n\n/**\n * Component for displaying transaction history with conditional loading\n *\n * This component provides comprehensive transaction history functionality:\n * - Conditional loading of the @tuwaio/nova-transactions package\n * - Graceful fallback when the package is not available\n * - Loading states with proper accessibility support\n * - Error handling for missing configuration\n * - Full WCAG compliance with ARIA labels\n *\n * The component automatically detects if the required dependencies are available\n * and provides appropriate fallbacks for different scenarios.\n *\n * @param props - Component props including transaction pool and adapter configuration\n * @returns JSX element displaying transaction history or appropriate fallback\n *\n * @example\n * ```tsx\n * <ConnectedModalTxHistory\n * transactionPool={txPool}\n * pulsarAdapter={adapter}\n * className=\"custom-styling\"\n * />\n * ```\n *\n * @public\n */\nexport function ConnectedModalTxHistory({ transactionPool, pulsarAdapter, className }: ConnectedModalTxHistoryProps) {\n const labels = useNovaConnectLabels();\n const { activeWallet } = useNovaConnect();\n\n /**\n * Memoized container classes for better performance\n */\n const containerClasses = useMemo(\n () =>\n `novacon:flex novacon:flex-col novacon:items-center novacon:justify-center novacon:p-4 ${className || ''}`.trim(),\n [className],\n );\n\n /**\n * Memoized check for adapter availability\n */\n const hasValidAdapter = useMemo(() => Boolean(transactionPool && pulsarAdapter), [transactionPool, pulsarAdapter]);\n\n // Early return if no active wallet\n if (!activeWallet) {\n return (\n <div className={containerClasses}>\n <p className=\"novacon:text-sm novacon:text-[var(--tuwa-text-secondary)]\">No wallet connected</p>\n </div>\n );\n }\n\n return (\n <div className={containerClasses}>\n {hasValidAdapter ? (\n <Suspense fallback={<TransactionHistoryLoading />}>\n <ErrorBoundary fallback={<TransactionHistoryError />}>\n <TransactionsHistory\n transactionsPool={transactionPool!}\n adapter={pulsarAdapter!}\n connectedWalletAddress={activeWallet.address}\n className=\"novacon:w-full\"\n aria-label={`${labels.transactionsInApp} for ${activeWallet.address}`}\n />\n </ErrorBoundary>\n </Suspense>\n ) : (\n <PulsarAdapterRequired />\n )}\n </div>\n );\n}\n\n/**\n * Simple Error Boundary component for handling TransactionsHistory loading errors\n */\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n fallback: React.ReactNode;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.warn('TransactionsHistory component failed to load:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback;\n }\n\n return this.props.children;\n }\n}\n","import { cn, isTouchDevice } from '@tuwaio/nova-core';\nimport { motion } from 'framer-motion';\nimport React, { memo, useMemo } from 'react';\n\ninterface RecentBadgeProps {\n className?: string;\n children?: React.ReactNode;\n animated?: boolean;\n}\n\n/**\n * Badge component with animated gradient border effect\n */\nexport const RecentBadge = memo<RecentBadgeProps>(({ className, children = 'Recent', animated = true }) => {\n const isTouch = useMemo(() => isTouchDevice(), []);\n\n // Memoize gradient to prevent recreating\n const gradientBackground = useMemo(\n () => `linear-gradient(90deg, \n rgba(255, 255, 255, 0) 0%, \n var(--tuwa-text-secondary) 20%, \n rgba(255, 255, 255, 0) 40%\n )`,\n [],\n );\n\n const sizeClasses = isTouch\n ? 'novacon:px-1.5 novacon:py-0 novacon:text-[10px]'\n : 'novacon:px-2.5 novacon:py-0.5 novacon:text-xs';\n\n return (\n <span\n className={cn(\n 'novacon:inline-flex novacon:items-center novacon:rounded-full novacon:font-medium novacon:relative novacon:overflow-hidden',\n 'novacon:text-[var(--tuwa-text-secondary)] novacon:border novacon:border-[var(--tuwa-border-primary)]',\n sizeClasses,\n className,\n )}\n role=\"status\"\n aria-label={typeof children === 'string' ? children : 'Recent'}\n >\n {/* Animated gradient border */}\n <motion.span\n className=\"novacon:absolute novacon:inset-0 novacon:z-0 novacon:pointer-events-none novacon:rounded-full\"\n style={{ background: gradientBackground, backgroundSize: '200% 100%' }}\n initial={{ backgroundPositionX: '100%' }}\n animate={animated ? { backgroundPositionX: '-100%' } : {}}\n transition={{\n duration: 4,\n ease: 'linear',\n repeat: animated ? Infinity : 0,\n }}\n />\n\n {/* Background overlay */}\n <span className=\"novacon:absolute novacon:z-10 novacon:pointer-events-none novacon:rounded-full novacon:bg-[var(--tuwa-bg-primary)] novacon:inset-[1px]\" />\n\n {/* Content */}\n <span className=\"novacon:relative novacon:z-20 novacon:whitespace-nowrap\">{children}</span>\n </span>\n );\n});\n\nRecentBadge.displayName = 'RecentBadge';\n","/**\n * @file This file contains the `ToastError` component, a customizable error toast with full styling control.\n */\n\nimport { DocumentDuplicateIcon } from '@heroicons/react/24/solid';\nimport { cn, useCopyToClipboard } from '@tuwaio/nova-core';\nimport { ComponentPropsWithoutRef, ComponentType, forwardRef, ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomIconProps = {\n isCopied: boolean;\n className?: string;\n style?: React.CSSProperties;\n 'aria-hidden'?: boolean;\n};\n\ntype CustomTitleProps = {\n title: string;\n titleId: string;\n className?: string;\n style?: React.CSSProperties;\n};\n\ntype CustomDescriptionProps = {\n rawError: string;\n descriptionId: string;\n className?: string;\n style?: React.CSSProperties;\n};\n\ntype CustomButtonContentProps = {\n icon: ReactNode;\n isCopied: boolean;\n copyLabel: string;\n copiedLabel: string;\n};\n\n/**\n * Customization options for ToastError component\n */\nexport type ToastErrorCustomization = {\n /** Override container element props */\n containerProps?: Partial<ComponentPropsWithoutRef<'div'>>;\n /** Override button element props */\n buttonProps?: Partial<ComponentPropsWithoutRef<'button'>>;\n /** Custom components */\n components?: {\n /** Custom icon component */\n Icon?: ComponentType<CustomIconProps>;\n /** Custom title component */\n Title?: ComponentType<CustomTitleProps>;\n /** Custom description component */\n Description?: ComponentType<CustomDescriptionProps>;\n /** Custom button content component */\n ButtonContent?: ComponentType<CustomButtonContentProps>;\n };\n /** Custom class name generators */\n classNames?: {\n /** Function to generate container classes */\n container?: (params: { hasTitle: boolean; hasError: boolean }) => string;\n /** Function to generate title classes */\n title?: (params: { title: string }) => string;\n /** Function to generate description classes */\n description?: (params: { rawError: string }) => string;\n /** Function to generate button classes */\n button?: (params: { isCopied: boolean; disabled: boolean }) => string;\n /** Function to generate icon classes */\n icon?: (params: { isCopied: boolean }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Function to generate container styles */\n container?: (params: { hasTitle: boolean; hasError: boolean }) => React.CSSProperties;\n /** Function to generate title styles */\n title?: (params: { title: string }) => React.CSSProperties;\n /** Function to generate description styles */\n description?: (params: { rawError: string }) => React.CSSProperties;\n /** Function to generate button styles */\n button?: (params: { isCopied: boolean; disabled: boolean }) => React.CSSProperties;\n /** Function to generate icon styles */\n icon?: (params: { isCopied: boolean }) => React.CSSProperties;\n };\n /** Custom event handlers */\n handlers?: {\n /** Custom click handler wrapper */\n onClick?: (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n ) => void;\n /** Custom keydown handler wrapper */\n onKeyDown?: (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n ) => void;\n };\n};\n\nexport interface ToastErrorProps extends Omit<ComponentPropsWithoutRef<'div'>, 'role' | 'aria-live'> {\n /** Error title to display */\n title: string;\n /** Raw error message to display and copy */\n rawError: string;\n /** Custom CSS classes for the container */\n className?: string;\n /** Custom ARIA label for the error container */\n 'aria-label'?: string;\n /** Callback fired when copy operation completes */\n onCopyComplete?: (success: boolean) => void;\n /** Customization options */\n customization?: ToastErrorCustomization;\n}\n\n// --- Default Sub-Components ---\nconst DefaultIcon = ({ isCopied, className, style, ...props }: CustomIconProps) => {\n return (\n <DocumentDuplicateIcon\n className={cn(\n 'novacon:w-4 novacon:h-4 novacon:transition-colors',\n isCopied && 'novacon:text-[var(--tuwa-success-text)]',\n className,\n )}\n style={style}\n {...props}\n />\n );\n};\n\nconst DefaultTitle = ({ title, titleId, className, style }: CustomTitleProps) => {\n return (\n <p\n id={titleId}\n className={cn(\n 'novacon:text-sm novacon:font-semibold novacon:truncate novacon:text-[var(--tuwa-error-text)]',\n className,\n )}\n style={style}\n role=\"heading\"\n aria-level={3}\n title={title} // Show full title on hover if truncated\n >\n {title}\n </p>\n );\n};\n\nconst DefaultDescription = ({ rawError, descriptionId, className, style }: CustomDescriptionProps) => {\n return (\n <p\n id={descriptionId}\n className={cn(\n 'novacon:mt-1 novacon:text-xs novacon:break-words novacon:text-[var(--tuwa-error-text)] novacon:opacity-80',\n className,\n )}\n style={style}\n role=\"text\"\n >\n {rawError}\n </p>\n );\n};\n\nconst DefaultButtonContent = ({ icon, isCopied, copyLabel, copiedLabel }: CustomButtonContentProps) => {\n return (\n <>\n {icon}\n <span className=\"novacon:select-none novacon:transition-colors\" aria-live=\"polite\" role=\"status\">\n {isCopied ? copiedLabel : copyLabel}\n </span>\n </>\n );\n};\n\n// --- Default Event Handlers ---\nconst defaultClickHandler = (\n originalHandler: (event: React.MouseEvent<HTMLButtonElement>) => void,\n event: React.MouseEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\nconst defaultKeyDownHandler = (\n originalHandler: (event: React.KeyboardEvent<HTMLButtonElement>) => void,\n event: React.KeyboardEvent<HTMLButtonElement>,\n) => {\n originalHandler(event);\n};\n\n// Counter for unique IDs (outside component to avoid re-initialization)\nlet idCounter = 0;\n\n/**\n * A highly customizable error toast component with copy functionality and extensive styling options.\n * Provides comprehensive customization for appearance, behavior, and event handling while maintaining accessibility.\n */\nexport const ToastError = forwardRef<HTMLDivElement, ToastErrorProps>(\n ({ title, rawError, className, 'aria-label': ariaLabel, onCopyComplete, customization, ...props }, ref) => {\n const labels = useNovaConnectLabels();\n const { isCopied, copy } = useCopyToClipboard();\n\n // Generate unique IDs only once per component instance\n const [uniqueId] = useState(() => {\n idCounter += 1;\n return `${idCounter}-${Date.now()}`;\n });\n\n const titleId = `error-title-${uniqueId}`;\n const descriptionId = `error-description-${uniqueId}`;\n\n // Extract custom components and handlers\n const {\n Icon = DefaultIcon,\n Title = DefaultTitle,\n Description = DefaultDescription,\n ButtonContent = DefaultButtonContent,\n } = customization?.components ?? {};\n\n const {\n onClick: customOnClickHandler = defaultClickHandler,\n onKeyDown: customOnKeyDownHandler = defaultKeyDownHandler,\n } = customization?.handlers ?? {};\n\n // Memoize error text for copying\n const errorToCopy = useMemo(() => rawError, [rawError]);\n\n // Handle copy with error handling and callback\n const handleCopy = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n e.preventDefault();\n\n try {\n await copy(errorToCopy);\n onCopyComplete?.(true);\n } catch (error) {\n console.error('Failed to copy error:', error);\n onCopyComplete?.(false);\n }\n },\n [copy, errorToCopy, onCopyComplete],\n );\n\n // Handle keyboard interaction for copy button\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const originalHandler = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n // Create a synthetic mouse event for onClick compatibility\n const syntheticEvent = {\n ...event,\n button: 0,\n buttons: 1,\n clientX: 0,\n clientY: 0,\n movementX: 0,\n movementY: 0,\n offsetX: 0,\n offsetY: 0,\n pageX: 0,\n pageY: 0,\n relatedTarget: null,\n screenX: 0,\n screenY: 0,\n x: 0,\n y: 0,\n getModifierState: () => false,\n initMouseEvent: () => {},\n };\n // eslint-disable-next-line\n handleCopy(syntheticEvent as any);\n }\n };\n\n customOnKeyDownHandler(originalHandler, e);\n },\n [customOnKeyDownHandler, handleCopy],\n );\n\n // Generate container classes\n const containerClasses = useMemo(() => {\n if (customization?.classNames?.container) {\n return customization.classNames.container({ hasTitle: Boolean(title), hasError: Boolean(rawError) });\n }\n\n return cn(\n 'novacon:bg-[var(--tuwa-bg-primary)] novacon:p-4 novacon:rounded-md novacon:w-full',\n 'novacon:border novacon:border-[var(--tuwa-border-primary)]',\n className,\n );\n }, [customization, title, rawError, className]);\n\n // Generate title classes\n const titleClasses = useMemo(() => {\n if (customization?.classNames?.title) {\n return customization.classNames.title({ title });\n }\n\n return undefined; // Let DefaultTitle handle its own classes\n }, [customization, title]);\n\n // Generate description classes\n const descriptionClasses = useMemo(() => {\n if (customization?.classNames?.description) {\n return customization.classNames.description({ rawError });\n }\n\n return undefined; // Let DefaultDescription handle its own classes\n }, [customization, rawError]);\n\n // Generate button classes\n const buttonClasses = useMemo(() => {\n const disabled = !errorToCopy.trim();\n if (customization?.classNames?.button) {\n return customization.classNames.button({ isCopied, disabled });\n }\n\n return cn(\n 'novacon:cursor-pointer novacon:mt-2 novacon:text-xs novacon:font-medium novacon:inline-flex novacon:items-center novacon:space-x-1.5',\n 'novacon:focus:outline-none novacon:focus:ring-2 novacon:focus:ring-[var(--tuwa-error-text)] novacon:focus:ring-opacity-50',\n 'novacon:rounded-md novacon:px-2 novacon:py-1 novacon:transition-all novacon:duration-200',\n 'novacon:hover:bg-[var(--tuwa-error-text)] novacon:hover:bg-opacity-10',\n 'novacon:active:bg-[var(--tuwa-error-text)] novacon:active:bg-opacity-20',\n 'novacon:text-[var(--tuwa-error-text)] novacon:hover:text-[var(--tuwa-error-text)]',\n isCopied &&\n 'novacon:bg-[var(--tuwa-success-text)] novacon:bg-opacity-10 novacon:text-[var(--tuwa-success-text)]',\n );\n }, [customization, isCopied, errorToCopy]);\n\n // Generate icon classes\n const iconClasses = useMemo(() => {\n if (customization?.classNames?.icon) {\n return customization.classNames.icon({ isCopied });\n }\n\n return undefined; // Let DefaultIcon handle its own classes\n }, [customization, isCopied]);\n\n // Generate container styles\n const containerStyles = useMemo(() => {\n if (customization?.styles?.container) {\n return customization.styles.container({ hasTitle: Boolean(title), hasError: Boolean(rawError) });\n }\n\n return undefined;\n }, [customization, title, rawError]);\n\n // Generate title styles\n const titleStyles = useMemo(() => {\n if (customization?.styles?.title) {\n return customization.styles.title({ title });\n }\n\n return undefined;\n }, [customization, title]);\n\n // Generate description styles\n const descriptionStyles = useMemo(() => {\n if (customization?.styles?.description) {\n return customization.styles.description({ rawError });\n }\n\n return undefined;\n }, [customization, rawError]);\n\n // Generate button styles\n const buttonStyles = useMemo(() => {\n const disabled = !errorToCopy.trim();\n if (customization?.styles?.button) {\n return customization.styles.button({ isCopied, disabled });\n }\n\n return undefined;\n }, [customization, isCopied, errorToCopy]);\n\n // Generate icon styles\n const iconStyles = useMemo(() => {\n if (customization?.styles?.icon) {\n return customization.styles.icon({ isCopied });\n }\n\n return undefined;\n }, [customization, isCopied]);\n\n // Create icon element\n const iconElement = useMemo(\n () => <Icon isCopied={isCopied} className={iconClasses} style={iconStyles} aria-hidden />,\n [Icon, isCopied, iconClasses, iconStyles],\n );\n\n // Merge container props\n const containerProps = useMemo(\n () => ({\n ...customization?.containerProps,\n ...props,\n ref,\n className: containerClasses,\n style: { ...containerStyles, ...customization?.containerProps?.style, ...props.style },\n role: 'alert' as const,\n 'aria-live': 'assertive' as const,\n 'aria-labelledby': titleId,\n 'aria-describedby': descriptionId,\n 'aria-label': ariaLabel,\n }),\n [customization?.containerProps, props, ref, containerClasses, containerStyles, titleId, descriptionId, ariaLabel],\n );\n\n // Merge button props\n const buttonProps = useMemo(\n () => ({\n ...customization?.buttonProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n customOnClickHandler(handleCopy, e);\n },\n onKeyDown: handleKeyDown,\n className: buttonClasses,\n style: { ...buttonStyles, ...customization?.buttonProps?.style },\n type: 'button' as const,\n 'aria-label': isCopied ? `${labels.copied} ${labels.copyRawError}` : labels.copyRawError,\n 'aria-describedby': `${titleId} ${descriptionId}`,\n disabled: !errorToCopy.trim(),\n }),\n [\n customization?.buttonProps,\n customOnClickHandler,\n handleCopy,\n handleKeyDown,\n buttonClasses,\n buttonStyles,\n isCopied,\n labels.copied,\n labels.copyRawError,\n titleId,\n descriptionId,\n errorToCopy,\n ],\n );\n\n return (\n <div {...containerProps}>\n {/* Error Title */}\n <Title title={title} titleId={titleId} className={titleClasses} style={titleStyles} />\n\n {/* Error Description */}\n <Description\n rawError={rawError}\n descriptionId={descriptionId}\n className={descriptionClasses}\n style={descriptionStyles}\n />\n\n {/* Copy Button */}\n <button {...buttonProps}>\n <ButtonContent\n icon={iconElement}\n isCopied={isCopied}\n copyLabel={labels.copyRawError}\n copiedLabel={labels.copied}\n />\n </button>\n </div>\n );\n },\n);\n\nToastError.displayName = 'ToastError';\n","/**\n * @file This file contains the `ErrorsProvider` component, a customizable error toast provider with full styling control.\n */\n\nimport { ToastCloseButton } from '@tuwaio/nova-core';\nimport { ComponentPropsWithoutRef, ComponentType, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { Bounce, toast, ToastContainer, type ToastPosition, type ToastTransition } from 'react-toastify';\n\nimport { ToastError, ToastErrorCustomization } from '../components';\nimport { NovaConnectProviderProps, useNovaConnect } from '../hooks/useNovaConnect';\nimport { useNovaConnectLabels } from '../hooks/useNovaConnectLabels';\n\n// --- Types for Customization ---\ntype CustomToastErrorProps = {\n title: string;\n rawError: string;\n onCopyComplete?: (success: boolean) => void;\n errorType: 'wallet' | 'switch' | null;\n isConnected: boolean;\n};\n\ntype CustomContainerProps = ComponentPropsWithoutRef<typeof ToastContainer>;\n\n/**\n * Customization options for ErrorsProvider component\n */\nexport type ErrorsProviderCustomization = {\n /** Override ToastContainer element props */\n containerProps?: Partial<ComponentPropsWithoutRef<typeof ToastContainer>>;\n /** Custom components */\n components?: {\n /** Custom ToastError component */\n ToastError?: ComponentType<CustomToastErrorProps>;\n /** Custom ToastContainer component */\n Container?: ComponentType<CustomContainerProps>;\n };\n /** Default ToastError customization (only used with default ToastError component) */\n toastErrorCustomization?: ToastErrorCustomization;\n /** Custom class name generators */\n classNames?: {\n /** Function to generate container classes */\n container?: (params: { hasErrors: boolean; errorType: 'wallet' | 'switch' | null }) => string;\n };\n /** Custom style generators */\n styles?: {\n /** Function to generate container styles */\n container?: (params: { hasErrors: boolean; errorType: 'wallet' | 'switch' | null }) => React.CSSProperties;\n };\n /** Custom toast options generators */\n toastOptions?: {\n /** Function to generate toast options */\n error?: (params: {\n title: string;\n rawError: string;\n errorType: 'wallet' | 'switch' | null;\n isConnected: boolean;\n }) => Partial<Parameters<typeof toast.error>[1]>;\n };\n /** Custom logic handlers */\n handlers?: {\n /** Custom error display logic */\n showError?: (\n originalHandler: (title: string, rawError: string, errorKey: string) => void,\n params: { title: string; rawError: string; errorKey: string; errorType: 'wallet' | 'switch' | null },\n ) => void;\n /** Custom error dismissal logic */\n dismissError?: (originalHandler: () => void) => void;\n /** Custom copy complete handler */\n onCopyComplete?: (success: boolean, rawError: string, errorType: 'wallet' | 'switch' | null) => void;\n };\n /** Custom error title generator - does NOT customize labels, just allows title modification */\n errorTitle?: (defaultTitle: string, params: { errorType: 'wallet' | 'switch' | null }) => string;\n /** Custom error hash generator for deduplication */\n errorHash?: (\n defaultHash: string | null,\n params: { primaryError: string | null; errorType: 'wallet' | 'switch' | null },\n ) => string | null;\n};\n\nexport interface ErrorsProviderProps extends Pick<NovaConnectProviderProps, 'store'> {\n /** Custom container ID for toast notifications */\n containerId?: string;\n /** Custom position for toast notifications */\n position?: ToastPosition;\n /** Auto close delay in milliseconds */\n autoClose?: number | false;\n /** Whether to enable drag to dismiss */\n draggable?: boolean;\n /** Customization options */\n customization?: ErrorsProviderCustomization;\n}\n\n// --- Default Sub-Components ---\nconst DefaultToastError = ({\n title,\n rawError,\n onCopyComplete,\n // Unused but kept for API consistency\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n errorType,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isConnected,\n ...props\n}: CustomToastErrorProps & { customization?: ToastErrorCustomization }) => {\n return (\n <ToastError\n title={title}\n rawError={rawError}\n onCopyComplete={onCopyComplete}\n customization={(props as any).customization}\n />\n );\n};\n\nconst DefaultContainer = (props: CustomContainerProps) => {\n // Labels are NOT passed to custom components - they're used internally only\n const labels = useNovaConnectLabels();\n\n return <ToastContainer {...props} role=\"alert\" aria-live=\"assertive\" aria-label={labels.somethingWentWrong} />;\n};\n\n// --- Default Handlers ---\nconst defaultShowErrorHandler = (\n originalHandler: (title: string, rawError: string, errorKey: string) => void,\n params: { title: string; rawError: string; errorKey: string },\n) => {\n originalHandler(params.title, params.rawError, params.errorKey);\n};\n\nconst defaultDismissErrorHandler = (originalHandler: () => void) => {\n originalHandler();\n};\n\nconst defaultCopyCompleteHandler = (success: boolean, rawError: string) => {\n if (success && process.env.NODE_ENV === 'development') {\n console.log('Error copied to clipboard:', rawError.substring(0, 100));\n }\n};\n\nconst defaultErrorTitleGenerator = (defaultTitle: string) => defaultTitle;\n\nconst defaultErrorHashGenerator = (defaultHash: string | null) => defaultHash;\n\n/**\n * A highly customizable error toast provider with extensive styling options and component replacement capabilities.\n * Provides comprehensive customization for appearance, behavior, and error handling logic while maintaining accessibility.\n */\nexport function ErrorsProvider({\n store,\n containerId = 'nova-connect-errors',\n position = 'top-center',\n autoClose = 7000,\n draggable = false,\n customization,\n}: ErrorsProviderProps) {\n const labels = useNovaConnectLabels();\n const { activeWallet, walletConnectionError } = useNovaConnect();\n\n const switchNetworkError = store.getState().switchNetworkError;\n\n // Extract custom components and handlers\n const { ToastError: CustomToastError = DefaultToastError, Container = DefaultContainer } =\n customization?.components ?? {};\n\n const {\n showError: customShowErrorHandler = defaultShowErrorHandler,\n dismissError: customDismissErrorHandler = defaultDismissErrorHandler,\n onCopyComplete: customCopyCompleteHandler = defaultCopyCompleteHandler,\n } = customization?.handlers ?? {};\n\n const {\n errorTitle: customErrorTitleGenerator = defaultErrorTitleGenerator,\n errorHash: customErrorHashGenerator = defaultErrorHashGenerator,\n } = customization ?? {};\n\n // Track displayed errors to prevent duplicates\n const displayedErrorsRef = useRef<Set<string>>(new Set());\n const currentToastIdRef = useRef<string | null>(null);\n\n // Memoize error state\n const errorState = useMemo(() => {\n const hasWalletError = Boolean(walletConnectionError);\n const hasSwitchError = Boolean(switchNetworkError);\n const isConnected = Boolean(activeWallet?.isConnected);\n\n return {\n hasWalletError,\n hasSwitchError,\n isConnected,\n hasAnyError: hasWalletError || hasSwitchError,\n primaryError: walletConnectionError || switchNetworkError || null,\n errorType: (hasWalletError ? 'wallet' : hasSwitchError ? 'switch' : null) as 'wallet' | 'switch' | null,\n };\n }, [walletConnectionError, switchNetworkError, activeWallet?.isConnected]);\n\n // Memoize default error title based on type (using labels, NOT customizing them)\n const defaultErrorTitle = useMemo(() => {\n switch (errorState.errorType) {\n case 'wallet':\n return labels.walletConnectionError;\n case 'switch':\n return labels.errorWhenChainSwitching;\n default:\n return labels.somethingWentWrong;\n }\n }, [errorState.errorType, labels]);\n\n // Generate custom error title (allows modification but NOT labels customization)\n const errorTitle = useMemo(() => {\n return customErrorTitleGenerator(defaultErrorTitle, { errorType: errorState.errorType });\n }, [customErrorTitleGenerator, defaultErrorTitle, errorState.errorType]);\n\n // Generate default error hash for deduplication\n const defaultErrorHash = useMemo(() => {\n if (!errorState.primaryError) return null;\n return `${errorState.errorType}-${errorState.primaryError.substring(0, 50)}`;\n }, [errorState.primaryError, errorState.errorType]);\n\n // Generate custom error hash\n const errorHash = useMemo(() => {\n return customErrorHashGenerator(defaultErrorHash, {\n primaryError: errorState.primaryError,\n errorType: errorState.errorType,\n });\n }, [customErrorHashGenerator, defaultErrorHash, errorState.primaryError, errorState.errorType]);\n\n // Dismiss current toast\n const dismissCurrentToast = useCallback(() => {\n const originalHandler = () => {\n if (currentToastIdRef.current) {\n toast.dismiss(currentToastIdRef.current);\n currentToastIdRef.current = null;\n }\n toast.dismiss({ containerId });\n };\n\n customDismissErrorHandler(originalHandler);\n }, [containerId, customDismissErrorHandler]);\n\n // Handle copy complete\n const handleCopyComplete = useCallback(\n (success: boolean, rawError: string) => {\n customCopyCompleteHandler(success, rawError, errorState.errorType);\n },\n [customCopyCompleteHandler, errorState.errorType],\n );\n\n // Original handler for error display - using full customization object in dependencies\n const originalErrorHandler = useCallback(\n (t: string, r: string, k: string) => {\n // Dismiss previous toast first\n dismissCurrentToast();\n\n // Check if this error was already displayed\n if (displayedErrorsRef.current.has(k)) {\n return;\n }\n\n try {\n // Generate custom toast options\n const defaultToastOptions = {\n containerId,\n toastId: k,\n onClose: () => {\n displayedErrorsRef.current.delete(k);\n currentToastIdRef.current = null;\n },\n };\n\n const customToastOptions = customization?.toastOptions?.error?.({\n title: t,\n rawError: r,\n errorType: errorState.errorType,\n isConnected: errorState.isConnected,\n });\n\n const toastOptions = { ...defaultToastOptions, ...customToastOptions };\n\n // Use toast.error and capture the result properly\n toast.error(\n <CustomToastError\n title={t}\n rawError={r}\n errorType={errorState.errorType}\n isConnected={errorState.isConnected}\n onCopyComplete={(success) => handleCopyComplete(success, r)}\n customization={customization?.toastErrorCustomization}\n />,\n toastOptions,\n );\n\n displayedErrorsRef.current.add(k);\n currentToastIdRef.current = k;\n } catch (error) {\n console.error('Failed to show error toast:', error);\n }\n },\n [\n dismissCurrentToast,\n containerId,\n customization,\n CustomToastError,\n errorState.errorType,\n errorState.isConnected,\n handleCopyComplete,\n ],\n );\n\n // Show error toast\n const showErrorToast = useCallback(\n (title: string, rawError: string, errorKey: string) => {\n customShowErrorHandler(originalErrorHandler, { title, rawError, errorKey, errorType: errorState.errorType });\n },\n [originalErrorHandler, customShowErrorHandler, errorState.errorType],\n );\n\n // Main effect to handle error display logic\n useEffect(() => {\n const { hasAnyError, isConnected, primaryError } = errorState;\n\n // Clear all errors when connected successfully\n if (isConnected && !hasAnyError) {\n dismissCurrentToast();\n displayedErrorsRef.current.clear();\n return;\n }\n\n // Show error if present and not already displayed\n if (hasAnyError && primaryError && errorHash) {\n // For connected state, only show switch network errors\n if (isConnected && errorState.errorType !== 'switch') {\n return;\n }\n\n showErrorToast(errorTitle, primaryError, errorHash);\n }\n }, [errorState, errorTitle, errorHash, showErrorToast, dismissCurrentToast]);\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n dismissCurrentToast();\n // eslint-disable-next-line\n displayedErrorsRef.current.clear();\n };\n }, [dismissCurrentToast]);\n\n // Generate container classes\n const containerClasses = useMemo(() => {\n if (customization?.classNames?.container) {\n return customization.classNames.container({\n hasErrors: errorState.hasAnyError,\n errorType: errorState.errorType,\n });\n }\n\n return 'novacon:p-0 novacon:bg-transparent';\n }, [customization, errorState.hasAnyError, errorState.errorType]);\n\n // Generate container styles\n const containerStyles = useMemo(() => {\n if (customization?.styles?.container) {\n return customization.styles.container({\n hasErrors: errorState.hasAnyError,\n errorType: errorState.errorType,\n });\n }\n\n return undefined;\n }, [customization, errorState.hasAnyError, errorState.errorType]);\n\n // Memoize default container props\n const defaultContainerProps = useMemo(\n () => ({\n containerId,\n position,\n closeOnClick: false,\n icon: false as const,\n closeButton: ToastCloseButton,\n autoClose,\n hideProgressBar: false,\n newestOnTop: false,\n pauseOnFocusLoss: false,\n draggable,\n pauseOnHover: true,\n theme: 'light' as const,\n transition: Bounce as ToastTransition,\n }),\n [containerId, position, autoClose, draggable],\n );\n\n // Merge container props (NO labels passed to custom components!)\n const containerProps = useMemo(\n () => ({\n ...defaultContainerProps,\n ...customization?.containerProps,\n className: containerClasses,\n style: { ...containerStyles, ...customization?.containerProps?.style },\n }),\n [defaultContainerProps, customization?.containerProps, containerClasses, containerStyles],\n );\n\n return <Container {...containerProps} />;\n}\n\n// Add display name for better debugging\nErrorsProvider.displayName = 'ErrorsProvider';\n","/**\n * @file This file sets up the React Context for providing i18n labels throughout the UI components.\n * It allows for deep customization of all text displayed by the library.\n */\n\nimport { ReactNode, useMemo } from 'react';\n\nimport { NovaConnectLabelsContext } from '../hooks/useNovaConnectLabels';\nimport { NovaConnectLabels } from '../i18n/types';\n\ninterface NovaConnectLabelsProviderProps {\n /** An object containing the custom labels */\n labels: NovaConnectLabels;\n /** The child components to render */\n children: ReactNode;\n}\n\n/**\n * A React component that provides a custom set of labels to all child components.\n * Wrap your application or component tree with this provider to apply custom translations.\n *\n * The provider uses React.memo optimization and validates labels in development mode.\n *\n * @example\n * ```typescript\n * import { NovaConnectLabelsProvider } from './NovaConnectLabelsProvider';\n * import { defaultLabels } from './i18n/en';\n *\n * function App() {\n * const customLabels = {\n * ...defaultLabels,\n * connectWallet: 'Подключить кошелек',\n * disconnect: 'Отключиться',\n * };\n *\n * return (\n * <NovaConnectLabelsProvider labels={customLabels}>\n * <YourApp />\n * </NovaConnectLabelsProvider>\n * );\n * }\n * ```\n */\nexport function NovaConnectLabelsProvider({ labels, children }: NovaConnectLabelsProviderProps) {\n // Memoize labels to prevent unnecessary re-renders\n const memoizedLabels = useMemo(() => labels, [labels]);\n\n // Development-only validation\n if (process.env.NODE_ENV === 'development') {\n // Validate that labels object is provided\n if (!labels || typeof labels !== 'object') {\n console.warn('NovaConnectLabelsProvider: labels prop should be an object');\n }\n\n // Check for missing required labels (basic validation)\n const requiredLabels = ['connectWallet', 'disconnect', 'connecting', 'connected', 'error', 'success'] as const;\n\n const missingLabels = requiredLabels.filter((key) => !(key in labels));\n if (missingLabels.length > 0) {\n console.warn(`NovaConnectLabelsProvider: Missing required labels: ${missingLabels.join(', ')}`);\n }\n }\n\n return <NovaConnectLabelsContext.Provider value={memoizedLabels}>{children}</NovaConnectLabelsContext.Provider>;\n}\n\n// Add display name for better debugging\nNovaConnectLabelsProvider.displayName = 'NovaConnectLabelsProvider';\n","/**\n * @file Main NovaConnect provider component with comprehensive customization capabilities.\n * @module NovaConnectProvider\n */\n\nimport { deepMerge } from '@tuwaio/nova-core';\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { BaseWallet } from '@tuwaio/satellite-core';\nimport { ComponentType, ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport {\n ButtonTxStatus,\n ConnectContentType,\n ConnectedContentType,\n NovaConnectProviderContext,\n NovaConnectProviderProps as BaseNovaConnectProviderProps,\n NovaConnectProviderType,\n} from '../hooks/useNovaConnect';\nimport { defaultLabels } from '../i18n/en';\nimport { NovaConnectLabels } from '../i18n/types';\nimport { ErrorsProvider, ErrorsProviderCustomization, ErrorsProviderProps } from './ErrorsProvider';\nimport { NovaConnectLabelsProvider } from './NovaConnectLabelsProvider';\n\n// --- Customization Types ---\n\n/**\n * Props for custom NovaConnectLabelsProvider component\n */\ntype CustomLabelsProviderProps = {\n labels?: Partial<NovaConnectLabels>;\n children: ReactNode;\n};\n\n/**\n * Props for custom ErrorsProvider component\n */\ntype CustomErrorsProviderProps = Pick<ErrorsProviderProps, 'store'> & {\n customization?: ErrorsProviderCustomization;\n};\n\n/**\n * Context data passed to custom provider components\n */\ntype ProviderContext = {\n /** Current wallet connection state */\n isConnected: boolean;\n /** Active wallet instance */\n activeWallet: BaseWallet | undefined;\n /** Current wallet connection error */\n walletConnectionError: string | undefined;\n /** All modal and UI states */\n modalStates: {\n isConnectModalOpen: boolean;\n isConnectedModalOpen: boolean;\n isChainsListOpen: boolean;\n isChainsListOpenMobile: boolean;\n };\n /** Current content types for modals */\n contentTypes: {\n connectModal: ConnectContentType;\n connectedModal: ConnectedContentType;\n };\n /** Button and transaction statuses */\n statuses: {\n connectedButton: ButtonTxStatus;\n };\n};\n\n/**\n * Comprehensive customization options for NovaConnectProvider\n */\nexport type NovaConnectProviderCustomization = {\n /** Custom components */\n components?: {\n /** Custom labels provider component */\n LabelsProvider?: ComponentType<CustomLabelsProviderProps>;\n /** Custom errors provider component */\n ErrorsProvider?: ComponentType<CustomErrorsProviderProps>;\n };\n /** Labels customization and merging strategy */\n labels?: {\n /** Custom labels merging function */\n merge?: (defaultLabels: NovaConnectLabels, userLabels: Partial<NovaConnectLabels>) => NovaConnectLabels;\n /** Transform final merged labels before use */\n transform?: (mergedLabels: NovaConnectLabels, context: ProviderContext) => NovaConnectLabels;\n };\n /** ErrorsProvider customization - passed through to ErrorsProvider */\n errors?: ErrorsProviderCustomization;\n /** Custom initialization logic */\n initialization?: {\n /** Custom logic after store subscription setup */\n onStoreSubscribed?: (context: ProviderContext) => void;\n /** Custom logic when connection state changes */\n onConnectionStateChange?: (\n isConnected: boolean,\n activeWallet: BaseWallet | undefined,\n context: ProviderContext,\n ) => void;\n /** Custom logic when error state changes */\n onErrorStateChange?: (error: string | undefined, context: ProviderContext) => void;\n };\n /** Custom context value transformation */\n contextValue?: {\n /** Transform context value before providing to children */\n transform?: (defaultValue: NovaConnectProviderType, context: ProviderContext) => NovaConnectProviderType;\n };\n /** Custom rendering logic */\n rendering?: {\n /** Custom provider tree structure */\n providerTree?: (\n defaultTree: ReactNode,\n components: {\n ErrorsProvider: ReactNode;\n LabelsProvider: ReactNode;\n MainContent: ReactNode;\n },\n context: ProviderContext,\n ) => ReactNode;\n };\n};\n\n/**\n * Extended props for NovaConnectProvider with full customization capabilities\n */\nexport interface NovaConnectProviderProps extends BaseNovaConnectProviderProps {\n /** Comprehensive customization options for the provider and its sub-components */\n customization?: NovaConnectProviderCustomization;\n}\n\n// --- Default Components ---\n\n/**\n * Default labels provider component\n */\nconst DefaultLabelsProvider = ({ labels, children }: CustomLabelsProviderProps) => {\n return <NovaConnectLabelsProvider labels={labels as NovaConnectLabels}>{children}</NovaConnectLabelsProvider>;\n};\n\n/**\n * Default errors provider component\n */\nconst DefaultErrorsProvider = ({ store, customization }: CustomErrorsProviderProps) => {\n return <ErrorsProvider store={store} customization={customization} />;\n};\n\n// --- Default Handlers ---\n\n/**\n * Default labels merging function\n */\nconst defaultLabelsMerge = (\n defaultLabels: NovaConnectLabels,\n userLabels: Partial<NovaConnectLabels>,\n): NovaConnectLabels => {\n return deepMerge(defaultLabels, userLabels || {});\n};\n\n/**\n * Default labels transform function (identity)\n */\nconst defaultLabelsTransform = (mergedLabels: NovaConnectLabels): NovaConnectLabels => mergedLabels;\n\n/**\n * Default store subscription handler\n */\nconst defaultStoreSubscribedHandler = () => {\n // No-op by default\n};\n\n/**\n * Default connection state change handler\n */\nconst defaultConnectionStateChangeHandler = () => {\n // No-op by default\n};\n\n/**\n * Default error state change handler\n */\nconst defaultErrorStateChangeHandler = () => {\n // No-op by default\n};\n\n/**\n * Default context value transform function (identity)\n */\nconst defaultContextValueTransform = (defaultValue: NovaConnectProviderType): NovaConnectProviderType => defaultValue;\n\n/**\n * Default provider tree renderer\n */\nconst defaultProviderTreeRenderer = (\n defaultTree: ReactNode,\n // Unused but kept for API consistency\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n components: {\n ErrorsProvider: ReactNode;\n LabelsProvider: ReactNode;\n MainContent: ReactNode;\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n context: ProviderContext,\n): ReactNode => {\n return defaultTree;\n};\n\n/**\n * Main NovaConnect provider component with comprehensive customization capabilities.\n *\n * This provider manages wallet connection state, error handling, internationalization,\n * and modal states while offering extensive customization options for all sub-components\n * and behaviors.\n *\n * Features:\n * - Complete wallet connection state management\n * - Customizable error handling through ErrorsProvider\n * - Flexible internationalization system\n * - Modal and UI state coordination\n * - Extensive customization API for all aspects\n * - Custom component replacement capabilities\n * - Advanced initialization and lifecycle hooks\n *\n * @example Basic usage\n * ```tsx\n * <NovaConnectProvider store={store}>\n * <App />\n * </NovaConnectProvider>\n * ```\n *\n * @example With customization\n * ```tsx\n * <NovaConnectProvider\n * store={store}\n * labels={customLabels}\n * customization={{\n * errors: {\n * position: 'bottom-right',\n * autoClose: 5000,\n * components: {\n * ToastError: CustomToastError\n * }\n * },\n * initialization: {\n * onConnectionStateChange: (isConnected, wallet) => {\n * console.log('Connection state:', isConnected, wallet);\n * }\n * }\n * }}\n * >\n * <App />\n * </NovaConnectProvider>\n * ```\n *\n * @param props - Provider configuration and customization options\n */\nexport function NovaConnectProvider({ labels, store, children, customization }: NovaConnectProviderProps) {\n // Extract custom components\n const { LabelsProvider = DefaultLabelsProvider, ErrorsProvider: CustomErrorsProvider = DefaultErrorsProvider } =\n customization?.components ?? {};\n\n // Extract custom handlers\n const { merge: customLabelsMerge = defaultLabelsMerge, transform: customLabelsTransform = defaultLabelsTransform } =\n customization?.labels ?? {};\n\n const {\n onStoreSubscribed: customStoreSubscribedHandler = defaultStoreSubscribedHandler,\n onConnectionStateChange: customConnectionStateChangeHandler = defaultConnectionStateChangeHandler,\n onErrorStateChange: customErrorStateChangeHandler = defaultErrorStateChangeHandler,\n } = customization?.initialization ?? {};\n\n const { transform: customContextValueTransform = defaultContextValueTransform } = customization?.contextValue ?? {};\n\n const { providerTree: customProviderTreeRenderer = defaultProviderTreeRenderer } = customization?.rendering ?? {};\n\n // Merge labels using custom or default logic\n const mergedLabels = useMemo(() => {\n return customLabelsMerge(defaultLabels, labels || {});\n }, [labels, customLabelsMerge]);\n\n // State management - all existing state\n const [activeWallet, setActiveWallet] = useState<BaseWallet | undefined>(store.getState().activeWallet);\n const [walletConnectionError, setWalletConnectionError] = useState<string | undefined>(\n store.getState().walletConnectionError,\n );\n const [isConnectModalOpen, setIsConnectModalOpen] = useState(false);\n const [isConnectedModalOpen, setIsConnectedModalOpen] = useState(false);\n const [isChainsListOpen, setIsChainsListOpen] = useState(false);\n const [isChainsListOpenMobile, setIsChainsListOpenMobile] = useState(false);\n const [connectedButtonStatus, setConnectedButtonStatus] = useState<ButtonTxStatus>('idle');\n const [connectModalContentType, setConnectModalContentType] = useState<ConnectContentType>('connectors');\n const [selectedAdapter, setSelectedAdapter] = useState<OrbitAdapter | undefined>(undefined);\n const [activeConnector, setActiveConnector] = useState<string | undefined>(undefined);\n const [impersonatedAddress, setImpersonatedAddress] = useState('');\n const [isConnected, setIsConnected] = useState(false);\n const [connectedModalContentType, setConnectedModalContentType] = useState<ConnectedContentType>('main');\n\n // Create provider context for custom handlers\n const providerContext = useMemo(\n (): ProviderContext => ({\n isConnected,\n activeWallet,\n walletConnectionError,\n modalStates: {\n isConnectModalOpen,\n isConnectedModalOpen,\n isChainsListOpen,\n isChainsListOpenMobile,\n },\n contentTypes: {\n connectModal: connectModalContentType,\n connectedModal: connectedModalContentType,\n },\n statuses: {\n connectedButton: connectedButtonStatus,\n },\n }),\n [\n isConnected,\n activeWallet,\n walletConnectionError,\n isConnectModalOpen,\n isConnectedModalOpen,\n isChainsListOpen,\n isChainsListOpenMobile,\n connectModalContentType,\n connectedModalContentType,\n connectedButtonStatus,\n ],\n );\n\n // Transform labels using custom logic if provided\n const finalLabels = useMemo(() => {\n return customLabelsTransform(mergedLabels, providerContext);\n }, [mergedLabels, customLabelsTransform, providerContext]);\n\n // Handle connection state changes\n const handleConnectionStateChange = useCallback(\n (newIsConnected: boolean, newActiveWallet: BaseWallet | undefined) => {\n customConnectionStateChangeHandler(newIsConnected, newActiveWallet, providerContext);\n },\n [customConnectionStateChangeHandler, providerContext],\n );\n\n // Handle error state changes\n const handleErrorStateChange = useCallback(\n (newError: string | undefined) => {\n customErrorStateChangeHandler(newError, providerContext);\n },\n [customErrorStateChangeHandler, providerContext],\n );\n\n // Store subscription effect\n useEffect(() => {\n const unsubscribe = store.subscribe((state) => {\n const newActiveWallet = state.activeWallet;\n const newError = state.walletConnectionError;\n const newIsConnected = Boolean(newActiveWallet?.isConnected);\n\n // Update state\n setActiveWallet(newActiveWallet);\n setWalletConnectionError(newError);\n\n // Handle state changes\n if (newIsConnected !== isConnected || newActiveWallet !== activeWallet) {\n setIsConnected(newIsConnected);\n handleConnectionStateChange(newIsConnected, newActiveWallet);\n }\n\n if (newError !== walletConnectionError) {\n handleErrorStateChange(newError);\n }\n });\n\n // Custom initialization logic\n customStoreSubscribedHandler(providerContext);\n\n return unsubscribe;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store]);\n\n // Create and transform context value using custom logic if provided - moved inside useMemo\n const contextValue = useMemo(() => {\n const defaultContextValue: NovaConnectProviderType = {\n walletConnectionError,\n activeWallet,\n isConnectModalOpen,\n setIsConnectModalOpen,\n isConnectedModalOpen,\n setIsConnectedModalOpen,\n isChainsListOpen,\n setIsChainsListOpen,\n isChainsListOpenMobile,\n setIsChainsListOpenMobile,\n connectedButtonStatus,\n setConnectedButtonStatus,\n connectedModalContentType,\n setConnectedModalContentType,\n connectModalContentType,\n setConnectModalContentType,\n selectedAdapter,\n setSelectedAdapter,\n activeConnector,\n setActiveConnector,\n impersonatedAddress,\n setImpersonatedAddress,\n isConnected,\n setIsConnected,\n };\n\n return customContextValueTransform(defaultContextValue, providerContext);\n }, [\n walletConnectionError,\n activeWallet,\n isConnectModalOpen,\n setIsConnectModalOpen,\n isConnectedModalOpen,\n setIsConnectedModalOpen,\n isChainsListOpen,\n setIsChainsListOpen,\n isChainsListOpenMobile,\n setIsChainsListOpenMobile,\n connectedButtonStatus,\n setConnectedButtonStatus,\n connectedModalContentType,\n setConnectedModalContentType,\n connectModalContentType,\n setConnectModalContentType,\n selectedAdapter,\n setSelectedAdapter,\n activeConnector,\n setActiveConnector,\n impersonatedAddress,\n setImpersonatedAddress,\n isConnected,\n setIsConnected,\n customContextValueTransform,\n providerContext,\n ]);\n\n // Create component tree elements\n const errorsProviderElement = <CustomErrorsProvider store={store} customization={customization?.errors} />;\n\n const labelsProviderElement = <LabelsProvider labels={finalLabels}>{children}</LabelsProvider>;\n\n const mainContentElement = (\n <NovaConnectProviderContext.Provider value={contextValue}>\n {errorsProviderElement}\n {labelsProviderElement}\n </NovaConnectProviderContext.Provider>\n );\n\n // Create default provider tree\n const defaultProviderTree = (\n <NovaConnectProviderContext.Provider value={contextValue}>\n {errorsProviderElement}\n {labelsProviderElement}\n </NovaConnectProviderContext.Provider>\n );\n\n // Use custom provider tree renderer if provided\n const finalProviderTree = customProviderTreeRenderer(\n defaultProviderTree,\n {\n ErrorsProvider: errorsProviderElement,\n LabelsProvider: labelsProviderElement,\n MainContent: mainContentElement,\n },\n providerContext,\n );\n\n return <>{finalProviderTree}</>;\n}\n\n// Add display name for better debugging\nNovaConnectProvider.displayName = 'NovaConnectProvider';\n"]}