@naculus/connect-appkit-ui 0.1.9 → 0.2.0
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.
- package/README.md +4 -4
- package/dist/index.cjs +10 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +696 -0
- package/dist/index.d.ts +696 -0
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/styles/index.css +2 -0
- package/dist/styles/tokens.css +44 -0
- package/dist/styles/utilities.css +14 -0
- package/package.json +15 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/ConnectButtonAdapter.tsx","../src/contexts/WalletConnectContext.tsx","../src/hooks/useEIP6963.ts","../src/hooks/useIsMobile.ts","../src/components/ChainSelector.tsx","../src/lib/cn.ts","../src/assets/chains/index.ts","../src/contexts/ComponentRegistry.tsx","../src/components/AccountButton.tsx","../src/components/QRCodeModal.tsx","../src/lib/ui-defaults.tsx","../src/components/SignInButton.tsx","../src/components/SeedPhraseBackup.tsx","../src/components/ErrorBoundary.tsx","../src/components/AppKit.tsx","../src/components/Web3ConnectUI.tsx","../src/contexts/ThemeContext.tsx","../src/lib/css-variables.ts","../src/components/RouteSelector.tsx","../src/components/SmartWalletToggle.tsx","../src/components/SmartWalletSettings.tsx","../src/components/AddressWarningDialog.tsx","../src/components/WalletPicker.tsx"],"sourcesContent":["export { ConnectButton } from \"./components/ConnectButton\";\nexport type { ConnectButtonProps } from \"./components/ConnectButton\";\n\nexport { ChainSelector } from \"./components/ChainSelector\";\nexport type { ChainSelectorProps } from \"./components/ChainSelector\";\n\nexport { AccountButton } from \"./components/AccountButton\";\nexport type { AccountButtonProps } from \"./components/AccountButton\";\n\nexport { useIsMobile } from \"./hooks/useIsMobile\";\nexport { useEIP6963 } from \"./hooks/useEIP6963\";\nexport type { DiscoveredWallet, UseEIP6963Result } from \"./hooks/useEIP6963\";\n\nexport { cn } from \"./lib/cn\";\n\nexport {\n Web3ComponentProvider,\n useComponentRegistry,\n useComponent,\n} from \"./contexts/ComponentRegistry\";\nexport type {\n ComponentRegistry,\n Web3ComponentProviderProps,\n} from \"./contexts/ComponentRegistry\";\n\nexport {\n ThemeProvider,\n useTheme,\n useThemeVariable,\n} from \"./contexts/ThemeContext\";\nexport type {\n ThemeOverride,\n ThemeProviderProps,\n ThemePriority,\n} from \"./contexts/ThemeContext\";\n\nexport {\n WalletConnectProvider,\n useWalletConnect,\n useWalletConnectOptional,\n} from \"./contexts/WalletConnectContext\";\nexport type {\n WalletConnectState,\n WalletConnectContextValue,\n WalletConnectProviderProps,\n QRStatus,\n} from \"./contexts/WalletConnectContext\";\n\nexport { QRCodeModal } from \"./components/QRCodeModal\";\nexport { ErrorBoundary } from \"./components/ErrorBoundary\";\nexport type { ErrorBoundaryProps } from \"./components/ErrorBoundary\";\nexport type { QRCodeModalProps, QRCodeModalStatus } from \"./components/QRCodeModal\";\n\n// ── SIWx Sign-In Button ──────────────────────────────────────────\nexport { SignInButton } from \"./components/SignInButton\";\nexport type { SignInButtonProps } from \"./components/SignInButton\";\n\nexport { Web3ConnectUI, useDetectionMode } from \"./components/Web3ConnectUI\";\nexport type { Web3ConnectUIProps, DetectionMode } from \"./components/Web3ConnectUI\";\n\n// ── Seed Phrase Backup ────────────────────────────────────────────\nexport { SeedPhraseBackup } from \"./components/SeedPhraseBackup\";\nexport type { SeedPhraseBackupProps } from \"./components/SeedPhraseBackup\";\n\n// ── AppKit ────────────────────────────────────────────────────────\nexport { AppKit, useAppKit, AppKitButton, AppKitChainSelector } from \"./components/AppKit\";\nexport type { AppKitProps, AppKitContextValue, AppKitButtonProps, AppKitChainSelectorProps } from \"./components/AppKit\";\n\n// ── RouteSelector (Phase 5.3 — Cross-Chain Routing UI) ─────────────\nexport { RouteSelector } from \"./components/RouteSelector\";\nexport type { RouteSelectorProps, TokenDisplay } from \"./components/RouteSelector\";\n\n// ── Smart Wallet ───────────────────────────────────────────────────\nexport { SmartWalletToggle } from \"./components/SmartWalletToggle\";\nexport type { SmartWalletToggleProps } from \"./components/SmartWalletToggle\";\n\nexport { SmartWalletSettings } from \"./components/SmartWalletSettings\";\nexport type { SmartWalletSettingsProps, SmartWalletConfig, AccountType, PaymasterType, BundlerPreset } from \"./components/SmartWalletSettings\";\n\nexport { AddressWarningDialog } from \"./components/AddressWarningDialog\";\nexport type { AddressWarningDialogProps } from \"./components/AddressWarningDialog\";\n\nexport { WalletPicker } from \"./components/WalletPicker\";\nexport type { WalletPickerProps } from \"./components/WalletPicker\";\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useRef } from \"react\"\nimport { AppkitConnectButton } from \"@naculus/connect-appkit-react\"\nimport { useWalletConnectOptional } from \"../contexts/WalletConnectContext\"\nimport { useEIP6963 } from \"../hooks/useEIP6963\"\nimport { useIsMobile } from \"../hooks/useIsMobile\"\n\nexport interface ConnectButtonProps {\n className?: string\n isConnected?: boolean\n isConnecting?: boolean\n onConnect?: (walletKind: \"injected\" | \"walletconnect\", closeModal: () => void, walletId?: string) => void\n onDisconnect?: () => void\n onMobileDeepLink?: () => void\n mobileWalletName?: string\n startPairing?: () => Promise<string>\n completePairing?: () => Promise<any>\n address?: string\n balance?: string | null\n balanceSymbol?: string\n tokenBalances?: Array<{ symbol: string; formatted: string | null; name?: string }>\n isBalanceLoading?: boolean\n explorerUrl?: string\n explorerLabel?: string\n}\n\n/**\n * React adapter that bridges hook ecosystem to the Stencil WC.\n */\nexport function ConnectButtonAdapter({\n className,\n isConnected: extConnected,\n isConnecting: extConnecting,\n onConnect,\n onDisconnect,\n onMobileDeepLink,\n mobileWalletName,\n startPairing,\n completePairing,\n address,\n balance,\n balanceSymbol,\n tokenBalances,\n isBalanceLoading,\n explorerUrl,\n explorerLabel,\n}: ConnectButtonProps) {\n const wcCtx = useWalletConnectOptional()\n const { wallets } = useEIP6963()\n const isMobile = useIsMobile()\n\n const [qrUri, setQrUri] = useState<string | null>(null)\n const [qrLoading, setQrLoading] = useState(false)\n const [qrError, setQrError] = useState<string | null>(null)\n const pairingRef = useRef({ aborted: false })\n\n // Sync WC context to WC props\n useEffect(() => {\n if (!wcCtx) return\n const { qrStatus, qrUri: ctxUri, error: ctxErr } = wcCtx.state\n if (qrStatus === \"loading\") { setQrLoading(true); setQrUri(null); setQrError(null) }\n else if (qrStatus === \"ready\" && ctxUri) { setQrLoading(false); setQrUri(ctxUri); setQrError(null) }\n else if (qrStatus === \"error\") { setQrLoading(false); setQrError(ctxErr) }\n else if (qrStatus === \"idle\") { setQrLoading(false); setQrUri(null); setQrError(null) }\n }, [wcCtx?.state?.qrStatus, wcCtx?.state?.qrUri, wcCtx?.state?.error])\n\n const emitConnect = useCallback((kind: string, walletId?: string) => {\n if (kind === \"walletconnect\") {\n if (wcCtx) { wcCtx.connectWalletConnect(); return }\n if (startPairing && completePairing) {\n setQrLoading(true); setQrError(null)\n pairingRef.current.aborted = false\n startPairing().then(uri => {\n if (pairingRef.current.aborted) return\n setQrUri(uri); setQrLoading(false)\n completePairing().then(() => {\n if (!pairingRef.current.aborted) setQrUri(null)\n }).catch(err => {\n if (!pairingRef.current.aborted) setQrError(err instanceof Error ? err.message : \"Connection failed\")\n })\n }).catch(err => {\n if (!pairingRef.current.aborted) { setQrLoading(false); setQrError(err instanceof Error ? err.message : \"Connection failed\") }\n })\n return\n }\n }\n onConnect?.(kind as any, () => {}, walletId)\n }, [wcCtx, startPairing, completePairing, onConnect])\n\n return (\n <div className={className}>\n <AppkitConnectButton\n connected={extConnected ?? false}\n connecting={extConnecting ?? false}\n address={address ?? \"\"}\n balance={balance ?? null}\n balanceSymbol={balanceSymbol ?? \"ETH\"}\n isBalanceLoading={isBalanceLoading ?? false}\n tokenBalancesJson={JSON.stringify(tokenBalances ?? [])}\n explorerUrl={explorerUrl ?? \"\"}\n explorerLabel={explorerLabel ?? \"\"}\n walletsJson={JSON.stringify(wallets)}\n isMobile={isMobile}\n mobileWalletName={mobileWalletName ?? \"\"}\n qrUri={qrUri}\n qrLoading={qrLoading}\n qrError={qrError}\n onAppkitConnect={(e: CustomEvent<{ kind: string; walletId?: string }>) => {\n emitConnect(e.detail.kind, e.detail.walletId)\n }}\n onAppkitDisconnect={() => onDisconnect?.()}\n onAppkitStartPairing={() => emitConnect(\"walletconnect\")}\n onAppkitRetry={() => { pairingRef.current.aborted = true; setQrError(null); setQrUri(null); emitConnect(\"walletconnect\") }}\n onAppkitMobileDeepLink={() => onMobileDeepLink?.()}\n onAppkitCopyAddress={(e: CustomEvent<string>) => {\n navigator.clipboard?.writeText(e.detail).catch(() => {})\n }}\n />\n </div>\n )\n}\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useRef } from \"react\";\nimport { useWeb3 } from \"@naculus/connect-appkit-react\";\n\nexport type QRStatus = \"idle\" | \"loading\" | \"ready\" | \"error\" | \"cancelled\";\n\nexport interface WalletConnectState {\n qrUri: string | null;\n showQR: boolean;\n qrStatus: QRStatus;\n error: string | null;\n}\n\nexport interface WalletConnectContextValue {\n state: WalletConnectState;\n connectWalletConnect: () => Promise<void>;\n cancelQR: () => void;\n retryQR: () => void;\n}\n\nconst WalletConnectContext = createContext<WalletConnectContextValue | null>(null);\n\nexport interface WalletConnectProviderProps {\n children: React.ReactNode;\n}\n\nexport function WalletConnectProvider({ children }: WalletConnectProviderProps) {\n const web3 = useWeb3();\n \n const [qrUri, setQrUri] = useState<string | null>(null);\n const [showQR, setShowQR] = useState(false);\n const [qrStatus, setQrStatus] = useState<QRStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const cancelQR = useCallback(() => {\n setQrUri(null);\n setShowQR(false);\n setQrStatus(\"cancelled\");\n setError(null);\n }, []);\n\n const connectRef = useRef<() => Promise<void>>(undefined)\n connectRef.current = async () => {\n if (!web3.startPairing || !web3.completePairing) {\n setError(\"WalletConnect pairing not available\")\n setQrStatus(\"error\")\n return\n }\n setQrStatus(\"loading\")\n setError(null)\n setShowQR(true)\n try {\n const uri = await web3.startPairing()\n setQrUri(uri)\n setQrStatus(\"ready\")\n try {\n await web3.completePairing()\n setTimeout(() => { setShowQR(false); setQrUri(null); setQrStatus(\"idle\") }, 1000)\n } catch (err) {\n setQrStatus(\"error\")\n setError(err instanceof Error ? err.message : \"Connection failed\")\n }\n } catch (err) {\n setQrStatus(\"error\")\n setError(err instanceof Error ? err.message : \"Failed to generate QR code\")\n }\n }\n\n const connectWalletConnect = useCallback(async () => {\n connectRef.current?.()\n }, [])\n\n const retryQR = useCallback(() => {\n setQrUri(null)\n setError(null)\n setQrStatus(\"loading\")\n connectRef.current?.()\n }, [])\n\n const state = useMemo<WalletConnectState>(\n () => ({\n qrUri,\n showQR,\n qrStatus,\n error,\n }),\n [qrUri, showQR, qrStatus, error]\n );\n\n const value = useMemo<WalletConnectContextValue>(\n () => ({\n state,\n connectWalletConnect,\n cancelQR,\n retryQR,\n }),\n [state, connectWalletConnect, cancelQR, retryQR]\n );\n\n return (\n <WalletConnectContext.Provider value={value}>\n {children}\n </WalletConnectContext.Provider>\n );\n}\n\nexport function useWalletConnect(): WalletConnectContextValue {\n const context = useContext(WalletConnectContext);\n if (!context) {\n throw new Error(\"useWalletConnect must be used within a WalletConnectProvider\");\n }\n return context;\n}\n\nexport function useWalletConnectOptional(): WalletConnectContextValue | null {\n return useContext(WalletConnectContext);\n}","\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from \"react\"\n\nexport interface DiscoveredWallet {\n id: string\n name: string\n icon?: string\n rdns: string\n provider?: unknown\n}\n\nexport interface UseEIP6963Result {\n wallets: DiscoveredWallet[]\n isDetecting: boolean\n hasWallets: boolean\n}\n\n/**\n * Hook to discover EIP-6963 wallets (browser extensions like MetaMask, Phantom, etc.)\n * Uses the eip6963:announceProvider / requestProvider protocol.\n */\nexport function useEIP6963(): UseEIP6963Result {\n const [wallets, setWallets] = useState<DiscoveredWallet[]>([])\n const [isDetecting, setIsDetecting] = useState(true)\n const seenRef = useRef(new Set<string>())\n\n useEffect(() => {\n seenRef.current.clear()\n setIsDetecting(true)\n\n const handleAnnounce = (e: Event) => {\n const detail = (e as CustomEvent).detail\n const info = detail?.info\n const provider = detail?.provider\n\n if (!info?.rdns || seenRef.current.has(info.rdns)) return\n seenRef.current.add(info.rdns)\n\n setWallets(prev => {\n if (prev.find(w => w.id === info.rdns)) return prev\n return [...prev, {\n id: info.rdns,\n name: info.name || info.rdns,\n icon: info.icon || \"\",\n rdns: info.rdns,\n provider,\n }]\n })\n }\n\n window.addEventListener(\"eip6963:announceProvider\", handleAnnounce)\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"))\n\n // Give wallets time to announce, then mark done\n const timer = setTimeout(() => setIsDetecting(false), 500)\n\n return () => {\n window.removeEventListener(\"eip6963:announceProvider\", handleAnnounce)\n clearTimeout(timer)\n }\n }, [])\n\n return {\n wallets,\n isDetecting,\n hasWallets: wallets.length > 0,\n }\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * Hook that detects if the user is on a mobile device.\n * Returns true for iOS (iPhone, iPad, iPod) and Android devices.\n */\nexport function useIsMobile(): boolean {\n const [mobile, setMobile] = useState(false);\n\n useEffect(() => {\n if (typeof navigator === \"undefined\" || typeof window === \"undefined\") return;\n const ua = navigator.userAgent.toLowerCase();\n setMobile(/(iphone|ipad|ipod|android|mobile)/i.test(ua));\n }, []);\n\n return mobile;\n}\n","\"use client\"\nimport { logger } from \"@naculus/connect-core\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { useChain, useWallet } from \"@naculus/connect-appkit-react\";\nimport { cn } from \"../lib/cn\";\nimport { getChainLogo } from \"../assets/chains\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\n\nexport interface ChainSelectorProps {\n className?: string;\n showLabel?: boolean;\n variant?: \"dropdown\" | \"buttons\" | \"minimal\";\n}\n\nfunction ChainLogo({ chainId, className }: { chainId: string; className?: string }) {\n const svgStr = getChainLogo(chainId)\n if (!svgStr) return null\n return (\n <span\n className={cn(\"inline-flex items-center justify-center shrink-0\", className)}\n dangerouslySetInnerHTML={{ __html: svgStr }}\n />\n )\n}\n\nexport function ChainSelector({\n className,\n showLabel = true,\n variant = \"dropdown\"\n}: ChainSelectorProps) {\n const { currentChain, availableChains, switchChain, isEvm } = useChain();\n const { isConnected } = useWallet();\n const [isOpen, setIsOpen] = useState(false);\n const registry = useComponentRegistry();\n const RegistryButton = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n if (!isConnected) {\n return null;\n }\n\n const chainName = currentChain?.name ?? \"Unknown Chain\";\n const hasMultipleChains = availableChains.length > 1;\n\n // Minimal variant: just show chain logo and name\n if (variant === \"minimal\") {\n return (\n <div className={cn(\"inline-flex items-center gap-1.5 text-xs text-muted-foreground\", className)}>\n {currentChain && <ChainLogo chainId={`${currentChain.namespace}:${currentChain.id}`} className=\"h-3.5 w-3.5\" />}\n {chainName}\n </div>\n );\n }\n\n // Buttons variant: show all chains as clickable buttons\n if (variant === \"buttons\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {availableChains.map((chain) => {\n const isActive = chain.id === currentChain?.id && chain.namespace === currentChain?.namespace;\n const chainId = `${chain.namespace}:${chain.id}`;\n return (\n <RegistryButton\n key={chainId}\n className={isActive ? cn(\"bg-accent\", \"border-primary\") : \"\"}\n onClick={() => {\n if (!isActive) {\n switchChain(chainId).catch((e: unknown) => logger.error(\"ui/ChainSelector\", \"switchChain failed\", e));\n }\n }}\n >\n <ChainLogo chainId={chainId} className=\"h-4 w-4\" />\n {chain.name}\n {chain.token && <span className=\"text-xs opacity-60\">{chain.token}</span>}\n </RegistryButton>\n );\n })}\n </div>\n );\n }\n\n // Dropdown variant (default) — show current chain as read-only if only one chain\n if (!hasMultipleChains) {\n return (\n <div className={cn(\"inline-flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm opacity-60 cursor-default\", className)}>\n {currentChain && <ChainLogo chainId={`${currentChain.namespace}:${currentChain.id}`} className=\"h-4 w-4\" />}\n {chainName}\n </div>\n );\n }\n\n return (\n <div ref={dropdownRef} className={cn(\"relative inline-block\", className)}>\n <RegistryButton onClick={() => setIsOpen(!isOpen)}>\n {currentChain && <ChainLogo chainId={`${currentChain.namespace}:${currentChain.id}`} className=\"h-4 w-4\" />}\n {chainName}\n <svg\n className={cn(\"h-3 w-3 transition-transform\", isOpen && \"rotate-180\")}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </RegistryButton>\n\n {isOpen && (\n <div className=\"absolute left-0 top-full mt-1 z-50 min-w-[180px] rounded-lg border bg-card p-1 shadow-lg animate-in fade-in zoom-in-95 duration-200\">\n {showLabel && (\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Switch Network\n </div>\n )}\n {availableChains.map((chain) => {\n const isActive = chain.id === currentChain?.id && chain.namespace === currentChain?.namespace;\n const chainId = `${chain.namespace}:${chain.id}`;\n return (\n <RegistryButton\n key={chainId}\n onClick={() => {\n if (!isActive) {\n switchChain(chainId).catch((e: unknown) => logger.error(\"ui/ChainSelector\", \"switchChain failed\", e));\n }\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-2 text-sm transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isActive\n ? \"bg-accent font-medium\"\n : \"hover:bg-accent/50\"\n )}\n >\n <ChainLogo chainId={chainId} className=\"h-4 w-4\" />\n <span className=\"flex-1 text-left\">{chain.name}</span>\n {chain.token && (\n <span className=\"text-xs text-muted-foreground\">{chain.token}</span>\n )}\n {isActive && (\n <svg className=\"h-4 w-4 text-primary\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </RegistryButton>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}","/**\n * Chain Logos Registry\n *\n * Inline SVG icons (mini 24×24) for supported chains.\n * Follows the same pattern as wallet-registry.ts for library compatibility\n * (tsup bundles inline SVG strings, but not external asset files).\n *\n * Sources:\n * - https://cryptologos.cc — Ethereum, Polygon, BNB, Arbitrum, Avalanche, Fantom\n * - https://github.com/trustwallet/assets — Optimism\n */\n\n// ── Chain SVG Icons (compact, viewBox-preserved) ──────────────────\n\nexport const ETH_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 0l-.26.97v28.15l.26.26 13.07-7.72L12 0z\" fill=\"#8C8C8C\"/><path d=\"M12 0L-.87 21.69l12.87 7.72V0z\" fill=\"#3C3C3B\"/><path d=\"M12 31.88l-.16.2v10.55l.16.47 13.08-18.42L12 31.88z\" fill=\"#8C8C8C\"/><path d=\"M12 42.9V31.88L-.87 24.68 12 42.9z\" fill=\"#3C3C3B\"/><path d=\"M12 28.41l13.07-7.72L12 14.09v14.32z\" fill=\"#141414\"/><path d=\"M-.87 20.69L12 28.41V14.09l-12.87 6.6z\" fill=\"#393939\"/></svg>`\n\nexport const POLYGON_LOGO = `<svg viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15 12.3l-3.7 2.2-3.8-2.2V7.9L11.3 5.7 15 7.9v2.7l-2.2 1.3-1.5-.9v-2l1.5.9 2.2-1.3V7.9L11.3 4 6 7.9v6.3l5.3 3.1 5.3-3.1-1.6-2.8z\" fill=\"#6C00F6\"/></svg>`\n\nexport const BSC_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#F0B90B\"/><path d=\"M12 4l2.7 1.6L14.7 7 12 5.4 9.3 7l-.7-.4L12 4zm4.7 2.7l-2.7 1.6V10l4 2.3v4.7L16 18.7v-4l-1.3-.7v4L12 20l-2.7-1.6v-4L8 14.7v4l-1.3-.7V12.3l4-2.3V8.3l-2.7-1.6.7-.4L12 8l2.7-1.7.7.4z\" fill=\"white\"/></svg>`\n\nexport const ARBITRUM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 1.5c.3 0 .6.1.8.2l8.8 5.1c.5.3.9.9.9 1.5v10.2c0 .6-.3 1.2-.9 1.5l-8.8 5.1c-.3.2-.6.2-.8.2s-.6-.1-.8-.2l-8.8-5.1c-.5-.3-.9-.9-.9-1.5V8.3c0-.6.3-1.2.9-1.5l8.8-5.1c.3-.2.6-.2.8-.2z\" fill=\"#213147\"/><path d=\"M14.7 13.8l-1.2 3.2c0 .1 0 .2.1.3l2 5.5 2.3-1.3-2.8-7.6c-.1-.2-.3-.2-.4-.1z\" fill=\"#12AAFF\"/><path d=\"M16.3 8.5c0-.2-.3-.2-.4 0l-1.1 3.2c0 .1 0 .2.1.3l3.3 9 2.3-1.3-4.2-9.1v-.1z\" fill=\"#12AAFF\"/><path d=\"M12 3.5c.1 0 .2 0 .3.1l8.8 5.1c.1.1.2.2.2.3v10.2c0 .1-.1.2-.2.3l-8.8 5.1c-.1 0-.2.1-.3.1s-.2 0-.3-.1l-8.8-5.1c-.1-.1-.2-.2-.2-.3V9c0-.1.1-.2.2-.3l8.8-5.1c.1 0 .2-.1.3-.1z\" fill=\"#9DCCED\" fill-opacity=\"0.3\"/><path d=\"M13.3 6.2h-2.2c-.2 0-.3.1-.4.3L5.9 19.6l2.3 1.3L13 6.5c0-.1-.1-.3-.2-.3h.4z\" fill=\"white\"/><path d=\"M15.2 6.2H13c-.2 0-.3.1-.4.3L8.1 21.4l2.3 1.3 6-16.4c0-.1-.1-.3-.2-.3v.2z\" fill=\"white\"/></svg>`\n\nexport const OPTIMISM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#FF0420\"/><path d=\"M8.5 16c-.5 0-.9-.1-1.3-.3-.4-.2-.7-.5-1-.8-.3-.4-.4-.8-.4-1.3V10c0-.5.1-1 .4-1.4.3-.4.6-.7 1-.9.4-.2.8-.3 1.3-.3.4 0 .8.1 1.2.2.3.2.6.4.8.7l-1 1c-.2-.2-.4-.3-.6-.4-.2-.1-.5-.2-.8-.2-.3 0-.6.1-.9.2-.3.2-.5.4-.6.7-.1.3-.2.6-.2 1v3.5c0 .3.1.6.2.9.1.3.3.5.6.6.3.2.6.2.9.2.3 0 .6-.1.8-.2.2-.1.4-.3.6-.5l1 1c-.2.3-.5.5-.8.7-.4.2-.9.3-1.4.3z\" fill=\"white\"/><path d=\"M15.5 16c-.5 0-.9-.1-1.3-.3-.4-.2-.7-.5-1-.8-.2-.4-.4-.8-.4-1.3V10c0-.5.1-1 .4-1.4.2-.4.5-.7.9-.9.4-.2.8-.3 1.3-.3.5 0 1 .1 1.4.3.4.2.7.5.9.9.2.4.3.9.3 1.4v.7h-2.9v-1.1c0-.3-.1-.6-.2-.9-.1-.3-.3-.5-.5-.6-.2-.1-.5-.2-.8-.2-.3 0-.6.1-.8.2-.3.2-.5.4-.6.7-.1.3-.2.6-.2 1v3.5c0 .3.1.6.2.8.1.3.3.5.6.6.2.2.5.2.8.2.3 0 .6-.1.8-.2.2-.1.4-.3.5-.6.1-.3.2-.6.2-1v-1.1h2.9v.7c0 .5-.1 1-.3 1.4-.2.4-.5.7-.9.9-.4.2-.9.3-1.4.3z\" fill=\"white\"/></svg>`\n\nexport const AVALANCHE_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#E84142\"/><path d=\"M8.6 16.8H6.3c-.5 0-.8-.1-1-.3-.2-.2-.3-.5-.3-.8 0-.2 0-.4.1-.6l5.8-10.7c.2-.4.5-.7.8-.8.3-.1.5-.1.7 0 .2.1.5.3.7.8l1.2 2.1.1.2c.3.5.5.9.5 1.3.1.4.1.8 0 1.1-.1.4-.3.8-.6 1.3l-3 5.4c-.2.5-.5.8-.8 1-.4.2-.7.2-1.2.2z\" fill=\"white\"/><path d=\"M14.5 16.8h3.3c.5 0 .7-.1 1-.3.2-.2.3-.5.3-.8 0-.2-.1-.4-.3-.7l-1.7-3-.2-.3c-.2-.4-.4-.7-.6-.8-.2-.1-.4-.1-.6 0-.2.1-.4.3-.6.8l-1.6 3c-.2.4-.4.7-.4.9 0 .2.1.5.3.7.1.1.4.3.9.3z\" fill=\"white\"/></svg>`\n\nexport const FANTOM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#1969FF\"/><path d=\"M11.3 3.8c.4-.2 1-.2 1.4 0l4.1 2.2c.2.1.4.3.4.5h0v10.9c0 .2-.1.4-.4.6l-4.1 2.2c-.4.2-1 .2-1.4 0l-4.1-2.2c-.3-.1-.4-.4-.4-.6V6.5c0-.2.1-.4.4-.5l4.1-2.2zm5.3 8.7l-3.9 2c-.4.2-1 .2-1.4 0l-3.9-2v4.8l3.9 2c.2.1.5.2.7.2.2 0 .5-.1.7-.2l3.9-2v-4.8z\" fill=\"white\"/></svg>`\n\n// ── Registry ──────────────────────────────────────────────────────\n\nexport const CHAIN_LOGOS: Record<string, string> = {\n \"eip155:1\": ETH_LOGO, // Ethereum\n \"eip155:137\": POLYGON_LOGO, // Polygon\n \"eip155:56\": BSC_LOGO, // BSC\n \"eip155:42161\": ARBITRUM_LOGO, // Arbitrum\n \"eip155:10\": OPTIMISM_LOGO, // Optimism\n \"eip155:43114\": AVALANCHE_LOGO, // Avalanche\n \"eip155:250\": FANTOM_LOGO, // Fantom\n \"eip155:11155111\": ETH_LOGO, // Sepolia\n}\n\n/**\n * Resolve the chain logo for a given chain ID (e.g. \"eip155:1\").\n * Returns the SVG string, or undefined if unknown.\n */\nexport function getChainLogo(chainId: string): string | undefined {\n return CHAIN_LOGOS[chainId]\n}\n","import React, { createContext, useContext, useMemo } from 'react'\n\n// ── Business components ──────────────────────────────────\nimport { ConnectButton as BizConnectButton } from '../components/ConnectButton'\nimport { AccountButton as BizAccountButton } from '../components/AccountButton'\nimport { ChainSelector as BizChainSelector } from '../components/ChainSelector'\nimport { QRCodeModal as BizQRCodeModal } from '../components/QRCodeModal'\nimport { SignInButton as BizSignInButton } from '../components/SignInButton'\nimport { SeedPhraseBackup as BizSeedPhraseBackup } from '../components/SeedPhraseBackup'\nimport { ErrorBoundary as BizErrorBoundary } from '../components/ErrorBoundary'\nimport { AppKit as BizAppKit, AppKitButton as BizAppKitButton, AppKitChainSelector as BizAppKitChainSelector } from '../components/AppKit'\nimport { Web3ConnectUI as BizWeb3ConnectUI } from '../components/Web3ConnectUI'\n\nexport interface ComponentRegistry {\n // ── Layer 1: Base UI (from shadcn or WC) ────────────────────────\n Button?: React.ComponentType<any>\n Card?: React.ComponentType<any>\n Badge?: React.ComponentType<any>\n Switch?: React.ComponentType<any>\n Checkbox?: React.ComponentType<any>\n Tabs?: React.ComponentType<any>\n TabsContent?: React.ComponentType<any>\n TabsList?: React.ComponentType<any>\n TabsTrigger?: React.ComponentType<any>\n DropdownMenu?: React.ComponentType<any>\n Avatar?: React.ComponentType<any>\n Skeleton?: React.ComponentType<any>\n Tooltip?: React.ComponentType<any>\n Popover?: React.ComponentType<any>\n Progress?: React.ComponentType<any>\n Separator?: React.ComponentType<any>\n ScrollArea?: React.ComponentType<any>\n Input?: React.ComponentType<any>\n Select?: React.ComponentType<any>\n Label?: React.ComponentType<any>\n Sheet?: React.ComponentType<any>\n Modal?: React.ComponentType<any>\n Dialog?: React.ComponentType<any>\n DialogContent?: React.ComponentType<any>\n DialogHeader?: React.ComponentType<any>\n DialogTitle?: React.ComponentType<any>\n\n // ── Layer 2: Business ──────────────────────────────────────────\n ConnectButton?: React.ComponentType<any>\n AccountButton?: React.ComponentType<any>\n ChainSelector?: React.ComponentType<any>\n QRCodeModal?: React.ComponentType<any>\n SignInButton?: React.ComponentType<any>\n SeedPhraseBackup?: React.ComponentType<any>\n ErrorBoundary?: React.ComponentType<any>\n AppKit?: React.ComponentType<any>\n AppKitButton?: React.ComponentType<any>\n AppKitChainSelector?: React.ComponentType<any>\n Web3ConnectUI?: React.ComponentType<any>\n}\n\nexport const DEFAULT_COMPONENTS: ComponentRegistry = {\n // Business defaults\n ConnectButton: BizConnectButton,\n AccountButton: BizAccountButton,\n ChainSelector: BizChainSelector,\n QRCodeModal: BizQRCodeModal,\n SignInButton: BizSignInButton,\n SeedPhraseBackup: BizSeedPhraseBackup,\n ErrorBoundary: BizErrorBoundary,\n AppKit: BizAppKit,\n AppKitButton: BizAppKitButton,\n AppKitChainSelector: BizAppKitChainSelector,\n Web3ConnectUI: BizWeb3ConnectUI,\n}\n\nconst ComponentRegistryContext = createContext<ComponentRegistry>({})\n\nexport interface Web3ComponentProviderProps {\n children: React.ReactNode\n components?: ComponentRegistry\n}\n\nexport function Web3ComponentProvider({\n children,\n components = {},\n}: Web3ComponentProviderProps) {\n const value = useMemo(\n () => ({ ...DEFAULT_COMPONENTS, ...components }),\n [components]\n )\n return (\n <ComponentRegistryContext.Provider value={value}>\n {children}\n </ComponentRegistryContext.Provider>\n )\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n return useContext(ComponentRegistryContext)\n}\n\nexport function useComponent<K extends keyof ComponentRegistry>(\n name: K\n): ComponentRegistry[K] | undefined {\n const registry = useComponentRegistry()\n return registry[name]\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Wallet } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\n\nexport interface AccountButtonProps {\n className?: string;\n showAddress?: boolean;\n showBalance?: boolean;\n address?: string;\n balance?: string | null;\n balanceSymbol?: string;\n onConnect?: () => void;\n}\n\nfunction DefaultAvatar({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n {children}\n </div>\n );\n}\n\nexport function AccountButton({\n className,\n showAddress = true,\n showBalance = false,\n address: externalAddress,\n balance: externalBalance,\n balanceSymbol,\n onConnect,\n}: AccountButtonProps) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n\n if (!externalAddress) {\n return (\n <Button\n aria-label=\"Connect Wallet\"\n onClick={onConnect}\n className={className}\n >\n <Wallet size={18} className=\"shrink-0\" />\n Connect Wallet\n </Button>\n );\n }\n\n const address = externalAddress.includes(\":\")\n ? externalAddress.split(\":\").pop()!\n : externalAddress;\n\n const shortAddress = address.slice(0, 6) + \"...\" + address.slice(-4);\n\n const formattedBalance = externalBalance !== null && externalBalance !== undefined\n ? parseFloat(externalBalance).toLocaleString(undefined, { maximumFractionDigits: 4 }) + \" \" + (balanceSymbol ?? \"ETH\")\n : null;\n\n return (\n <Button className={className}>\n <DefaultAvatar>W</DefaultAvatar>\n <div className=\"flex flex-col items-start gap-0\">\n {showAddress && (\n <span className=\"font-mono text-xs\">{shortAddress}</span>\n )}\n {showBalance && formattedBalance && (\n <span className=\"text-xs text-muted-foreground\">{formattedBalance}</span>\n )}\n {showBalance && !formattedBalance && externalBalance === null && (\n <span className=\"text-xs text-muted-foreground\">Loading...</span>\n )}\n </div>\n </Button>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { Smartphone, RefreshCw, CheckCircle2, AlertCircle, Loader2 } from \"lucide-react\";\nimport type QRCodeType from \"qrcode\";\nimport { DefaultDialog } from \"../lib/ui-defaults\";\nimport { cn } from \"../lib/cn\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport { useIsMobile } from \"../hooks/useIsMobile\";\n\nexport type QRCodeModalStatus = \"pending\" | \"scanned\" | \"expired\" | \"error\";\n\nexport interface QRCodeModalProps {\n uri: string | null;\n open: boolean;\n onClose: () => void;\n onDeepLink?: (uri: string) => void;\n onRetry?: () => void;\n status?: QRCodeModalStatus;\n showDeepLink?: boolean;\n timeoutMs?: number;\n title?: string;\n description?: string;\n className?: string;\n}\n\nasync function renderQR(canvas: HTMLCanvasElement, uri: string): Promise<void> {\n const qrcode = (await import(\"qrcode\")) as unknown as typeof QRCodeType;\n return new Promise((resolve, reject) => {\n qrcode.toCanvas(canvas, uri, { width: 280, margin: 2 }, (err: Error | null | undefined) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\nexport function QRCodeModal({\n uri, open, onClose, onDeepLink, onRetry,\n status = \"pending\",\n showDeepLink: explicitShowDeepLink,\n timeoutMs = 5 * 60 * 1000,\n title = \"Scan with WalletConnect\",\n description = \"Open your wallet app and scan this QR code to connect.\",\n className,\n}: QRCodeModalProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState(false);\n const [timeElapsed, setTimeElapsed] = useState(0);\n const isMobile = useIsMobile();\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string; children?: React.ReactNode; className?: string }> | undefined;\n const showDeepLink = explicitShowDeepLink ?? isMobile;\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n if (!open || !uri || !canvasRef.current) return;\n setQrError(false);\n renderQR(canvasRef.current, uri).catch(() => setQrError(true));\n }, [open, uri]);\n\n useEffect(() => {\n if (!open || status !== \"pending\") {\n if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; }\n setTimeElapsed(0);\n return;\n }\n const start = Date.now();\n timerRef.current = setInterval(() => setTimeElapsed(Date.now() - start), 1000);\n return () => { if (timerRef.current) clearInterval(timerRef.current); };\n }, [open, status, timeoutMs]);\n\n const isExpired = timeElapsed >= timeoutMs && status === \"pending\";\n const needsNewCode = isExpired || status === \"expired\" || status === \"error\";\n const remaining = Math.max(0, Math.ceil((timeoutMs - timeElapsed) / 1000));\n const minutes = Math.floor(remaining / 60);\n const seconds = remaining % 60;\n const progress = Math.min(timeElapsed / timeoutMs, 1);\n\n const handleDeepLink = useCallback(() => { if (uri && onDeepLink) onDeepLink(uri); }, [uri, onDeepLink]);\n\n const qrContent = uri && !isExpired && status === \"pending\" ? (\n qrError ? (\n <div className=\"w-[280px] h-[280px] flex flex-col items-center justify-center bg-muted rounded-lg gap-2\">\n <AlertCircle size={24} className=\"text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Failed to render QR code</span>\n </div>\n ) : (\n <canvas\n ref={canvasRef}\n width={280}\n height={280}\n className=\"rounded-lg border border-border\"\n />\n )\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-3 bg-muted rounded-lg w-[280px] h-[280px]\">\n {status === \"scanned\" ? (\n <CheckCircle2 size={48} className=\"text-[hsl(var(--primary))]\" />\n ) : (\n <AlertCircle size={48} className=\"text-destructive\" />\n )}\n <span className=\"text-sm text-muted-foreground\" data-testid=\"status-label\">\n {status === \"scanned\" ? \"QR code scanned! Connecting...\" :\n isExpired || status === \"expired\" ? \"Connection timed out.\" :\n \"Something went wrong. Try again.\"}\n </span>\n </div>\n );\n\n const ModalComp = registry.Modal as React.ComponentType<React.PropsWithChildren<{ open: boolean; onClose?: () => void; closable?: boolean; title?: string; className?: string; children: React.ReactNode }>> | undefined;\n const ModalToUse = ModalComp ?? DefaultDialog;\n\n return (\n <ModalToUse open={open} onClose={onClose} closable title={title} className={className}>\n <div className=\"p-6\">\n <div className=\"text-center mb-5\">\n <div className=\"flex justify-center mb-3\">\n {status === \"pending\" && !isExpired && (\n <Loader2 size={20} className=\"animate-spin text-primary\" data-testid=\"loader-icon-inline\" />\n )}\n </div>\n <h3 className=\"text-lg font-semibold m-0 text-foreground\">{title}</h3>\n {description && (\n <p className=\"text-sm text-muted-foreground mt-1.5 mb-0\">{description}</p>\n )}\n </div>\n\n <div className=\"flex justify-center mb-4\">{qrContent}</div>\n\n {status === \"pending\" && !isExpired && (\n <div className=\"mb-3\">\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\" role=\"progressbar\"\n aria-valuenow={Math.round((1 - progress) * 100)}\n aria-valuemin={0} aria-valuemax={100}>\n <div\n className=\"h-full bg-primary rounded-full transition-all duration-1000\"\n style={{ width: `${(1 - progress) * 100}%` }}\n />\n </div>\n <p data-testid=\"countdown\" className=\"text-xs text-muted-foreground text-center mt-1.5 mb-0\">\n Expires in {minutes}:{seconds.toString().padStart(2, \"0\")}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2\">\n {showDeepLink && uri && status === \"pending\" && !isExpired && (\n <button\n onClick={handleDeepLink}\n className=\"inline-flex items-center justify-center gap-2 w-full rounded-lg border border-input bg-card px-4 py-2.5 text-sm font-medium text-foreground hover:bg-accent hover:text-accent-foreground transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <Smartphone size={16} /> Open in Wallet App\n </button>\n )}\n {needsNewCode && onRetry && (\n Button ? (\n <Button\n onClick={onRetry}\n variant=\"default\"\n size=\"default\"\n className=\"w-full\"\n >\n <RefreshCw size={16} /> Generate New QR Code\n </Button>\n ) : (\n <button\n onClick={onRetry}\n className=\"inline-flex items-center justify-center gap-2 w-full rounded-lg bg-primary text-primary-foreground px-4 py-2.5 text-sm font-medium hover:bg-primary/90 transition-all duration-200 cursor-pointer border-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <RefreshCw size={16} /> Generate New QR Code\n </button>\n )\n )}\n {Button ? (\n <Button\n onClick={onClose}\n variant=\"outline\"\n size=\"default\"\n className=\"w-full\"\n >\n Cancel\n </Button>\n ) : (\n <button\n onClick={onClose}\n className=\"inline-flex items-center justify-center w-full rounded-lg border border-input bg-transparent px-4 py-2.5 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n </ModalToUse>\n );\n}\n","\"use client\"\n\nimport React, { useEffect } from \"react\"\nimport { cn } from \"./cn\"\nimport { X } from \"lucide-react\"\n\n/** Inline fallback Button — pure CSS, no Radix/shadcn dependency. */\nexport function DefaultButton({\n children,\n className = \"\",\n onClick,\n disabled = false,\n variant = \"default\",\n size = \"default\",\n ...rest\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: \"default\" | \"outline\" | \"ghost\" | \"destructive\"\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\"\n children: React.ReactNode\n}) {\n const variantClasses: Record<string, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\n outline: \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm\",\n }\n const sizeClasses: Record<string, string> = {\n default: \"h-10 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-10 w-10\",\n }\n return (\n <button\n type=\"button\"\n {...rest}\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg\",\n \"text-sm font-medium transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"font-inherit no-underline box-border border-0 m-0\",\n variantClasses[variant],\n sizeClasses[size],\n className\n )}\n >\n {children}\n </button>\n )\n}\n\n/** Inline fallback Dialog — pure CSS, no Radix/shadcn dependency. */\nexport function DefaultDialog({\n open,\n onClose,\n children,\n closable,\n}: {\n open: boolean\n onClose?: () => void\n children: React.ReactNode\n closable?: boolean\n}) {\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = \"hidden\"\n return () => { document.body.style.overflow = prev }\n }, [open])\n\n useEffect(() => {\n if (!open || !onClose) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose()\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [open, onClose])\n\n if (!open) return null\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div className=\"absolute inset-0 bg-black/80\" aria-hidden=\"true\" onClick={onClose} />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className=\"relative z-10 w-full max-w-sm rounded-xl border bg-card text-card-foreground shadow-2xl max-h-[85vh] overflow-y-auto p-6\"\n >\n {closable && onClose && (\n <button\n onClick={onClose}\n type=\"button\"\n aria-label=\"Close modal\"\n className=\"absolute right-4 top-4 z-20 rounded-md p-1 text-muted-foreground hover:text-foreground\"\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M18 6 6 18M6 6l12 12\" data-testid=\"x-icon\" /></svg>\n </button>\n )}\n {children}\n </div>\n </div>\n )\n}\n\nexport function DefaultDialogHeader({\n title,\n onClose,\n showCloseButton = true,\n}: {\n title: string\n onClose?: () => void\n showCloseButton?: boolean\n}) {\n return (\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">{title}</h2>\n {showCloseButton && onClose && (\n <button\n onClick={onClose}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-all duration-200\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n )\n}\n\nexport function DefaultDialogContent({\n children,\n className = \"\",\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return <div className={cn(\"flex flex-col gap-4\", className)}>{children}</div>\n}\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { LogIn, Loader2, CheckCircle2, AlertCircle, X, Copy, Check } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { DefaultDialog } from \"../lib/ui-defaults\"\nimport type { SiwxResult } from \"@naculus/siwx\"\n\nexport interface SignInButtonProps {\n className?: string\n isSignedIn?: boolean\n isSigningIn?: boolean\n result?: SiwxResult | null\n error?: Error | null\n onSignIn?: () => void\n onClearError?: () => void\n children?: React.ReactNode\n}\n\nexport function SignInButton({\n className,\n isSignedIn = false,\n isSigningIn = false,\n result = null,\n error = null,\n onSignIn,\n onClearError,\n children,\n}: SignInButtonProps) {\n const [showDetails, setShowDetails] = useState(false)\n const [copiedSign, setCopiedSign] = useState(false)\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined\n\n const handleCopySignature = async () => {\n if (result?.signature) {\n try {\n await navigator.clipboard.writeText(result.signature)\n setCopiedSign(true)\n setTimeout(() => setCopiedSign(false), 2000)\n } catch {}\n }\n }\n\n // Idle state\n if (!isSignedIn && !isSigningIn && !error) {\n return (\n <Button onClick={onSignIn} className={className} aria-label=\"Sign In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <LogIn size={16} />\n {children ?? \"Sign In\"}\n </span>\n </Button>\n )\n }\n\n // Signing-in state\n if (isSigningIn) {\n return (\n <Button disabled className={className} aria-label=\"Signing In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Loader2 size={16} className=\"animate-spin\" />\n Signing In...\n </span>\n </Button>\n )\n }\n\n // Error state\n if (error && !isSignedIn) {\n return (\n <div style={{ position: \"relative\", display: \"inline-flex\", flexDirection: \"column\" }}>\n <Button onClick={onSignIn} className={className} aria-label=\"Retry Sign In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <AlertCircle size={16} style={{ color: \"var(--destructive, #ef4444)\" }} />\n {children ?? \"Retry Sign In\"}\n </span>\n </Button>\n <div style={{\n fontSize: \"0.75rem\", color: \"var(--destructive, #ef4444)\",\n padding: \"0.25rem 0.5rem\", borderRadius: \"0.375rem\",\n background: \"var(--destructive-foreground, #fef2f2)\",\n marginTop: \"2px\",\n wordBreak: \"break-word\",\n maxWidth: \"100%\",\n lineHeight: 1.4,\n }}>\n {error.message}\n </div>\n </div>\n )\n }\n\n // Signed-in state\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <Button\n onClick={() => setShowDetails((prev) => !prev)}\n className={className}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <CheckCircle2 size={16} style={{ color: \"#22c55e\" }} />\n <span style={{ fontSize: \"0.875rem\", fontWeight: 500 }}>Signed In</span>\n </span>\n </Button>\n\n {showDetails && (Dialog && DialogContent ? (\n <Dialog open={true} onOpenChange={(open: boolean) => { if (!open) setShowDetails(false); }}>\n <DialogContent>\n {DialogHeader && DialogTitle\n ? <><DialogHeader><DialogTitle>Sign-In Details</DialogTitle></DialogHeader><SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} onCopy={handleCopySignature} /></>\n : <><div style={{ fontWeight: 600, fontSize: \"1.125rem\", marginBottom: \"0.75rem\" }}>Sign-In Details</div><SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} onCopy={handleCopySignature} /></>\n }\n </DialogContent>\n </Dialog>\n ) : (\n showDetails && (\n <div style={{\n position: \"absolute\", top: \"calc(100% + 8px)\", right: 0, zIndex: 100,\n width: \"340px\", maxWidth: \"90vw\",\n background: \"var(--card, #fff)\", border: \"1px solid var(--border, #e2e8f0)\",\n borderRadius: \"0.75rem\", boxShadow: \"0 10px 25px rgba(0,0,0,0.1)\",\n padding: \"1rem\",\n }}>\n <SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} onCopy={handleCopySignature} />\n </div>\n )\n ))}\n </div>\n )\n}\n\nfunction SignInDetails({\n result,\n onClose,\n copiedSign,\n onCopy,\n}: {\n result: SiwxResult | null\n onClose: () => void\n copiedSign: boolean\n onCopy: () => void\n}) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n if (!result) {\n return (\n <div style={{ textAlign: \"center\", padding: \"1rem 0\" }}>\n <CheckCircle2 size={32} style={{ color: \"#22c55e\", margin: \"0 auto 0.75rem\" }} />\n <p style={{ fontSize: \"0.875rem\", color: \"var(--muted-foreground, #64748b)\" }}>\n Authenticated successfully\n </p>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>Close</Button>\n </div>\n )\n }\n\n const { message: msg, signature } = result\n const shortSig = signature.length > 20\n ? signature.slice(0, 14) + \"...\" + signature.slice(-6)\n : signature\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <CheckCircle2 size={18} color=\"#22c55e\" />\n <span style={{ fontWeight: 600, fontSize: \"0.9375rem\" }}>Signed In</span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}><X size={16} /></Button>\n </div>\n\n {/* Domain and address */}\n <div style={{ display: \"grid\", gap: \"0.375rem\" }}>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Domain</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\" }}>{msg.domain}</p>\n </div>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Address</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\", wordBreak: \"break-all\" }}>{msg.address}</p>\n </div>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Chain</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\" }}>{msg.chainId}</p>\n </div>\n </div>\n\n {/* Statement */}\n {msg.statement && (\n <div style={{ padding: \"0.5rem 0.625rem\", borderRadius: \"0.375rem\",\n background: \"var(--muted, #f1f5f9)\", fontSize: \"0.8125rem\", lineHeight: 1.5 }}>\n {msg.statement}\n </div>\n )}\n\n {/* Signature */}\n <div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: \"0.25rem\" }}>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Signature</span>\n <Button variant=\"ghost\" size=\"icon\" onClick={onCopy} title=\"Copy signature\">\n {copiedSign ? <Check size={12} color=\"#22c55e\" /> : <Copy size={12} />}\n </Button>\n </div>\n <p style={{ fontSize: \"0.75rem\", fontFamily: \"monospace\", wordBreak: \"break-all\", lineHeight: 1.4,\n color: \"var(--muted-foreground, #64748b)\", background: \"var(--muted, #f1f5f9)\", padding: \"0.375rem 0.5rem\",\n borderRadius: \"0.375rem\" }}>\n {shortSig}\n </p>\n </div>\n\n <Button variant=\"outline\" className=\"w-full\" onClick={onClose}>Close</Button>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useState, useCallback, useMemo } from \"react\"\nimport { AlertTriangle, Check, Copy, Download, Eye, EyeOff, SkipForward, ArrowLeft, ArrowRight, Shield, X } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { DefaultDialog } from \"../lib/ui-defaults\"\nimport { cn } from \"../lib/cn\"\n\nexport interface SeedPhraseBackupProps {\n seedPhrase: string\n onConfirm: () => void\n onSkip?: () => void\n onExportPrivateKey?: () => string | null\n className?: string\n wordCount?: 12 | 24\n /** When true, render inline instead of in a dialog */\n inline?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\ntype BackupStep = \"reveal\" | \"confirm\" | \"done\"\n\ninterface ConfirmWord {\n index: number\n correct: string\n options: string[]\n}\n\nfunction shuffleArray<T>(arr: T[]): T[] {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n}\n\nfunction buildConfirmWords(phrase: string, count: number = 3): ConfirmWord[] {\n const words = phrase.trim().split(/\\s+/)\n const indices = shuffleArray(words.map((_, i) => i)).slice(0, Math.min(count, words.length))\n\n return indices.map((idx) => {\n const correct = words[idx]\n const others = words.filter((_, i) => i !== idx)\n const distractors = shuffleArray(others).slice(0, 3)\n const options = shuffleArray([correct, ...distractors])\n return { index: idx, correct, options }\n })\n}\n\nexport function SeedPhraseBackup({\n seedPhrase,\n onConfirm,\n onSkip,\n onExportPrivateKey,\n className,\n wordCount,\n inline = false,\n open = true,\n onOpenChange,\n}: SeedPhraseBackupProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined\n\n const [step, setStep] = useState<BackupStep>(\"reveal\")\n const [revealed, setRevealed] = useState(false)\n const [copied, setCopied] = useState(false)\n const [confirmWords, setConfirmWords] = useState<ConfirmWord[]>(() => buildConfirmWords(seedPhrase, 3))\n const [selectedWords, setSelectedWords] = useState<Record<number, string>>({})\n const [confirmErrors, setConfirmErrors] = useState<number[]>([])\n const [showExportKey, setShowExportKey] = useState(false)\n const [exportedKey, setExportedKey] = useState<string | null>(null)\n\n const words = useMemo(() => seedPhrase.trim().split(/\\s+/), [seedPhrase])\n const detectedWordCount = wordCount ?? (words.length === 24 ? 24 : 12)\n\n const handleReveal = useCallback(() => setRevealed(true), [])\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(seedPhrase)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {}\n }, [seedPhrase])\n\n const handleStartConfirm = useCallback(() => {\n setConfirmWords(buildConfirmWords(seedPhrase, 3))\n setSelectedWords({})\n setConfirmErrors([])\n setStep(\"confirm\")\n }, [seedPhrase])\n\n const handleSelectWord = useCallback((wordIndex: number, word: string) => {\n setSelectedWords((prev) => ({ ...prev, [wordIndex]: word }))\n setConfirmErrors((prev) => prev.filter((i) => i !== wordIndex))\n }, [])\n\n const handleVerify = useCallback(() => {\n const errors: number[] = []\n for (const cw of confirmWords) {\n if (selectedWords[cw.index] !== cw.correct) {\n errors.push(cw.index)\n }\n }\n if (errors.length > 0) {\n setConfirmErrors(errors)\n return\n }\n setStep(\"done\")\n onConfirm()\n }, [confirmWords, selectedWords, onConfirm])\n\n const handleSkip = useCallback(() => {\n onSkip?.()\n }, [onSkip])\n\n const handleExportKey = useCallback(() => {\n if (onExportPrivateKey) {\n const key = onExportPrivateKey()\n setExportedKey(key)\n setShowExportKey(true)\n }\n }, [onExportPrivateKey])\n\n const allConfirmedSelected = confirmWords.every((cw) => selectedWords[cw.index] !== undefined)\n\n const revealContent = (\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border border-amber-200 bg-amber-50 dark:border-amber-800 dark:bg-amber-950/30 px-4 py-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle size={16} className=\"mt-0.5 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-sm text-amber-800 dark:text-amber-200\">\n Write down these words in order and store them somewhere safe. Never share them with anyone.\n If you lose your seed phrase, your funds cannot be recovered.\n </p>\n </div>\n </div>\n\n {!revealed ? (\n <div className=\"flex flex-col items-center gap-3 py-6\">\n <Shield size={40} className=\"text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground text-center\">\n Click the button below to reveal your seed phrase. Make sure no one is watching your screen.\n </p>\n <Button onClick={handleReveal} variant=\"default\">\n <Eye size={16} />\n Reveal Seed Phrase\n </Button>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {words.map((word, i) => (\n <div\n key={i}\n className=\"flex items-center gap-1.5 rounded-md border bg-card px-2.5 py-1.5 text-sm\"\n >\n <span className=\"text-xs text-muted-foreground w-5 shrink-0 text-right\">\n {i + 1}\n </span>\n <span className=\"font-mono font-medium\">{word}</span>\n </div>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={handleCopy} variant=\"outline\" size=\"sm\">\n {copied ? <Check size={14} /> : <Copy size={14} />}\n {copied ? \"Copied\" : \"Copy\"}\n </Button>\n {onExportPrivateKey && (\n <Button onClick={handleExportKey} variant=\"outline\" size=\"sm\">\n <Download size={14} />\n Export Private Key\n </Button>\n )}\n </div>\n\n {showExportKey && exportedKey && (\n <div className=\"rounded-lg border border-border bg-muted p-3 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <EyeOff size={14} className=\"text-muted-foreground\" />\n <span className=\"text-xs font-medium text-muted-foreground\">\n Private Key (keep secret!)\n </span>\n </div>\n <p className=\"font-mono text-xs break-all select-all\">{exportedKey}</p>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:justify-between\">\n <Button onClick={handleStartConfirm} variant=\"default\">\n I've Saved It\n <ArrowRight size={16} />\n </Button>\n {onSkip && (\n <Button onClick={handleSkip} variant=\"ghost\" size=\"sm\">\n <SkipForward size={14} />\n Skip Backup\n </Button>\n )}\n </div>\n </>\n )}\n </div>\n )\n\n const confirmContent = (\n <div className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n Verify your backup by selecting the correct word for each position.\n </p>\n\n {confirmWords.map((cw) => {\n const hasError = confirmErrors.includes(cw.index)\n return (\n <div key={cw.index} className=\"space-y-2\">\n <p className={cn(\n \"text-sm font-medium\",\n hasError ? \"text-destructive\" : \"text-foreground\"\n )}>\n Word #{cw.index + 1}\n {hasError && <span className=\"ml-2 text-xs text-destructive\">(incorrect)</span>}\n </p>\n <div className=\"grid grid-cols-2 gap-2\">\n {cw.options.map((opt) => {\n const isSelected = selectedWords[cw.index] === opt\n return (\n <button\n key={opt}\n onClick={() => handleSelectWord(cw.index, opt)}\n className={cn(\n \"rounded-md border px-3 py-2 text-sm font-mono transition-all duration-200 cursor-pointer text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isSelected\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : hasError\n ? \"border-destructive/50 bg-destructive/5\"\n : \"border-border bg-card hover:border-primary/50\"\n )}\n >\n {opt}\n </button>\n )\n })}\n </div>\n </div>\n )\n })}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:justify-between\">\n <Button\n onClick={handleVerify}\n variant=\"default\"\n disabled={!allConfirmedSelected}\n >\n <Check size={16} />\n Verify & Confirm\n </Button>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setStep(\"reveal\")}\n variant=\"ghost\"\n size=\"sm\"\n >\n <ArrowLeft size={14} />\n Back\n </Button>\n {onSkip && (\n <Button onClick={handleSkip} variant=\"ghost\" size=\"sm\">\n <SkipForward size={14} />\n Skip\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n\n const doneContent = (\n <div className=\"flex flex-col items-center gap-3 py-6 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30\">\n <Check size={24} className=\"text-green-600 dark:text-green-400\" />\n </div>\n <p className=\"font-medium text-foreground\">Backup Confirmed</p>\n <p className=\"text-sm text-muted-foreground\">\n Your seed phrase has been backed up successfully.\n </p>\n </div>\n )\n\n const steps: Record<BackupStep, React.ReactNode> = {\n reveal: revealContent,\n confirm: confirmContent,\n done: doneContent,\n }\n\n const titles: Record<BackupStep, string> = {\n reveal: \"Backup Seed Phrase\",\n confirm: \"Verify Backup\",\n done: \"Backup Complete\",\n }\n\n const body = steps[step]\n const title = titles[step]\n\n if (inline) {\n return (\n <div className={cn(\"space-y-4\", className)}>\n {step !== \"done\" && (\n <h3 className=\"text-lg font-semibold\">{title}</h3>\n )}\n {body}\n </div>\n )\n }\n\n if (!open) return null\n\n if (Dialog && DialogContent) {\n return (\n <Dialog open={true} onOpenChange={(o: boolean) => { if (!o) onOpenChange?.(false); }}>\n <DialogContent>\n {DialogHeader && DialogTitle ? (\n <><DialogHeader><DialogTitle>{title}</DialogTitle></DialogHeader><div className=\"mt-2 max-h-[55vh] overflow-y-auto\">{body}</div></>\n ) : (\n <><div className=\"mb-3 text-lg font-semibold\">{title}</div><div className=\"max-h-[55vh] overflow-y-auto\">{body}</div></>\n )}\n </DialogContent>\n </Dialog>\n )\n }\n\n return (\n <DefaultDialog open={true} onClose={() => onOpenChange?.(false)}>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">{title}</h2>\n {onOpenChange && (\n <button\n onClick={() => onOpenChange(false)}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-all duration-200 cursor-pointer border-none bg-transparent\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n {body}\n </DefaultDialog>\n )\n}\n","\"use client\"\n\nimport React from \"react\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport { DefaultDialog, DefaultDialogHeader, DefaultDialogContent } from \"../lib/ui-defaults\";\n\n// ── Types ─────────────────────────────────────────────────────────\n\nexport interface ErrorBoundaryProps {\n children: React.ReactNode;\n /** Optional custom fallback UI. Receives error and reset callback. */\n fallback?: (props: { error: Error; reset: () => void }) => React.ReactNode;\n /** Called when an error is caught. Useful for logging. */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n /** Called after the boundary resets. */\n onReset?: () => void;\n /** Called when the user dismisses the error dialog. */\n onDismiss?: () => void;\n /** Label for the retry button. Default: \"Try Again\" */\n retryLabel?: string;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n dismissed: boolean;\n}\n\n// ── Default Fallback UI ───────────────────────────────────────────\n\nfunction DefaultErrorFallback({\n error,\n reset,\n dismiss,\n retryLabel = \"Try Again\",\n}: {\n error: Error;\n reset: () => void;\n dismiss?: () => void;\n retryLabel?: string;\n}) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined;\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined;\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined;\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined;\n\n if (Dialog && DialogContent) {\n return (\n <Dialog open={true} onOpenChange={() => {}}>\n <DialogContent>\n {DialogHeader && DialogTitle ? (\n <>\n <DialogHeader><DialogTitle>Something went wrong</DialogTitle></DialogHeader>\n <div style={{ marginTop: \"0.5rem\" }}>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </div>\n </>\n ) : (\n <>\n <div style={{ fontWeight: 600, fontSize: \"1.125rem\", marginBottom: \"0.75rem\" }}>\n Something went wrong\n </div>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n }\n\n // Fallback: use DefaultDialog\n const isOpen = true;\n const onClose = dismiss ?? undefined;\n\n return (\n <DefaultDialog open={isOpen} onClose={onClose}>\n <DefaultDialogHeader title=\"Something went wrong\" onClose={onClose} showCloseButton={!!dismiss} />\n <DefaultDialogContent>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </DefaultDialogContent>\n </DefaultDialog>\n );\n}\n\n// ── Error Boundary Component ──────────────────────────────────────\n\nexport class ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, dismissed: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error, dismissed: false };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = (): void => {\n this.setState({ hasError: false, error: null, dismissed: false });\n this.props.onReset?.();\n };\n\n handleDismiss = (): void => {\n this.setState((prev) => ({ ...prev, dismissed: true }));\n this.props.onDismiss?.();\n };\n\n render(): React.ReactNode {\n if (this.state.dismissed) {\n return this.props.children;\n }\n\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback({\n error: this.state.error,\n reset: this.handleReset,\n });\n }\n\n return (\n <DefaultErrorFallback\n error={this.state.error}\n reset={this.handleReset}\n dismiss={this.props.onDismiss ? this.handleDismiss : undefined}\n retryLabel={this.props.retryLabel}\n />\n );\n }\n\n return this.props.children;\n }\n}\n","\"use client\"\n\nimport React, { createContext, useContext, useMemo, useState, useCallback, useEffect } from \"react\"\nimport { useAccount, useWallet, useChain, useEmbeddedWallet, useDisconnect, useBalance } from \"@naculus/connect-appkit-react\"\nimport type { Web3ConnectConfig } from \"@naculus/connect-appkit-react\"\nimport { Web3ConnectUI, type Web3ConnectUIProps } from \"./Web3ConnectUI\"\nimport { ConnectButton } from \"./ConnectButton\"\nimport { ChainSelector } from \"./ChainSelector\"\nimport { SeedPhraseBackup } from \"./SeedPhraseBackup\"\nimport { useEIP6963 } from \"../hooks/useEIP6963\"\nimport type { DiscoveredWallet } from \"../hooks/useEIP6963\"\nimport { cn } from \"../lib/cn\"\n\nexport interface AppKitProps {\n projectId: string\n metadata: {\n name: string\n description: string\n url: string\n icons: string[]\n }\n enableEmbedded?: boolean\n enablePasskeys?: boolean\n children?: React.ReactNode\n className?: string\n autoConnect?: boolean\n theme?: Web3ConnectUIProps[\"theme\"]\n defaultDark?: boolean\n themePriority?: Web3ConnectUIProps[\"themePriority\"]\n detectionMode?: Web3ConnectUIProps[\"detectionMode\"]\n}\n\nexport interface AppKitContextValue {\n connect: () => void\n disconnect: () => Promise<void>\n isConnected: boolean\n isConnecting: boolean\n address: string | null\n balance: string | null\n balanceSymbol: string\n chainName: string | null\n availableChains: Array<{ id: number; namespace: string; name: string; token?: string }>\n switchChain: (chainId: string) => Promise<void>\n wallets: DiscoveredWallet[]\n hasWallets: boolean\n /** Embedded wallet backup state */\n backupPending: boolean\n seedPhrase: string | null\n confirmBackup: () => void\n skipBackup: () => void\n open: boolean\n setOpen: (open: boolean) => void\n}\n\nconst AppKitContext = createContext<AppKitContextValue | null>(null)\n\nexport function useAppKit(): AppKitContextValue {\n const ctx = useContext(AppKitContext)\n if (!ctx) {\n throw new Error(\"useAppKit must be used within an <AppKit> component\")\n }\n return ctx\n}\n\nexport function AppKit({\n projectId,\n metadata,\n enableEmbedded = false,\n enablePasskeys = false,\n children,\n className,\n autoConnect = false,\n theme,\n defaultDark = false,\n themePriority = \"computed\",\n detectionMode = \"auto\",\n}: AppKitProps) {\n const [open, setOpen] = useState(false)\n const [backupOpen, setBackupOpen] = useState(false)\n\n const config = useMemo<Web3ConnectConfig>(\n () => ({\n projectId,\n metadata,\n enableEmbedded,\n enablePasskeys,\n }),\n [projectId, metadata, enableEmbedded, enablePasskeys]\n )\n\n return (\n <Web3ConnectUI\n config={config}\n autoConnect={autoConnect}\n detectionMode={detectionMode}\n theme={theme}\n defaultDark={defaultDark}\n themePriority={themePriority}\n >\n <AppKitInner\n className={className}\n open={open}\n setOpen={setOpen}\n backupOpen={backupOpen}\n setBackupOpen={setBackupOpen}\n >\n {children}\n </AppKitInner>\n </Web3ConnectUI>\n )\n}\n\ninterface AppKitInnerProps {\n children: React.ReactNode\n className?: string\n open: boolean\n setOpen: (open: boolean) => void\n backupOpen: boolean\n setBackupOpen: (open: boolean) => void\n}\n\nfunction AppKitInner({\n children,\n className,\n open,\n setOpen,\n backupOpen,\n setBackupOpen,\n}: AppKitInnerProps) {\n const { isConnected, isConnecting } = useWallet()\n const { primaryAccount } = useAccount()\n const { currentChain, availableChains, switchChain } = useChain()\n const embedded = useEmbeddedWallet()\n const { disconnect } = useDisconnect()\n const { wallets, hasWallets } = useEIP6963()\n const { formatted: balanceRaw } = useBalance()\n const balance = balanceRaw ?? null\n\n const handleDisconnect = useCallback(async () => {\n await disconnect()\n }, [disconnect])\n\n const handleConfirmBackup = useCallback(() => {\n embedded.confirmBackup()\n setBackupOpen(false)\n }, [embedded])\n\n const handleSkipBackup = useCallback(() => {\n setBackupOpen(false)\n }, [])\n\n const handleExportPrivateKey = useCallback((): string | null => {\n return embedded.wallet?.privateKey ?? null\n }, [embedded.wallet])\n\n const value = useMemo<AppKitContextValue>(\n () => ({\n connect: () => setOpen(true),\n disconnect: handleDisconnect,\n isConnected,\n isConnecting,\n address: primaryAccount,\n balance,\n balanceSymbol: currentChain?.token ?? \"ETH\",\n chainName: currentChain?.name ?? null,\n availableChains: availableChains.map((c) => ({\n id: c.id,\n namespace: c.namespace,\n name: c.name,\n token: c.token,\n })),\n switchChain,\n wallets,\n hasWallets,\n backupPending: embedded.backupPending,\n seedPhrase: embedded.seedPhrase,\n confirmBackup: handleConfirmBackup,\n skipBackup: handleSkipBackup,\n open,\n setOpen,\n }),\n [\n isConnected,\n isConnecting,\n primaryAccount,\n balance,\n currentChain,\n availableChains,\n switchChain,\n wallets,\n hasWallets,\n embedded.backupPending,\n embedded.seedPhrase,\n handleConfirmBackup,\n handleSkipBackup,\n handleDisconnect,\n open,\n setOpen,\n ]\n )\n\n // Open backup dialog when embedded wallet generates a seed phrase\n useEffect(() => {\n if (embedded.seedPhrase && embedded.backupPending) {\n setBackupOpen(true)\n }\n }, [embedded.seedPhrase, embedded.backupPending, setBackupOpen])\n\n return (\n <AppKitContext.Provider value={value}>\n {children}\n\n {embedded.seedPhrase && backupOpen && (\n <SeedPhraseBackup\n seedPhrase={embedded.seedPhrase}\n onConfirm={handleConfirmBackup}\n onSkip={handleSkipBackup}\n onExportPrivateKey={handleExportPrivateKey}\n open={backupOpen}\n onOpenChange={setBackupOpen}\n />\n )}\n </AppKitContext.Provider>\n )\n}\n\n// ── Convenience sub-components ──────────────────────────────────────\n\nexport interface AppKitButtonProps {\n className?: string\n}\n\nexport function AppKitButton({ className }: AppKitButtonProps) {\n const ctx = useAppKit()\n const { primaryAccount } = useAccount()\n const { disconnect } = useDisconnect()\n\n if (ctx.isConnected && primaryAccount) {\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <ChainSelector variant=\"minimal\" />\n <ConnectButton\n isConnected={ctx.isConnected}\n address={primaryAccount}\n balance={ctx.balance}\n balanceSymbol={ctx.balanceSymbol}\n onDisconnect={disconnect}\n className={className}\n />\n </div>\n )\n }\n\n return (\n <ConnectButton\n isConnected={ctx.isConnected}\n isConnecting={ctx.isConnecting}\n address={primaryAccount}\n balance={ctx.balance}\n balanceSymbol={ctx.balanceSymbol}\n onDisconnect={disconnect}\n className={className}\n />\n )\n}\n\nexport interface AppKitChainSelectorProps {\n className?: string\n variant?: \"dropdown\" | \"buttons\" | \"minimal\"\n}\n\nexport function AppKitChainSelector({ className, variant = \"dropdown\" }: AppKitChainSelectorProps) {\n return <ChainSelector className={className} variant={variant} />\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Web3ConnectProvider } from '@naculus/connect-appkit-react'\nimport type { Web3ConnectConfig } from '@naculus/connect-appkit-react'\nimport { Web3ComponentProvider } from '../contexts/ComponentRegistry'\nimport { WalletConnectProvider } from '../contexts/WalletConnectContext'\nimport { ThemeProvider, type ThemeOverride, type ThemePriority } from '../contexts/ThemeContext'\nimport { QRCodeModal } from './QRCodeModal'\n\nexport type DetectionMode = \"auto\" | \"walletconnect\" | \"eip6963\"\n\nexport interface DetectionContextValue {\n mode: DetectionMode\n}\n\nconst DetectionContext = createContext<DetectionContextValue>({ mode: \"walletconnect\" })\n\nexport function useDetectionMode(): DetectionContextValue {\n return useContext(DetectionContext)\n}\n\nexport interface Web3ConnectUIProps {\n config: Web3ConnectConfig\n children: React.ReactNode\n autoConnect?: boolean\n /** Wallet connection detection mode:\n * - \"walletconnect\" (default): Always use WalletConnect relay\n * - \"eip6963\": Only use browser-injected EIP-6963 wallets\n * - \"auto\": Auto-detect EIP-6963 wallets, fall back to WalletConnect\n */\n detectionMode?: DetectionMode\n /** Theme overrides for connect UI components */\n theme?: ThemeOverride\n /** Default dark mode */\n defaultDark?: boolean\n /**\n * Theme priority mode:\n * - \"computed\" (default): Respect developer's existing CSS variables (e.g. shadcn theme)\n * - \"fallback\": Always inject connect's theme variables\n */\n themePriority?: ThemePriority\n}\n\nexport function Web3ConnectUI({\n config,\n children,\n autoConnect = false,\n detectionMode = 'walletconnect',\n theme,\n defaultDark = false,\n themePriority = 'computed',\n}: Web3ConnectUIProps) {\n const detectionCtx = useMemo<DetectionContextValue>(() => ({ mode: detectionMode }), [detectionMode])\n\n const needsWalletConnect = detectionMode === 'walletconnect' || detectionMode === 'auto'\n\n return (\n <DetectionContext.Provider value={detectionCtx}>\n <ThemeProvider theme={theme} defaultDark={defaultDark} priority={themePriority}>\n <Web3ComponentProvider components={{ QRCodeModal }}>\n <Web3ConnectProvider config={config} autoConnect={autoConnect}>\n {needsWalletConnect ? (\n <WalletConnectProvider>\n {children}\n </WalletConnectProvider>\n ) : (\n children\n )}\n </Web3ConnectProvider>\n </Web3ComponentProvider>\n </ThemeProvider>\n </DetectionContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo, useEffect, useCallback, useState } from 'react'\nimport { THEME_CONTRACT, clearCSSVariableCache, type ThemeVariableName } from '../lib/css-variables'\n\nexport interface ThemeOverride {\n primary?: string\n 'primary-foreground'?: string\n background?: string\n foreground?: string\n card?: string\n 'card-foreground'?: string\n popover?: string\n 'popover-foreground'?: string\n secondary?: string\n 'secondary-foreground'?: string\n muted?: string\n 'muted-foreground'?: string\n accent?: string\n 'accent-foreground'?: string\n destructive?: string\n 'destructive-foreground'?: string\n border?: string\n input?: string\n ring?: string\n radius?: string\n}\n\nexport type ThemePriority = 'computed' | 'fallback'\n\ninterface ThemeContextValue {\n theme: ThemeOverride\n isDark: boolean\n setTheme: (theme: ThemeOverride) => void\n toggleDarkMode: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: {},\n isDark: false,\n setTheme: () => {},\n toggleDarkMode: () => {},\n})\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n theme?: ThemeOverride\n defaultDark?: boolean\n priority?: ThemePriority\n}\n\nfunction generateCSS(theme: ThemeOverride): string {\n const rules: string[] = []\n for (const [key, value] of Object.entries(theme)) {\n const cssVar = THEME_CONTRACT[key as ThemeVariableName]\n if (cssVar && value) {\n rules.push(' ' + cssVar.name + ': ' + value + ';')\n }\n }\n if (rules.length === 0) return ''\n return ':root {\\n' + rules.join('\\n') + '\\n}'\n}\n\nfunction getDefinedVars(priority: ThemePriority): Set<string> {\n const defined = new Set<string>()\n if (priority !== 'computed') return defined\n if (typeof document === 'undefined') return defined\n for (const key of Object.keys(THEME_CONTRACT)) {\n const cssVar = THEME_CONTRACT[key as ThemeVariableName]\n const existing = getComputedStyle(document.documentElement).getPropertyValue(cssVar.name).trim()\n if (existing && existing !== cssVar.fallback) {\n defined.add(key)\n }\n }\n return defined\n}\n\nexport function ThemeProvider({\n children,\n theme = {},\n defaultDark = false,\n priority = 'fallback',\n}: ThemeProviderProps) {\n const [customTheme, setCustomTheme] = useState<ThemeOverride>(theme)\n const [isDark, setIsDark] = useState(defaultDark)\n\n // Clear CSS variable cache when theme changes\n useEffect(() => {\n clearCSSVariableCache()\n }, [customTheme])\n\n const [devDefined, setDevDefined] = useState<Set<string>>(new Set())\n useEffect(() => {\n setDevDefined(getDefinedVars(priority))\n }, [priority])\n\n const effectiveTheme = useMemo(() => {\n if (priority === 'fallback' || devDefined.size === 0) return customTheme\n const filtered: ThemeOverride = {}\n for (const [key, value] of Object.entries(customTheme)) {\n if (!devDefined.has(key) && value) {\n filtered[key as keyof ThemeOverride] = value\n }\n }\n return filtered\n }, [customTheme, priority, devDefined])\n\n const cssString = useMemo(() => generateCSS(effectiveTheme), [effectiveTheme])\n\n // Dark class management\n useEffect(() => {\n if (typeof document === 'undefined') return\n const root = document.documentElement\n if (isDark) root.classList.add('dark')\n else root.classList.remove('dark')\n clearCSSVariableCache()\n }, [isDark])\n\n // Stable style tag ID\n const styleId = useMemo(() => 'w3c-theme-' + Math.random().toString(36).slice(2, 9), [])\n\n // toggleDarkMode: at TOP LEVEL, not inside useMemo!\n const toggleDarkMode = useCallback(() => setIsDark((prev) => !prev), [])\n\n const value = useMemo(\n () => ({\n theme: customTheme,\n isDark,\n setTheme: setCustomTheme,\n toggleDarkMode,\n }),\n [customTheme, isDark, toggleDarkMode]\n )\n\n return (\n <ThemeContext.Provider value={value}>\n {cssString ? (\n <style id={styleId} dangerouslySetInnerHTML={{ __html: cssString }} />\n ) : null}\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext)\n}\n\nexport function useThemeVariable(name: ThemeVariableName): string {\n const { theme } = useTheme()\n const [value, setValue] = useState<string>('')\n\n useEffect(() => {\n const cssVar = THEME_CONTRACT[name]\n if (!cssVar) return\n const customValue = theme[name as keyof ThemeOverride]\n if (customValue) {\n setValue(customValue)\n return\n }\n if (typeof document === 'undefined') {\n setValue(cssVar.fallback)\n return\n }\n const cssValue = getComputedStyle(document.documentElement)\n .getPropertyValue(cssVar.name)\n .trim()\n setValue(cssValue || cssVar.fallback)\n }, [name, theme])\n\n return value || THEME_CONTRACT[name]?.fallback || ''\n}\n","/**\n * CSS Variables — Theme contract + host mapping utilities.\n *\n * Two APIs live here:\n * 1. THEME_CONTRACT (consumed by ThemeContext for computed/fallback modes)\n * 2. REQUIRED_VARS / OPTIONAL_VARS / DARK_VARS (Mode C mapping docs)\n */\n\n// ── Theme Contract (consumed by ThemeContext) ─────────────────────\n// These are the canonical shadcn CSS variable names and their default\n// fallback values. Do NOT remove — ThemeContext.test.tsx depends on them.\n\nexport interface ThemeVariable {\n name: string\n fallback: string\n}\n\nexport const THEME_CONTRACT = {\n primary: { name: '--primary', fallback: '221.2 83.2% 53.3%' },\n 'primary-foreground': { name: '--primary-foreground', fallback: '210 40% 98%' },\n background: { name: '--background', fallback: '0 0% 100%' },\n foreground: { name: '--foreground', fallback: '222.2 84% 4.9%' },\n card: { name: '--card', fallback: '0 0% 100%' },\n 'card-foreground': { name: '--card-foreground', fallback: '222.2 84% 4.9%' },\n popover: { name: '--popover', fallback: '0 0% 100%' },\n 'popover-foreground': { name: '--popover-foreground', fallback: '222.2 84% 4.9%' },\n secondary: { name: '--secondary', fallback: '210 40% 96.1%' },\n 'secondary-foreground': { name: '--secondary-foreground', fallback: '222.2 47.4% 11.2%' },\n muted: { name: '--muted', fallback: '210 40% 96.1%' },\n 'muted-foreground': { name: '--muted-foreground', fallback: '215.4 16.3% 46.9%' },\n accent: { name: '--accent', fallback: '210 40% 96.1%' },\n 'accent-foreground': { name: '--accent-foreground', fallback: '222.2 47.4% 11.2%' },\n destructive: { name: '--destructive', fallback: '0 84.2% 60.2%' },\n border: { name: '--border', fallback: '214.3 31.8% 91.4%' },\n input: { name: '--input', fallback: '214.3 31.8% 91.4%' },\n ring: { name: '--ring', fallback: '221.2 83.2% 53.3%' },\n radius: { name: '--radius', fallback: '0.5rem' },\n} as const\n\nexport type ThemeVariableName = keyof typeof THEME_CONTRACT\n\nconst cache = new Map<string, string>()\n\nfunction computeValue(name: ThemeVariableName): string {\n const { name: varName, fallback } = THEME_CONTRACT[name]\n if (typeof window === 'undefined') return fallback\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n}\n\nexport function getCSSVariable(name: ThemeVariableName): string {\n const cached = cache.get(name)\n if (cached !== undefined) return cached\n const value = computeValue(name)\n cache.set(name, value)\n return value\n}\n\nexport function clearCSSVariableCache(): void {\n cache.clear()\n}\n\nexport function refreshCSSVariable(name: ThemeVariableName): string {\n const value = computeValue(name)\n cache.set(name, value)\n return value\n}\n\nexport function getThemeStyles(): Record<string, string> {\n const styles: Record<string, string> = {}\n for (const key of Object.keys(THEME_CONTRACT) as ThemeVariableName[]) {\n styles[key] = getCSSVariable(key)\n }\n return styles\n}\n\nexport function isCSSVariableDefined(name: ThemeVariableName): boolean {\n if (typeof window === 'undefined') return false\n const cached = cache.get(name)\n if (cached !== undefined) return cached.length > 0\n const value = computeValue(name)\n cache.set(name, value)\n return value.length > 0\n}\n\nexport function getDefinedCSSVariables(): ThemeVariableName[] {\n return Object.keys(THEME_CONTRACT).filter((n) =>\n isCSSVariableDefined(n as ThemeVariableName)\n ) as ThemeVariableName[]\n}\n\n// ── Mode C: Host theme mapping (documentation + generate helper) ──\n\nexport const REQUIRED_VARS = {\n \"--background\": { fallback: \"0 0% 100%\", desc: \"Page background color (HSL)\" },\n \"--foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Primary text color (HSL)\" },\n \"--primary\": { fallback: \"221.2 83.2% 53.3%\", desc: \"Primary action color (HSL)\" },\n \"--primary-foreground\": { fallback: \"210 40% 98%\", desc: \"Text on primary surfaces (HSL)\" },\n \"--border\": { fallback: \"214.3 31.8% 91.4%\", desc: \"Border color (HSL)\" },\n \"--ring\": { fallback: \"221.2 83.2% 53.3%\", desc: \"Focus ring color (HSL)\" },\n} as const;\n\nexport const OPTIONAL_VARS = {\n \"--card\": { fallback: \"0 0% 100%\", desc: \"Card surface\" },\n \"--card-foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Card text\" },\n \"--popover\": { fallback: \"0 0% 100%\", desc: \"Popover surface\" },\n \"--popover-foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Popover text\" },\n \"--secondary\": { fallback: \"210 40% 96.1%\", desc: \"Secondary surface\" },\n \"--secondary-foreground\": { fallback: \"222.2 47.4% 11.2%\", desc: \"Secondary text\" },\n \"--muted\": { fallback: \"210 40% 96.1%\", desc: \"Muted/disabled surface\" },\n \"--muted-foreground\": { fallback: \"215.4 16.3% 46.9%\", desc: \"Muted text\" },\n \"--accent\": { fallback: \"210 40% 96.1%\", desc: \"Accent surface\" },\n \"--accent-foreground\": { fallback: \"222.2 47.4% 11.2%\", desc: \"Accent text\" },\n \"--destructive\": { fallback: \"0 84.2% 60.2%\", desc: \"Destructive action\" },\n \"--destructive-foreground\": { fallback: \"210 40% 98%\", desc: \"Destructive text\" },\n \"--input\": { fallback: \"214.3 31.8% 91.4%\", desc: \"Input border\" },\n \"--radius\": { fallback: \"0.5rem\", desc: \"Border radius\" },\n} as const;\n\nexport const DARK_VARS = {\n \"--background\": { value: \"222.2 84% 4.9%\" },\n \"--foreground\": { value: \"210 40% 98%\" },\n \"--primary\": { value: \"217.2 91.2% 59.8%\" },\n \"--primary-foreground\": { value: \"222.2 47.4% 11.2%\" },\n \"--border\": { value: \"217.2 32.6% 17.5%\" },\n \"--ring\": { value: \"224.3 76.3% 48%\" },\n} as const;\n\nexport function generateVarCSS(\n vars: Record<string, { value?: string; fallback?: string }>,\n selector: string = \":root\",\n): string {\n const rules = Object.entries(vars)\n .filter(([, v]) => v.value || v.fallback)\n .map(([k, v]) => ` ${k}: ${v.value || v.fallback};`)\n .join(\"\\n\");\n return `${selector} {\\n${rules}\\n}`;\n}\n","\"use client\";\n\n/**\n * RouteSelector — UI component for cross-chain route selection.\n *\n * Displays route quotes from RouteEngine and lets users pick one.\n * Supports loading, executing, success, and error states.\n *\n * Uses ComponentRegistry for all base UI (Button, Card, Badge, Skeleton, Progress).\n */\n\nimport React from \"react\";\nimport {\n ArrowRight,\n CheckCircle2,\n Clock,\n DollarSign,\n Loader2,\n XCircle,\n AlertCircle,\n} from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { getChainLogo } from \"../assets/chains\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport type { Route, Token } from \"@naculus/connect-core\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface TokenDisplay {\n chainId: number;\n address: string;\n symbol: string;\n}\n\nexport interface RouteSelectorProps {\n /** Optional input token info for the header display */\n inputToken?: TokenDisplay;\n /** Optional output token info for the header display */\n outputToken?: TokenDisplay;\n /** Input amount in human-readable units (natural numbers, not wei) */\n amount?: bigint;\n /** Current list of route quotes (pass empty array for no routes state) */\n routes?: Route[];\n /** Whether route quotes are being fetched */\n loading?: boolean;\n /** Whether a route execution is in progress */\n executing?: boolean;\n /** Called when user selects a route */\n onRouteSelected?: (route: Route) => void;\n /** Called when user cancels route selection */\n onCancel?: () => void;\n /** Success message (tx hash) after route execution completes */\n successTxHash?: string | null;\n /** Error message to display */\n error?: string | null;\n /** Optional className overrides */\n className?: string;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction humanReadableCost(cost: bigint, decimals = 18): string {\n // Rough estimate: convert wei to ether\n const divisor = BigInt(10) ** BigInt(decimals);\n const whole = cost / divisor;\n const fraction = cost % divisor;\n\n if (whole === 0n && fraction === 0n) return \"$0.00\";\n if (whole === 0n) return `~$${(Number(fraction) / Number(divisor)).toFixed(2)}`;\n\n const ethValue = Number(whole) + Number(fraction) / Number(divisor);\n return `~$${ethValue.toFixed(2)}`;\n}\n\nfunction formatTime(ms: number): string {\n if (ms < 1000) return `<1s`;\n if (ms < 60_000) return `~${Math.round(ms / 1000)}s`;\n const min = Math.floor(ms / 60_000);\n const sec = Math.round((ms % 60_000) / 1000);\n return sec > 0 ? `~${min}m ${sec}s` : `~${min}m`;\n}\n\nfunction formatSlippage(percent: number): string {\n const pct = percent < 0.01 ? \"<0.01\" : percent.toFixed(2);\n return `${pct}%`;\n}\n\nfunction formatSymbol(token: Token): string {\n return token.symbol || \"UNKNOWN\";\n}\n\nfunction getProviderBadgeVariant(provider: string): string {\n const p = provider.toLowerCase();\n if (p.includes(\"lifi\")) return \"default\";\n if (p.includes(\"axelar\")) return \"secondary\";\n return \"outline\";\n}\n\nfunction formatTxHash(txHash: string): string {\n return txHash.length > 12\n ? `${txHash.slice(0, 6)}...${txHash.slice(-6)}`\n : txHash;\n}\n\n// ── Route Card ────────────────────────────────────────────────────────\n\ninterface RouteCardProps {\n route: Route;\n onSelect: () => void;\n}\n\nfunction RouteCard({ route, onSelect }: RouteCardProps) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n const Badge = registry.Badge as React.ComponentType<\n React.HTMLAttributes<HTMLSpanElement> & { variant?: string }\n >;\n\n const providerName = route.provider ?? \"Route\";\n\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-border p-4 transition-colors hover:bg-accent/30\">\n <div className=\"flex flex-col gap-1.5 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {Badge ? (\n <Badge variant={getProviderBadgeVariant(providerName)}>\n {providerName}\n </Badge>\n ) : (\n <span className=\"inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-medium\">\n {providerName}\n </span>\n )}\n {route.steps.length > 1 && (\n <span className=\"text-xs text-muted-foreground\">\n {route.steps.length} steps\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm\">\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <DollarSign className=\"h-3.5 w-3.5\" />\n ${route.gasCosts.totalUsd}\n </span>\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" />\n {formatTime(\n route.steps.reduce<number>((max, _step) => {\n // Estimate: 15s per swap step, 2min per bridge step\n const baseTime = route.estimatedTime > 0 ? 15_000 : 0;\n return max + baseTime;\n }, 0),\n )}\n </span>\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n {route.gasCosts.totalUsd} cost\n </span>\n </div>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onSelect}\n >\n Select\n </Button>\n </div>\n );\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────\n\nfunction LoadingSkeleton() {\n const registry = useComponentRegistry();\n const Skeleton = registry.Skeleton as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement>\n >;\n\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"route-selector-loading\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Fetching best routes...</span>\n </div>\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"flex items-center justify-between gap-4 rounded-lg border border-border p-4\"\n >\n <div className=\"flex flex-col gap-2 flex-1\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-48\" />\n </>\n ) : (\n <>\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-48 animate-pulse rounded bg-muted\" />\n </>\n )}\n </div>\n {Skeleton ? (\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n ) : (\n <div className=\"h-8 w-20 animate-pulse rounded-md bg-muted\" />\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction EmptyState() {\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-2 py-8 text-sm text-muted-foreground\"\n data-testid=\"route-selector-empty\"\n >\n <AlertCircle className=\"h-8 w-8 opacity-40\" />\n <span>No routes found for this pair</span>\n <span className=\"text-xs\">Try a different token or amount</span>\n </div>\n );\n}\n\nfunction ErrorState({ error, onRetry }: { error: string; onRetry?: () => void }) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-2 py-6\"\n data-testid=\"route-selector-error\"\n >\n <XCircle className=\"h-8 w-8 text-destructive\" />\n <p className=\"text-sm text-destructive font-medium\">Failed to fetch routes</p>\n <p className=\"text-xs text-muted-foreground max-w-xs text-center\">{error}</p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n Retry\n </Button>\n )}\n </div>\n );\n}\n\nfunction ExecutionProgress() {\n const registry = useComponentRegistry();\n const Progress = registry.Progress as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement> & { value?: number }\n >;\n\n return (\n <div className=\"flex flex-col items-center gap-3 py-6\" data-testid=\"route-selector-executing\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <p className=\"text-sm font-medium\">Executing route...</p>\n <p className=\"text-xs text-muted-foreground\">Please confirm the transaction in your wallet</p>\n {Progress ? (\n <Progress value={50} className=\"w-48 h-1.5\" />\n ) : (\n <div className=\"h-1.5 w-48 rounded-full bg-muted\">\n <div className=\"h-full w-1/2 rounded-full bg-primary animate-pulse\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction SuccessState({ txHash }: { txHash: string }) {\n return (\n <div\n className=\"flex flex-col items-center gap-2 py-6\"\n data-testid=\"route-selector-success\"\n >\n <CheckCircle2 className=\"h-8 w-8 text-green-500\" />\n <p className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n Route executed successfully!\n </p>\n <p className=\"text-xs text-muted-foreground font-mono\">\n TX: {formatTxHash(txHash)}\n </p>\n </div>\n );\n}\n\nfunction ChainLogo({ chainId, className }: { chainId: number; className?: string }) {\n const svgStr = getChainLogo(`eip155:${chainId}`);\n if (!svgStr) return null;\n return (\n <span\n className={cn(\"inline-flex items-center justify-center shrink-0\", className)}\n dangerouslySetInnerHTML={{ __html: svgStr }}\n />\n );\n}\n\n// ── Main Component ─────────────────────────────────────────────────────\n\nexport function RouteSelector({\n inputToken,\n outputToken,\n amount,\n routes = [],\n loading = false,\n executing = false,\n onRouteSelected,\n onCancel,\n successTxHash,\n error,\n className,\n}: RouteSelectorProps) {\n const registry = useComponentRegistry();\n const Card = registry.Card as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement>\n >;\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n\n // ── Determine state ──────────────────────────────────────────────\n\n // Execution states take precedence\n if (successTxHash) {\n return (\n <div className={cn(\"rounded-lg border border-border\", className)}>\n <SuccessState txHash={successTxHash} />\n </div>\n );\n }\n\n if (executing) {\n return (\n <div className={cn(\"rounded-lg border border-border\", className)}>\n <ExecutionProgress />\n </div>\n );\n }\n\n // ── Content ──────────────────────────────────────────────────────\n\n const content = Card ? (\n <Card className={cn(\"p-4\", className)}>\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </Card>\n ) : (\n <div className={cn(\"rounded-lg border border-border p-4\", className)}>\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </div>\n );\n\n return content;\n\n // ── Internal render helpers ─────────────────────────────────────\n\n function renderHeader() {\n if (!inputToken && !outputToken) return null;\n\n return (\n <div className=\"mb-4 flex flex-wrap items-center gap-2 text-sm\">\n {inputToken && (\n <span className=\"inline-flex items-center gap-1.5 font-medium\">\n <ChainLogo chainId={inputToken.chainId} className=\"h-4 w-4\" />\n {amount ? `${amount.toString()} ` : \"\"}\n {formatSymbol(inputToken as unknown as Token)}\n </span>\n )}\n {inputToken && outputToken && (\n <ArrowRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n {outputToken && (\n <span className=\"inline-flex items-center gap-1.5 font-medium\">\n <ChainLogo chainId={outputToken.chainId} className=\"h-4 w-4\" />\n {formatSymbol(outputToken as unknown as Token)}\n </span>\n )}\n </div>\n );\n }\n\n function renderBody() {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorState error={error} />;\n }\n\n if (routes.length === 0) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid=\"route-selector-routes\">\n {routes.map((route, idx) => (\n <RouteCard\n key={`${route.fromChain}-${route.toChain}-${route.gasCosts.totalUsd}-${idx}`}\n route={route}\n onSelect={() => onRouteSelected?.(route)}\n />\n ))}\n </div>\n );\n }\n\n function renderFooter() {\n // Show cancel button only when we have routes to select or are loading\n if (!loading && routes.length === 0 && !error) return null;\n\n return (\n <div className=\"mt-4 flex justify-end\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n </div>\n );\n }\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { Shield, ShieldCheck, LoaderCircle, Settings, ChevronRight, AlertCircle, RotateCcw, CheckCircle2, Fuel, Zap, RefreshCw } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\n\nexport interface SmartWalletToggleProps {\n isDeployed?: boolean\n isDeploying?: boolean\n estimatedGas?: bigint\n error?: string | null\n onUpgrade?: () => void\n onShowSettings?: () => void\n onRetry?: () => void\n}\n\nfunction formatGas(gas: bigint): string {\n const eth = Number(gas) / 1e18\n return eth < 0.001 ? `~${eth.toFixed(6)} ETH` : `~${eth.toFixed(3)} ETH`\n}\n\ntype ShadcnButton = React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n\nexport function SmartWalletToggle({\n isDeployed = false, isDeploying = false, estimatedGas,\n error = null, onUpgrade, onShowSettings, onRetry,\n}: SmartWalletToggleProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as ShadcnButton\n const Card = registry.Card as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n const Badge = registry.Badge as React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { variant?: string }>\n\n const settingsBtn = onShowSettings ? (\n <Button variant=\"outline\" className=\"w-full\" onClick={onShowSettings}>\n <Settings size={15} /> Advanced Settings <ChevronRight size={14} className=\"text-muted-foreground\" />\n </Button>\n ) : null\n\n // ── Deployed ────────────────────────────────────\n if (isDeployed) {\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-green-500/10\">\n <ShieldCheck size={22} className=\"text-green-500\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">Smart Wallet</span>\n <Badge variant=\"secondary\" className=\"rounded-full bg-green-500/10 px-2 py-0 text-xs font-medium text-green-500\">\n <CheckCircle2 size={12} className=\"mr-0.5 inline\" /> Deployed\n </Badge>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">Your wallet has been upgraded to a smart wallet</p>\n </div>\n </div>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n {[[Fuel, \"Gas Sponsorship\", \"Enabled\"] as const, [RefreshCw, \"Recovery\", \"Enabled\"] as const].map(([Icon, label, val], i) => (\n <div key={i} className=\"rounded-lg bg-muted/50 p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {React.createElement(Icon as never, { size: 14 })}\n <span>{label}</span>\n </div>\n <div className=\"mt-1 text-sm font-medium text-foreground\">{val}</div>\n </div>\n ))}\n </div>\n {onShowSettings && <div className=\"mt-4\">{settingsBtn}</div>}\n </Card>\n )\n }\n\n // ── Deploying ────────────────────────────────────\n if (isDeploying) {\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex flex-col items-center text-center\">\n <div className=\"mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-primary/10\">\n <LoaderCircle size={28} className=\"animate-spin text-primary\" />\n </div>\n <h3 className=\"mb-1 text-base font-semibold text-foreground\">Deploying Smart Wallet...</h3>\n <p className=\"mb-4 text-sm text-muted-foreground\">Please wait, contract deployment may take a few seconds</p>\n <div className=\"h-2 w-full max-w-[200px] overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full w-full animate-pulse rounded-full bg-primary\" style={{ animationDuration: \"1.5s\" }} />\n </div>\n </div>\n </Card>\n )\n }\n\n // ── Error ────────────────────────────────────────\n if (error) {\n return (\n <Card className=\"w-full rounded-xl border border-destructive/30 bg-destructive/5 p-5 shadow-sm\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-destructive/10\">\n <AlertCircle size={18} className=\"text-destructive\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h4 className=\"text-sm font-semibold text-destructive\">Deployment Failed</h4>\n <p className=\"mt-1 text-xs text-destructive/80 break-words\">{error}</p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3 border-destructive/30 text-destructive hover:bg-destructive/10\" onClick={onRetry}>\n <RotateCcw size={13} /> Retry\n </Button>\n )}\n </div>\n </div>\n {onShowSettings && <div className=\"mt-3\">{settingsBtn}</div>}\n </Card>\n )\n }\n\n // ── Not deployed ─────────────────────────────────\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-amber-500/10\">\n <Shield size={20} className=\"text-amber-500\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">Smart Wallet</span>\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">Not Upgraded</span>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">Upgrade to a smart wallet for more features</p>\n </div>\n </div>\n <div className=\"mt-4 space-y-2\">\n <Benefit icon={Zap} color=\"text-green-500\" text=\"No ETH needed for transactions — pay gas with USDC/USDT\" />\n <Benefit icon={Fuel} color=\"text-blue-500\" text=\"Optional dApp sponsorship, zero-cost transactions\" />\n <Benefit icon={ShieldCheck} color=\"text-purple-500\" text=\"Secure recovery mechanism, no fear of losing keys\" />\n </div>\n {onUpgrade && (\n <Button className=\"mt-4 w-full\" onClick={onUpgrade}>\n Upgrade Now\n {estimatedGas !== undefined && <span className=\"ml-1 text-xs opacity-80\">(Estimated gas fee: {formatGas(estimatedGas)})</span>}\n </Button>\n )}\n {onShowSettings && <>\n <div className=\"mt-4 mb-3 flex items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" /><span className=\"text-xs text-muted-foreground\">or</span><div className=\"h-px flex-1 bg-border\" />\n </div>\n {settingsBtn}\n </>}\n </Card>\n )\n}\n\nfunction Benefit({ icon: Icon, color, text }: { icon: React.ComponentType<{ size: number; className?: string }>; color: string; text: string }) {\n return (\n <div className=\"flex items-center gap-2.5 text-sm text-foreground/80\">\n <Icon size={14} className={`shrink-0 ${color}`} />\n <span>{text}</span>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useState, useCallback } from \"react\"\nimport { ArrowLeft, Save, Shield, Users, KeyRound, Fuel, Wrench, Plus, X } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\n\nexport type AccountType = \"simple\" | \"multi-sig\" | \"social-recovery\"\nexport type PaymasterType = \"self\" | \"sponsor\" | \"erc20\" | \"custom\"\nexport type BundlerPreset = \"pimlico\" | \"stackup\" | \"alchemy\" | \"custom\"\n\nexport interface SmartWalletConfig {\n accountType: AccountType\n paymasterType: PaymasterType\n customPaymasterUrl: string\n bundlerPreset: BundlerPreset\n customBundlerUrl: string\n guardians: string[]\n threshold: number\n}\n\nexport interface SmartWalletSettingsProps {\n currentConfig?: Partial<SmartWalletConfig>\n onSave?: (config: SmartWalletConfig) => void\n onBack?: () => void\n}\n\nconst ACCOUNT_TYPE_OPTIONS: Array<{\n value: AccountType; label: string; description: string; icon: React.ReactNode\n}> = [\n { value: \"simple\", label: \"Single Sign (default)\", description: \"Single key control, simple and secure\", icon: <Shield size={16} /> },\n { value: \"multi-sig\", label: \"Multi-Sign (2-of-3)\", description: \"Requires multiple signers to authorize transactions\", icon: <Users size={16} /> },\n { value: \"social-recovery\", label: \"Social Recovery\", description: \"Set guardian accounts to help recover\", icon: <KeyRound size={16} /> },\n]\n\nconst PAYMASTER_OPTIONS: Array<{ value: PaymasterType; label: string; description: string }> = [\n { value: \"self\", label: \"Pay Self (ETH)\", description: \"Pay gas fees with ETH\" },\n { value: \"sponsor\", label: \"Sponsored by dApp\", description: \"dApp covers your gas fees\" },\n { value: \"erc20\", label: \"Pay with USDC/USDT\", description: \"Use ERC-20 tokens for gas\" },\n { value: \"custom\", label: \"Custom Paymaster URL\", description: \"Use a custom paymaster service\" },\n]\n\nconst BUNDLER_OPTIONS: Array<{ value: BundlerPreset; label: string; description: string }> = [\n { value: \"pimlico\", label: \"Pimlico\", description: \"High-performance bundler service\" },\n { value: \"stackup\", label: \"Stackup\", description: \"Decentralized bundler network\" },\n { value: \"alchemy\", label: \"Alchemy\", description: \"Alchemy AA infrastructure\" },\n { value: \"custom\", label: \"Custom Bundler URL\", description: \"Use custom bundler endpoint\" },\n]\n\nfunction defaultConfig(): SmartWalletConfig {\n return {\n accountType: \"simple\", paymasterType: \"self\", customPaymasterUrl: \"\",\n bundlerPreset: \"pimlico\", customBundlerUrl: \"\",\n guardians: [], threshold: 2,\n }\n}\n\ntype ShadcnButton = React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\ntype ShadcnInput = React.ComponentType<React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>\n\nexport function SmartWalletSettings({ currentConfig, onSave, onBack }: SmartWalletSettingsProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as ShadcnButton\n const Input = registry.Input as ShadcnInput\n const Card = registry.Card as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n const Separator = registry.Separator as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n\n const [config, setConfig] = useState<SmartWalletConfig>({ ...defaultConfig(), ...currentConfig })\n const [newGuardian, setNewGuardian] = useState(\"\")\n const [saved, setSaved] = useState(false)\n\n const radioStyle = (active: boolean) =>\n cn(\"flex cursor-pointer items-center gap-3 rounded-lg border px-4 py-3 transition-all duration-200\",\n active ? \"border-primary bg-primary/5\" : \"border-border hover:bg-accent\")\n\n const sectionInputStyle =\n \"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground outline-none focus:border-ring focus:ring-2 focus:ring-ring focus:ring-offset-2 transition-all duration-200\"\n\n const handleSave = useCallback(() => {\n onSave?.(config)\n setSaved(true)\n setTimeout(() => setSaved(false), 2000)\n }, [config, onSave])\n\n const handleAddGuardian = useCallback(() => {\n const addr = newGuardian.trim()\n if (!addr || config.guardians.includes(addr)) return\n setConfig((prev) => ({ ...prev, guardians: [...prev.guardians, addr] }))\n setNewGuardian(\"\")\n }, [newGuardian, config.guardians])\n\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-5\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ArrowLeft size={15} />\n Back\n </Button>\n )}\n <h2 className=\"text-lg font-semibold text-foreground\">Smart Wallet Settings</h2>\n </div>\n </div>\n\n {/* Account Type */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Shield size={15} /> Verification Method\n </h3>\n <div className=\"space-y-2\">\n {ACCOUNT_TYPE_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.accountType === opt.value)}>\n <input type=\"radio\" name=\"accountType\" value={opt.value}\n checked={config.accountType === opt.value}\n onChange={() => setConfig((p) => ({ ...p, accountType: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex items-center gap-2 text-foreground\">{opt.icon}</div>\n <div>\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n </section>\n\n {/* Social Recovery */}\n {config.accountType === \"social-recovery\" && (\n <section className=\"mb-6 rounded-lg border border-border bg-muted/30 p-4\">\n <h4 className=\"mb-2 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <KeyRound size={14} /> Guardian Addresses\n </h4>\n <p className=\"mb-3 text-xs text-muted-foreground\">\n Set at least one guardian to help recover your wallet if you lose your key\n </p>\n {config.guardians.length > 0 && (\n <div className=\"mb-3 space-y-1.5\">\n {config.guardians.map((addr) => (\n <div key={addr} className=\"flex items-center justify-between rounded-md bg-card px-3 py-2 text-sm\">\n <span className=\"font-mono text-xs text-foreground\">\n {addr.slice(0, 8)}...{addr.slice(-6)}\n </span>\n <Button variant=\"ghost\" size=\"icon\"\n onClick={() => setConfig((p) => ({ ...p, guardians: p.guardians.filter((g) => g !== addr) }))}>\n <X size={14} />\n </Button>\n </div>\n ))}\n </div>\n )}\n <div className=\"flex gap-2\">\n <Input\n type=\"text\" placeholder=\"Enter guardian address (0x...)\" value={newGuardian}\n onChange={(e) => setNewGuardian(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") { e.preventDefault(); handleAddGuardian() } }}\n className=\"flex-1\"\n />\n <Button size=\"sm\" onClick={handleAddGuardian} disabled={!newGuardian.trim()}>\n <Plus size={14} /> Add\n </Button>\n </div>\n </section>\n )}\n\n {/* Multi-sig threshold */}\n {config.accountType === \"multi-sig\" && (\n <section className=\"mb-6 rounded-lg border border-border bg-muted/30 p-4\">\n <h4 className=\"mb-2 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Users size={14} /> Signing Threshold\n </h4>\n <p className=\"mb-3 text-xs text-muted-foreground\">\n Set how many signers are needed to authorize a transaction\n </p>\n <div className=\"flex items-center gap-3\">\n {[1, 2, 3].map((n) => (\n <label key={n} className={radioStyle(config.threshold === n)}>\n <input type=\"radio\" name=\"threshold\" value={n}\n checked={config.threshold === n}\n onChange={() => setConfig((p) => ({ ...p, threshold: n }))}\n className=\"sr-only\" />\n {n}-of-3\n </label>\n ))}\n </div>\n </section>\n )}\n\n <Separator className=\"my-4\" />\n\n {/* Gas / Paymaster */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Fuel size={15} /> Gas Fees\n </h3>\n <div className=\"space-y-2\">\n {PAYMASTER_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.paymasterType === opt.value)}>\n <input type=\"radio\" name=\"paymasterType\" value={opt.value}\n checked={config.paymasterType === opt.value}\n onChange={() => setConfig((p) => ({ ...p, paymasterType: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n {config.paymasterType === \"custom\" && (\n <div className=\"mt-3\">\n <input type=\"text\" placeholder=\"Custom Paymaster URL\" value={config.customPaymasterUrl}\n onChange={(e) => setConfig((p) => ({ ...p, customPaymasterUrl: e.target.value }))}\n className={sectionInputStyle} />\n </div>\n )}\n </section>\n\n <Separator className=\"my-4\" />\n\n {/* Bundler */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Wrench size={15} /> Bundler\n </h3>\n <div className=\"space-y-2\">\n {BUNDLER_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.bundlerPreset === opt.value)}>\n <input type=\"radio\" name=\"bundlerPreset\" value={opt.value}\n checked={config.bundlerPreset === opt.value}\n onChange={() => setConfig((p) => ({ ...p, bundlerPreset: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n {config.bundlerPreset === \"custom\" && (\n <div className=\"mt-3\">\n <input type=\"text\" placeholder=\"Custom Bundler URL\" value={config.customBundlerUrl}\n onChange={(e) => setConfig((p) => ({ ...p, customBundlerUrl: e.target.value }))}\n className={sectionInputStyle} />\n </div>\n )}\n </section>\n\n {/* Actions */}\n <div className=\"flex items-center gap-3\">\n <Button className=\"flex-1\" onClick={handleSave}>\n <Save size={15} />\n {saved ? \"Saved ✓\" : \"Save Settings\"}\n </Button>\n {onBack && (\n <Button variant=\"outline\" onClick={onBack}>\n <ArrowLeft size={15} />\n ← Back to Simple Mode\n </Button>\n )}\n </div>\n </Card>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { AlertTriangle, CheckCircle, ShieldAlert, X } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { useValidateDestination } from \"@naculus/connect-appkit-react\"\nimport type { AddressValidationLevel } from \"@naculus/connect-appkit-react\"\n\nexport interface AddressWarningDialogProps {\n address: string\n open: boolean\n onClose: () => void\n onProceed?: () => void\n}\n\nconst LEVEL_CONFIG: Record<\n AddressValidationLevel,\n { icon: React.ReactNode; label: string; colorClass: string; bgClass: string; buttonVariant: string }\n> = {\n safe: {\n icon: <CheckCircle size={20} />,\n label: \"Safe\",\n colorClass: \"text-[hsl(var(--safe,142_76%_36%))]\",\n bgClass: \"bg-[hsl(var(--safe)/0.1)]\",\n buttonVariant: \"default\",\n },\n warning: {\n icon: <AlertTriangle size={20} />,\n label: \"Warning\",\n colorClass: \"text-[hsl(var(--warning,38_92%_50%))]\",\n bgClass: \"bg-[hsl(var(--warning)/0.1)]\",\n buttonVariant: \"default\",\n },\n blocked: {\n icon: <ShieldAlert size={20} />,\n label: \"Blocked\",\n colorClass: \"text-destructive\",\n bgClass: \"bg-destructive/10\",\n buttonVariant: \"destructive\",\n },\n}\n\nexport function AddressWarningDialog({\n address,\n open,\n onClose,\n onProceed,\n}: AddressWarningDialogProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string; disabled?: boolean; className?: string; children?: React.ReactNode }> | undefined\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange?: (v: boolean) => void; children?: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n\n const { validation } = useValidateDestination({ address })\n const { level, warning } = validation\n const config = LEVEL_CONFIG[level]\n const isBlocked = level === \"blocked\"\n\n const shortAddress = address.length > 12\n ? `${address.slice(0, 6)}...${address.slice(-4)}`\n : address\n\n const buttonClass = (variant: string) =>\n cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg\",\n \"text-sm font-medium transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"h-10 px-4 py-2\",\n variant === \"outline\" && \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n variant === \"destructive\" && \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm\",\n variant === \"default\" && \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\n )\n\n const body = (\n <div className=\"flex flex-col gap-4\">\n <div className={cn(\"flex items-center gap-3 rounded-lg p-4\", config.bgClass)}>\n <span className={config.colorClass}>{config.icon}</span>\n <div className=\"flex flex-col gap-0.5\">\n <span className={cn(\"text-sm font-semibold\", config.colorClass)}>\n {config.label}\n </span>\n <span className=\"text-xs text-muted-foreground break-all font-mono\">\n {shortAddress}\n </span>\n </div>\n </div>\n\n {warning && (\n <p className=\"text-sm text-muted-foreground m-0\">{warning}</p>\n )}\n\n <div className=\"flex gap-2 justify-end pt-2\">\n {Button ? (\n <Button\n onClick={onClose}\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n >\n Cancel\n </Button>\n ) : (\n <button type=\"button\" onClick={onClose} className={cn(buttonClass(\"outline\"), \"w-full sm:w-auto\")}>\n Cancel\n </button>\n )}\n {onProceed && (Button ? (\n <Button\n onClick={onProceed}\n variant={isBlocked ? \"destructive\" : \"default\"}\n disabled={isBlocked}\n className=\"w-full sm:w-auto\"\n >\n Proceed anyway\n </Button>\n ) : (\n <button\n type=\"button\"\n onClick={onProceed}\n disabled={isBlocked}\n className={cn(buttonClass(isBlocked ? \"destructive\" : \"default\"), \"w-full sm:w-auto\")}\n >\n Proceed anyway\n </button>\n ))}\n </div>\n </div>\n )\n\n if (Dialog && DialogContent && DialogHeader && DialogTitle) {\n return (\n <Dialog open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Address Warning</DialogTitle>\n </DialogHeader>\n {body}\n </DialogContent>\n </Dialog>\n )\n }\n\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div className=\"absolute inset-0 bg-black/80\" aria-hidden=\"true\" onClick={onClose} />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className=\"relative z-10 w-full max-w-sm rounded-xl border bg-card text-card-foreground shadow-2xl p-6\"\n >\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">Address Warning</h2>\n <button\n onClick={onClose}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n {body}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { Wallet, AlertCircle } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport type { DiscoveredWallet } from \"../hooks/useEIP6963\"\n\nexport interface WalletPickerProps {\n wallets: DiscoveredWallet[]\n onSelect: (wallet: DiscoveredWallet) => void\n loading?: boolean\n error?: string | null\n}\n\nexport function WalletPicker({\n wallets,\n onSelect,\n loading = false,\n error = null,\n}: WalletPickerProps) {\n const registry = useComponentRegistry()\n const Card = registry.Card as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n\n const wrapper = (children: React.ReactNode) =>\n Card ? (\n <Card className=\"p-4\">{children}</Card>\n ) : (\n <div className=\"rounded-xl border bg-card text-card-foreground shadow-sm p-4\">{children}</div>\n )\n\n if (loading) {\n return wrapper(\n <div className=\"flex flex-col gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 p-3 rounded-lg animate-pulse\">\n <div className=\"h-10 w-10 rounded-full bg-muted\" />\n <div className=\"h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n <p className=\"text-xs text-muted-foreground text-center m-0\">Detecting wallets...</p>\n </div>\n )\n }\n\n if (error) {\n return wrapper(\n <div className=\"flex flex-col items-center gap-3 py-4\">\n <AlertCircle size={24} className=\"text-destructive\" />\n <p className=\"text-sm text-destructive m-0 font-medium\">{error}</p>\n </div>\n )\n }\n\n if (wallets.length === 0) {\n return wrapper(\n <div className=\"flex flex-col items-center gap-3 py-6\">\n <Wallet size={32} className=\"text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground m-0 text-center\">\n No wallets detected.\n <br />\n Install a browser wallet extension to get started.\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {wallets.map((wallet) => (\n <button\n key={wallet.id}\n type=\"button\"\n onClick={() => onSelect(wallet)}\n className={cn(\n \"flex items-center gap-3 w-full p-3 rounded-lg\",\n \"border border-input bg-card hover:bg-accent hover:text-accent-foreground\",\n \"transition-all duration-200 cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n )}\n >\n {wallet.icon ? (\n <img\n src={wallet.icon}\n alt={wallet.name}\n className=\"h-10 w-10 rounded-full object-cover shrink-0\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\"\n }}\n />\n ) : (\n <div className=\"h-10 w-10 rounded-full bg-muted flex items-center justify-center shrink-0\">\n <Wallet size={18} className=\"text-muted-foreground\" />\n </div>\n )}\n <div className=\"flex flex-col items-start gap-0.5 text-left min-w-0\">\n <span className=\"text-sm font-medium truncate w-full\">{wallet.name}</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">{wallet.rdns}</span>\n </div>\n </button>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":["index_exports","__export","AccountButton","AddressWarningDialog","AppKit","AppKitButton","AppKitChainSelector","ChainSelector","ConnectButtonAdapter","ErrorBoundary","QRCodeModal","RouteSelector","SeedPhraseBackup","SignInButton","SmartWalletSettings","SmartWalletToggle","ThemeProvider","WalletConnectProvider","WalletPicker","Web3ComponentProvider","Web3ConnectUI","cn","useAppKit","useComponent","useComponentRegistry","useDetectionMode","useEIP6963","useIsMobile","useTheme","useThemeVariable","useWalletConnect","useWalletConnectOptional","__toCommonJS","import_react","import_connect_appkit_react","import_react","import_connect_appkit_react","import_jsx_runtime","WalletConnectContext","WalletConnectProvider","children","web3","qrUri","setQrUri","showQR","setShowQR","qrStatus","setQrStatus","error","setError","cancelQR","connectRef","uri","err","connectWalletConnect","retryQR","state","value","useWalletConnect","context","useWalletConnectOptional","import_react","useEIP6963","wallets","setWallets","isDetecting","setIsDetecting","seenRef","handleAnnounce","e","detail","info","provider","prev","w","timer","import_react","useIsMobile","mobile","setMobile","ua","import_jsx_runtime","ConnectButtonAdapter","className","extConnected","extConnecting","onConnect","onDisconnect","onMobileDeepLink","mobileWalletName","startPairing","completePairing","address","balance","balanceSymbol","tokenBalances","isBalanceLoading","explorerUrl","explorerLabel","wcCtx","useWalletConnectOptional","wallets","useEIP6963","isMobile","useIsMobile","qrUri","setQrUri","qrLoading","setQrLoading","qrError","setQrError","pairingRef","qrStatus","ctxUri","ctxErr","emitConnect","kind","walletId","uri","err","e","import_connect_core","import_react","import_connect_appkit_react","import_clsx","import_tailwind_merge","cn","inputs","ETH_LOGO","POLYGON_LOGO","BSC_LOGO","ARBITRUM_LOGO","OPTIMISM_LOGO","AVALANCHE_LOGO","FANTOM_LOGO","CHAIN_LOGOS","getChainLogo","chainId","import_react","import_lucide_react","import_jsx_runtime","DefaultAvatar","children","AccountButton","className","showAddress","showBalance","externalAddress","externalBalance","balanceSymbol","onConnect","Button","useComponentRegistry","address","shortAddress","formattedBalance","import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","DefaultDialog","open","onClose","children","closable","prev","handler","e","DefaultDialogHeader","title","showCloseButton","DefaultDialogContent","className","cn","import_jsx_runtime","renderQR","canvas","uri","qrcode","resolve","reject","err","QRCodeModal","open","onClose","onDeepLink","onRetry","status","explicitShowDeepLink","timeoutMs","title","description","className","canvasRef","qrError","setQrError","timeElapsed","setTimeElapsed","isMobile","useIsMobile","registry","useComponentRegistry","Button","showDeepLink","timerRef","start","isExpired","needsNewCode","remaining","minutes","seconds","progress","handleDeepLink","qrContent","ModalToUse","DefaultDialog","import_react","import_lucide_react","import_jsx_runtime","SignInButton","className","isSignedIn","isSigningIn","result","error","onSignIn","onClearError","children","showDetails","setShowDetails","copiedSign","setCopiedSign","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","handleCopySignature","prev","open","SignInDetails","onClose","onCopy","msg","signature","shortSig","import_react","import_lucide_react","import_jsx_runtime","shuffleArray","arr","a","i","j","buildConfirmWords","phrase","count","words","_","idx","correct","others","distractors","options","SeedPhraseBackup","seedPhrase","onConfirm","onSkip","onExportPrivateKey","className","wordCount","inline","open","onOpenChange","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","step","setStep","revealed","setRevealed","copied","setCopied","confirmWords","setConfirmWords","selectedWords","setSelectedWords","confirmErrors","setConfirmErrors","showExportKey","setShowExportKey","exportedKey","setExportedKey","detectedWordCount","handleReveal","handleCopy","handleStartConfirm","handleSelectWord","wordIndex","word","prev","handleVerify","errors","cw","handleSkip","handleExportKey","key","allConfirmedSelected","revealContent","confirmContent","hasError","cn","opt","isSelected","steps","titles","body","title","o","DefaultDialog","import_react","import_jsx_runtime","DefaultErrorFallback","error","reset","dismiss","retryLabel","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","isOpen","onClose","DefaultDialog","DefaultDialogHeader","DefaultDialogContent","ErrorBoundary","React","props","errorInfo","prev","import_react","import_connect_appkit_react","import_react","import_connect_appkit_react","import_react","THEME_CONTRACT","cache","clearCSSVariableCache","cache","import_jsx_runtime","ThemeContext","generateCSS","theme","rules","key","value","cssVar","THEME_CONTRACT","getDefinedVars","priority","defined","existing","ThemeProvider","children","defaultDark","customTheme","setCustomTheme","isDark","setIsDark","clearCSSVariableCache","devDefined","setDevDefined","effectiveTheme","filtered","cssString","root","styleId","toggleDarkMode","prev","useTheme","useThemeVariable","name","setValue","customValue","cssValue","import_jsx_runtime","DetectionContext","useDetectionMode","Web3ConnectUI","config","children","autoConnect","detectionMode","theme","defaultDark","themePriority","detectionCtx","needsWalletConnect","ThemeProvider","Web3ComponentProvider","QRCodeModal","WalletConnectProvider","import_jsx_runtime","AppKitContext","useAppKit","ctx","AppKit","projectId","metadata","enableEmbedded","enablePasskeys","children","className","autoConnect","theme","defaultDark","themePriority","detectionMode","open","setOpen","backupOpen","setBackupOpen","config","Web3ConnectUI","AppKitInner","isConnected","isConnecting","primaryAccount","currentChain","availableChains","switchChain","embedded","disconnect","wallets","hasWallets","useEIP6963","balanceRaw","balance","handleDisconnect","handleConfirmBackup","handleSkipBackup","handleExportPrivateKey","value","c","SeedPhraseBackup","AppKitButton","cn","ChainSelector","ConnectButtonAdapter","AppKitChainSelector","variant","import_jsx_runtime","DEFAULT_COMPONENTS","ConnectButtonAdapter","AccountButton","ChainSelector","QRCodeModal","SignInButton","SeedPhraseBackup","ErrorBoundary","AppKit","AppKitButton","AppKitChainSelector","Web3ConnectUI","ComponentRegistryContext","Web3ComponentProvider","children","components","value","useComponentRegistry","useComponent","name","import_jsx_runtime","ChainLogo","chainId","className","svgStr","getChainLogo","cn","ChainSelector","showLabel","variant","currentChain","availableChains","switchChain","isEvm","isConnected","isOpen","setIsOpen","RegistryButton","useComponentRegistry","dropdownRef","handleClickOutside","e","chainName","hasMultipleChains","chain","isActive","import_lucide_react","import_jsx_runtime","formatTime","ms","min","sec","formatSymbol","token","getProviderBadgeVariant","provider","p","formatTxHash","txHash","RouteCard","route","onSelect","registry","useComponentRegistry","Button","Badge","providerName","formatTime","max","_step","baseTime","LoadingSkeleton","Skeleton","i","EmptyState","ErrorState","error","onRetry","ExecutionProgress","Progress","SuccessState","ChainLogo","chainId","className","svgStr","getChainLogo","cn","RouteSelector","inputToken","outputToken","amount","routes","loading","executing","onRouteSelected","onCancel","successTxHash","Card","renderHeader","renderBody","renderFooter","idx","import_react","import_lucide_react","import_jsx_runtime","formatGas","gas","eth","SmartWalletToggle","isDeployed","isDeploying","estimatedGas","error","onUpgrade","onShowSettings","onRetry","registry","useComponentRegistry","Button","Card","Badge","settingsBtn","Icon","label","val","i","React","Benefit","color","text","import_react","import_lucide_react","import_jsx_runtime","ACCOUNT_TYPE_OPTIONS","PAYMASTER_OPTIONS","BUNDLER_OPTIONS","defaultConfig","SmartWalletSettings","currentConfig","onSave","onBack","registry","useComponentRegistry","Button","Input","Card","Separator","config","setConfig","newGuardian","setNewGuardian","saved","setSaved","radioStyle","active","cn","sectionInputStyle","handleSave","handleAddGuardian","addr","prev","opt","p","g","e","n","import_lucide_react","import_connect_appkit_react","import_jsx_runtime","LEVEL_CONFIG","AddressWarningDialog","address","open","onClose","onProceed","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","validation","level","warning","config","isBlocked","shortAddress","buttonClass","variant","cn","body","v","import_lucide_react","import_jsx_runtime","WalletPicker","wallets","onSelect","loading","error","Card","useComponentRegistry","wrapper","children","_","wallet","cn","e"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js","../../../node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js","../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js","../src/index.ts","../src/components/ConnectButtonAdapter.tsx","../src/contexts/WalletConnectContext.tsx","../src/hooks/useEIP6963.ts","../src/hooks/useIsMobile.ts","../src/components/ChainSelector.tsx","../src/lib/cn.ts","../src/assets/chains/index.ts","../src/contexts/ComponentRegistry.tsx","../src/components/AccountButton.tsx","../src/components/QRCodeModal.tsx","../src/lib/ui-defaults.tsx","../src/components/SignInButton.tsx","../src/components/SeedPhraseBackup.tsx","../src/components/ErrorBoundary.tsx","../src/components/Web3ConnectUI.tsx","../src/contexts/ThemeContext.tsx","../src/lib/css-variables.ts","../src/components/AccountSelector.tsx","../src/components/WalletSecurityPanel.tsx","../src/components/PassphraseDialog.tsx","../src/components/PasskeySetup.tsx","../src/components/AppKit.tsx","../src/components/RouteSelector.tsx","../src/components/SmartWalletToggle.tsx","../src/components/SmartWalletSettings.tsx","../src/components/AddressWarningDialog.tsx","../src/components/WalletPicker.tsx"],"sourcesContent":["// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","export { ConnectButton } from \"./components/ConnectButton\";\nexport type { ConnectButtonProps } from \"./components/ConnectButton\";\n\nexport { ChainSelector } from \"./components/ChainSelector\";\nexport type { ChainSelectorProps } from \"./components/ChainSelector\";\n\nexport { AccountButton } from \"./components/AccountButton\";\nexport type { AccountButtonProps } from \"./components/AccountButton\";\n\nexport { AccountSelector, AccountSelectorView } from \"./components/AccountSelector\";\nexport type {\n AccountSelectorProps,\n AccountSelectorViewProps,\n} from \"./components/AccountSelector\";\n\nexport {\n WalletSecurityPanel,\n WalletSecurityPanelView,\n} from \"./components/WalletSecurityPanel\";\nexport type {\n WalletSecurityPanelProps,\n WalletSecurityPanelViewProps,\n} from \"./components/WalletSecurityPanel\";\n\nexport {\n PassphraseDialog,\n PassphraseDialogView,\n} from \"./components/PassphraseDialog\";\nexport type {\n PassphraseDialogProps,\n PassphraseDialogViewProps,\n} from \"./components/PassphraseDialog\";\n\nexport { PasskeySetup, PasskeySetupView } from \"./components/PasskeySetup\";\nexport type {\n PasskeySetupProps,\n PasskeySetupViewProps,\n UnlockSnapshot,\n} from \"./components/PasskeySetup\";\n\nexport { useIsMobile } from \"./hooks/useIsMobile\";\nexport { useEIP6963 } from \"./hooks/useEIP6963\";\nexport type { DiscoveredWallet, UseEIP6963Result } from \"./hooks/useEIP6963\";\n\nexport { cn } from \"./lib/cn\";\n\nexport {\n Web3ComponentProvider,\n useComponentRegistry,\n useComponent,\n} from \"./contexts/ComponentRegistry\";\nexport type {\n ComponentRegistry,\n Web3ComponentProviderProps,\n} from \"./contexts/ComponentRegistry\";\n\nexport {\n ThemeProvider,\n useTheme,\n useThemeVariable,\n} from \"./contexts/ThemeContext\";\nexport type {\n ThemeOverride,\n ThemeProviderProps,\n ThemePriority,\n} from \"./contexts/ThemeContext\";\n\nexport {\n WalletConnectProvider,\n useWalletConnect,\n useWalletConnectOptional,\n} from \"./contexts/WalletConnectContext\";\nexport type {\n WalletConnectState,\n WalletConnectContextValue,\n WalletConnectProviderProps,\n QRStatus,\n} from \"./contexts/WalletConnectContext\";\n\nexport { QRCodeModal } from \"./components/QRCodeModal\";\nexport { ErrorBoundary } from \"./components/ErrorBoundary\";\nexport type { ErrorBoundaryProps } from \"./components/ErrorBoundary\";\nexport type { QRCodeModalProps, QRCodeModalStatus } from \"./components/QRCodeModal\";\n\n// ── SIWx Sign-In Button ──────────────────────────────────────────\nexport { SignInButton } from \"./components/SignInButton\";\nexport type { SignInButtonProps } from \"./components/SignInButton\";\n\nexport { Web3ConnectUI, useDetectionMode } from \"./components/Web3ConnectUI\";\nexport type { Web3ConnectUIProps, DetectionMode } from \"./components/Web3ConnectUI\";\n\n// ── Seed Phrase Backup ────────────────────────────────────────────\nexport { SeedPhraseBackup } from \"./components/SeedPhraseBackup\";\nexport type { SeedPhraseBackupProps } from \"./components/SeedPhraseBackup\";\n\n// ── AppKit ────────────────────────────────────────────────────────\nexport { AppKit, useAppKit, AppKitButton, AppKitChainSelector } from \"./components/AppKit\";\nexport type { AppKitProps, AppKitContextValue, AppKitButtonProps, AppKitChainSelectorProps } from \"./components/AppKit\";\n\n// ── RouteSelector (Phase 5.3 — Cross-Chain Routing UI) ─────────────\nexport { RouteSelector } from \"./components/RouteSelector\";\nexport type { RouteSelectorProps, TokenDisplay } from \"./components/RouteSelector\";\n\n// ── Smart Wallet ───────────────────────────────────────────────────\nexport { SmartWalletToggle } from \"./components/SmartWalletToggle\";\nexport type { SmartWalletToggleProps } from \"./components/SmartWalletToggle\";\n\nexport { SmartWalletSettings } from \"./components/SmartWalletSettings\";\nexport type { SmartWalletSettingsProps, SmartWalletConfig, AccountType, PaymasterType, BundlerPreset } from \"./components/SmartWalletSettings\";\n\nexport { AddressWarningDialog } from \"./components/AddressWarningDialog\";\nexport type { AddressWarningDialogProps } from \"./components/AddressWarningDialog\";\n\nexport { WalletPicker } from \"./components/WalletPicker\";\nexport type { WalletPickerProps } from \"./components/WalletPicker\";\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useRef } from \"react\"\nimport { AppkitConnectButton } from \"@naculus/connect-appkit-react\"\nimport { useWalletConnectOptional } from \"../contexts/WalletConnectContext\"\nimport { useEIP6963 } from \"../hooks/useEIP6963\"\nimport { useIsMobile } from \"../hooks/useIsMobile\"\n\nexport interface ConnectButtonProps {\n className?: string\n isConnected?: boolean\n isConnecting?: boolean\n onConnect?: (walletKind: \"injected\" | \"walletconnect\", closeModal: () => void, walletId?: string) => void | Promise<void>\n onDisconnect?: () => void\n onMobileDeepLink?: () => void\n mobileWalletName?: string\n startPairing?: () => Promise<string>\n completePairing?: () => Promise<any>\n address?: string\n balance?: string | null\n balanceSymbol?: string\n tokenBalances?: Array<{ symbol: string; formatted: string | null; name?: string }>\n isBalanceLoading?: boolean\n explorerUrl?: string\n explorerLabel?: string\n}\n\n/**\n * React adapter that bridges hook ecosystem to the Stencil WC.\n */\nexport function ConnectButtonAdapter({\n className,\n isConnected: extConnected,\n isConnecting: extConnecting,\n onConnect,\n onDisconnect,\n onMobileDeepLink,\n mobileWalletName,\n startPairing,\n completePairing,\n address,\n balance,\n balanceSymbol,\n tokenBalances,\n isBalanceLoading,\n explorerUrl,\n explorerLabel,\n}: ConnectButtonProps) {\n const wcCtx = useWalletConnectOptional()\n const { wallets } = useEIP6963()\n const isMobile = useIsMobile()\n const walletsJson = JSON.stringify(\n wallets.map(({ id, name, icon, rdns }) => ({ id, name, icon, rdns })),\n )\n\n const [qrUri, setQrUri] = useState<string | null>(null)\n const [qrLoading, setQrLoading] = useState(false)\n const [qrError, setQrError] = useState<string | null>(null)\n const pairingRef = useRef({ aborted: false })\n\n const cancelPairing = useCallback(() => {\n pairingRef.current.aborted = true\n wcCtx?.cancelQR()\n setQrLoading(false)\n setQrUri(null)\n setQrError(null)\n }, [wcCtx])\n\n // Sync WC context to WC props\n useEffect(() => {\n if (!wcCtx) return\n const { qrStatus, qrUri: ctxUri, error: ctxErr } = wcCtx.state\n if (qrStatus === \"loading\") { setQrLoading(true); setQrUri(null); setQrError(null) }\n else if (qrStatus === \"ready\" && ctxUri) { setQrLoading(false); setQrUri(ctxUri); setQrError(null) }\n else if (qrStatus === \"error\") { setQrLoading(false); setQrError(ctxErr) }\n else if (qrStatus === \"idle\" || qrStatus === \"cancelled\") { setQrLoading(false); setQrUri(null); setQrError(null) }\n }, [wcCtx?.state?.qrStatus, wcCtx?.state?.qrUri, wcCtx?.state?.error])\n\n const emitConnect = useCallback((kind: string, walletId?: string) => {\n if (kind === \"walletconnect\") {\n if (wcCtx) { wcCtx.connectWalletConnect(); return }\n if (startPairing && completePairing) {\n setQrLoading(true); setQrError(null)\n pairingRef.current.aborted = false\n startPairing().then(uri => {\n if (pairingRef.current.aborted) return\n setQrUri(uri); setQrLoading(false)\n completePairing().then(() => {\n if (!pairingRef.current.aborted) setQrUri(null)\n }).catch(err => {\n if (!pairingRef.current.aborted) setQrError(err instanceof Error ? err.message : \"Connection failed\")\n })\n }).catch(err => {\n if (!pairingRef.current.aborted) { setQrLoading(false); setQrError(err instanceof Error ? err.message : \"Connection failed\") }\n })\n return\n }\n }\n onConnect?.(kind as any, () => {}, walletId)\n }, [wcCtx, startPairing, completePairing, onConnect])\n\n // balanceSymbol falls through as an empty string, never \"ETH\": the\n // component renders no unit rather than the wrong one when the chain's\n // native symbol is unknown.\n return (\n <div className={className}>\n <AppkitConnectButton\n connected={extConnected ?? false}\n connecting={extConnecting ?? false}\n address={address ?? \"\"}\n balance={balance ?? null}\n balanceSymbol={balanceSymbol ?? \"\"}\n isBalanceLoading={isBalanceLoading ?? false}\n tokenBalancesJson={JSON.stringify(tokenBalances ?? [])}\n explorerUrl={explorerUrl ?? \"\"}\n explorerLabel={explorerLabel ?? \"\"}\n walletsJson={walletsJson}\n isMobile={isMobile}\n mobileWalletName={mobileWalletName ?? \"\"}\n qrUri={qrUri}\n qrLoading={qrLoading}\n qrError={qrError}\n onAppkitConnect={(e: CustomEvent<{ kind: string; walletId?: string }>) => {\n emitConnect(e.detail.kind, e.detail.walletId)\n }}\n onAppkitDisconnect={() => onDisconnect?.()}\n onAppkitStartPairing={() => emitConnect(\"walletconnect\")}\n onAppkitRetry={() => { pairingRef.current.aborted = true; setQrError(null); setQrUri(null); emitConnect(\"walletconnect\") }}\n onAppkitCancelPairing={cancelPairing}\n onAppkitMobileDeepLink={() => onMobileDeepLink?.()}\n onAppkitCopyAddress={(e: CustomEvent<string>) => {\n navigator.clipboard?.writeText(e.detail).catch(() => {})\n }}\n />\n </div>\n )\n}\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useWeb3 } from \"@naculus/connect-appkit-react\";\n\nexport type QRStatus = \"idle\" | \"loading\" | \"ready\" | \"error\" | \"cancelled\";\n\nexport interface WalletConnectState {\n qrUri: string | null;\n showQR: boolean;\n qrStatus: QRStatus;\n error: string | null;\n}\n\nexport interface WalletConnectContextValue {\n state: WalletConnectState;\n connectWalletConnect: () => Promise<void>;\n cancelQR: () => void;\n retryQR: () => void;\n}\n\nconst WalletConnectContext = createContext<WalletConnectContextValue | null>(null);\n\nexport interface WalletConnectProviderProps {\n children: React.ReactNode;\n}\n\nexport function WalletConnectProvider({ children }: WalletConnectProviderProps) {\n const web3 = useWeb3();\n \n const [qrUri, setQrUri] = useState<string | null>(null);\n const [showQR, setShowQR] = useState(false);\n const [qrStatus, setQrStatus] = useState<QRStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Identifies the current pairing attempt.\n *\n * startPairing/completePairing cannot be aborted, so cancelling only ever\n * meant \"stop showing the QR\". The awaited completePairing kept running and\n * its success handler then overwrote the cancelled state — a user who\n * pressed cancel and whose wallet approved a moment later ended up\n * connected, with the UI back at idle as if nothing had happened. Bumping\n * the attempt id makes every later write from a superseded attempt a no-op.\n */\n const attemptRef = useRef(0);\n const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (settleTimerRef.current) clearTimeout(settleTimerRef.current);\n },\n [],\n );\n\n const cancelQR = useCallback(() => {\n attemptRef.current += 1;\n // Ignoring later state updates is not enough on its own: the pairing\n // promise keeps running and the wallet can still approve. Tell the\n // connector to abandon it so a session that arrives anyway is torn down\n // rather than leaving the user connected to something they declined.\n web3.cancelPairing?.();\n if (settleTimerRef.current) {\n clearTimeout(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n setQrUri(null);\n setShowQR(false);\n setQrStatus(\"cancelled\");\n setError(null);\n }, [web3]);\n\n const connectRef = useRef<() => Promise<void>>(undefined)\n connectRef.current = async () => {\n if (!web3.startPairing || !web3.completePairing) {\n setError(\"WalletConnect pairing not available\")\n setQrStatus(\"error\")\n return\n }\n const attempt = ++attemptRef.current;\n const isCurrent = () => attemptRef.current === attempt;\n\n setQrStatus(\"loading\")\n setError(null)\n setShowQR(true)\n try {\n const uri = await web3.startPairing()\n if (!isCurrent()) return\n setQrUri(uri)\n setQrStatus(\"ready\")\n try {\n await web3.completePairing()\n if (!isCurrent()) return\n settleTimerRef.current = setTimeout(() => {\n settleTimerRef.current = null;\n if (!isCurrent()) return\n setShowQR(false); setQrUri(null); setQrStatus(\"idle\")\n }, 1000)\n } catch (err) {\n if (!isCurrent()) return\n setQrStatus(\"error\")\n setError(err instanceof Error ? err.message : \"Connection failed\")\n }\n } catch (err) {\n if (!isCurrent()) return\n setQrStatus(\"error\")\n setError(err instanceof Error ? err.message : \"Failed to generate QR code\")\n }\n }\n\n const connectWalletConnect = useCallback(async () => {\n await connectRef.current?.()\n }, [])\n\n const retryQR = useCallback(() => {\n setQrUri(null)\n setError(null)\n setQrStatus(\"loading\")\n connectRef.current?.()\n }, [])\n\n const state = useMemo<WalletConnectState>(\n () => ({\n qrUri,\n showQR,\n qrStatus,\n error,\n }),\n [qrUri, showQR, qrStatus, error]\n );\n\n const value = useMemo<WalletConnectContextValue>(\n () => ({\n state,\n connectWalletConnect,\n cancelQR,\n retryQR,\n }),\n [state, connectWalletConnect, cancelQR, retryQR]\n );\n\n return (\n <WalletConnectContext.Provider value={value}>\n {children}\n </WalletConnectContext.Provider>\n );\n}\n\nexport function useWalletConnect(): WalletConnectContextValue {\n const context = useContext(WalletConnectContext);\n if (!context) {\n throw new Error(\"useWalletConnect must be used within a WalletConnectProvider\");\n }\n return context;\n}\n\nexport function useWalletConnectOptional(): WalletConnectContextValue | null {\n return useContext(WalletConnectContext);\n}\n","\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from \"react\"\n\nexport interface DiscoveredWallet {\n id: string\n name: string\n icon?: string\n rdns: string\n provider?: unknown\n}\n\nexport interface UseEIP6963Result {\n wallets: DiscoveredWallet[]\n isDetecting: boolean\n hasWallets: boolean\n}\n\n/**\n * Hook to discover EIP-6963 wallets (browser extensions like MetaMask, Phantom, etc.)\n * Uses the eip6963:announceProvider / requestProvider protocol.\n */\nexport function useEIP6963(): UseEIP6963Result {\n const [wallets, setWallets] = useState<DiscoveredWallet[]>([])\n const [isDetecting, setIsDetecting] = useState(true)\n const seenRef = useRef(new Set<string>())\n\n useEffect(() => {\n seenRef.current.clear()\n setIsDetecting(true)\n\n const handleAnnounce = (e: Event) => {\n const detail = (e as CustomEvent).detail\n const info = detail?.info\n const provider = detail?.provider\n\n if (!info?.rdns || seenRef.current.has(info.rdns)) return\n seenRef.current.add(info.rdns)\n\n setWallets(prev => {\n if (prev.find(w => w.id === info.rdns)) return prev\n return [...prev, {\n id: info.rdns,\n name: info.name || info.rdns,\n icon: info.icon || \"\",\n rdns: info.rdns,\n provider,\n }]\n })\n }\n\n window.addEventListener(\"eip6963:announceProvider\", handleAnnounce)\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"))\n\n // Give wallets time to announce, then mark done\n const timer = setTimeout(() => setIsDetecting(false), 500)\n\n return () => {\n window.removeEventListener(\"eip6963:announceProvider\", handleAnnounce)\n clearTimeout(timer)\n }\n }, [])\n\n return {\n wallets,\n isDetecting,\n hasWallets: wallets.length > 0,\n }\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * Hook that detects if the user is on a mobile device.\n * Returns true for iOS (iPhone, iPad, iPod) and Android devices.\n */\nexport function useIsMobile(): boolean {\n const [mobile, setMobile] = useState(false);\n\n useEffect(() => {\n if (typeof navigator === \"undefined\" || typeof window === \"undefined\") return;\n const ua = navigator.userAgent.toLowerCase();\n setMobile(/(iphone|ipad|ipod|android|mobile)/i.test(ua));\n }, []);\n\n return mobile;\n}\n","\"use client\"\nimport { logger } from \"@naculus/connect-core\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { useChain, useWallet } from \"@naculus/connect-appkit-react\";\nimport { cn } from \"../lib/cn\";\nimport { getChainLogo } from \"../assets/chains\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\n\nexport interface ChainSelectorProps {\n className?: string;\n showLabel?: boolean;\n variant?: \"dropdown\" | \"buttons\" | \"minimal\";\n}\n\nfunction logSwitchFailure(error: unknown): void {\n const details =\n error && typeof error === \"object\" && \"details\" in error\n ? (error as { details?: unknown }).details\n : undefined\n const causeMessage =\n details instanceof Error ? `${details.name}: ${details.message}` : details\n logger.error(\"ui/ChainSelector\", \"switchChain failed\", error, causeMessage)\n}\n\nfunction ChainLogo({ chainId, className }: { chainId: string; className?: string }) {\n const svgStr = getChainLogo(chainId)\n if (!svgStr) return null\n return (\n <span\n className={cn(\"inline-flex items-center justify-center shrink-0\", className)}\n dangerouslySetInnerHTML={{ __html: svgStr }}\n />\n )\n}\n\nexport function ChainSelector({\n className,\n showLabel = true,\n variant = \"dropdown\"\n}: ChainSelectorProps) {\n const { currentChain, availableChains, switchChain, isEvm } = useChain();\n const { isConnected } = useWallet();\n const [isOpen, setIsOpen] = useState(false);\n const registry = useComponentRegistry();\n const RegistryButton = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n if (!isConnected) {\n return null;\n }\n\n const chainName = currentChain?.name ?? \"Unknown Chain\";\n const hasMultipleChains = availableChains.length > 1;\n\n // Minimal variant: just show chain logo and name\n if (variant === \"minimal\") {\n return (\n <div className={cn(\"inline-flex items-center gap-1.5 text-xs text-muted-foreground\", className)}>\n {currentChain && <ChainLogo chainId={currentChain.caip2} className=\"h-3.5 w-3.5\" />}\n {chainName}\n </div>\n );\n }\n\n // Buttons variant: show all chains as clickable buttons\n if (variant === \"buttons\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {availableChains.map((chain) => {\n const chainId = chain.caip2;\n const isActive = chainId === currentChain?.caip2;\n return (\n <RegistryButton\n key={chainId}\n className={isActive ? cn(\"bg-accent\", \"border-primary\") : \"\"}\n onClick={() => {\n if (!isActive) {\n switchChain(chainId).catch(logSwitchFailure);\n }\n }}\n >\n <ChainLogo chainId={chainId} className=\"h-4 w-4\" />\n {chain.name}\n {chain.token && <span className=\"text-xs opacity-60\">{chain.token}</span>}\n </RegistryButton>\n );\n })}\n </div>\n );\n }\n\n // Dropdown variant (default) — show current chain as read-only if only one chain\n if (!hasMultipleChains) {\n return (\n <div className={cn(\"inline-flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm opacity-60 cursor-default\", className)}>\n {currentChain && <ChainLogo chainId={currentChain.caip2} className=\"h-4 w-4\" />}\n {chainName}\n </div>\n );\n }\n\n return (\n <div ref={dropdownRef} className={cn(\"relative inline-block\", className)}>\n <RegistryButton onClick={() => setIsOpen(!isOpen)}>\n {currentChain && <ChainLogo chainId={currentChain.caip2} className=\"h-4 w-4\" />}\n {chainName}\n <svg\n className={cn(\"h-3 w-3 transition-transform\", isOpen && \"rotate-180\")}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </RegistryButton>\n\n {isOpen && (\n <div className=\"absolute left-0 top-full mt-1 z-50 min-w-[180px] rounded-lg border bg-card p-1 shadow-lg animate-in fade-in zoom-in-95 duration-200\">\n {showLabel && (\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Switch Network\n </div>\n )}\n {availableChains.map((chain) => {\n const chainId = chain.caip2;\n const isActive = chainId === currentChain?.caip2;\n return (\n <RegistryButton\n key={chainId}\n onClick={() => {\n if (!isActive) {\n switchChain(chainId).catch(logSwitchFailure);\n }\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-2 text-sm transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isActive\n ? \"bg-accent font-medium\"\n : \"hover:bg-accent/50\"\n )}\n >\n <ChainLogo chainId={chainId} className=\"h-4 w-4\" />\n <span className=\"flex-1 text-left\">{chain.name}</span>\n {chain.token && (\n <span className=\"text-xs text-muted-foreground\">{chain.token}</span>\n )}\n {isActive && (\n <svg className=\"h-4 w-4 text-primary\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </RegistryButton>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}","/**\n * Chain Logos Registry\n *\n * Inline SVG icons (mini 24×24) for supported chains.\n * Follows the same pattern as wallet-registry.ts for library compatibility\n * (tsup bundles inline SVG strings, but not external asset files).\n *\n * Sources:\n * - https://cryptologos.cc — Ethereum, Polygon, BNB, Arbitrum, Avalanche, Fantom\n * - https://github.com/trustwallet/assets — Optimism\n */\n\n// ── Chain SVG Icons (compact, viewBox-preserved) ──────────────────\n\nexport const ETH_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 0l-.26.97v28.15l.26.26 13.07-7.72L12 0z\" fill=\"#8C8C8C\"/><path d=\"M12 0L-.87 21.69l12.87 7.72V0z\" fill=\"#3C3C3B\"/><path d=\"M12 31.88l-.16.2v10.55l.16.47 13.08-18.42L12 31.88z\" fill=\"#8C8C8C\"/><path d=\"M12 42.9V31.88L-.87 24.68 12 42.9z\" fill=\"#3C3C3B\"/><path d=\"M12 28.41l13.07-7.72L12 14.09v14.32z\" fill=\"#141414\"/><path d=\"M-.87 20.69L12 28.41V14.09l-12.87 6.6z\" fill=\"#393939\"/></svg>`\n\nexport const POLYGON_LOGO = `<svg viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15 12.3l-3.7 2.2-3.8-2.2V7.9L11.3 5.7 15 7.9v2.7l-2.2 1.3-1.5-.9v-2l1.5.9 2.2-1.3V7.9L11.3 4 6 7.9v6.3l5.3 3.1 5.3-3.1-1.6-2.8z\" fill=\"#6C00F6\"/></svg>`\n\nexport const BSC_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#F0B90B\"/><path d=\"M12 4l2.7 1.6L14.7 7 12 5.4 9.3 7l-.7-.4L12 4zm4.7 2.7l-2.7 1.6V10l4 2.3v4.7L16 18.7v-4l-1.3-.7v4L12 20l-2.7-1.6v-4L8 14.7v4l-1.3-.7V12.3l4-2.3V8.3l-2.7-1.6.7-.4L12 8l2.7-1.7.7.4z\" fill=\"white\"/></svg>`\n\nexport const ARBITRUM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 1.5c.3 0 .6.1.8.2l8.8 5.1c.5.3.9.9.9 1.5v10.2c0 .6-.3 1.2-.9 1.5l-8.8 5.1c-.3.2-.6.2-.8.2s-.6-.1-.8-.2l-8.8-5.1c-.5-.3-.9-.9-.9-1.5V8.3c0-.6.3-1.2.9-1.5l8.8-5.1c.3-.2.6-.2.8-.2z\" fill=\"#213147\"/><path d=\"M14.7 13.8l-1.2 3.2c0 .1 0 .2.1.3l2 5.5 2.3-1.3-2.8-7.6c-.1-.2-.3-.2-.4-.1z\" fill=\"#12AAFF\"/><path d=\"M16.3 8.5c0-.2-.3-.2-.4 0l-1.1 3.2c0 .1 0 .2.1.3l3.3 9 2.3-1.3-4.2-9.1v-.1z\" fill=\"#12AAFF\"/><path d=\"M12 3.5c.1 0 .2 0 .3.1l8.8 5.1c.1.1.2.2.2.3v10.2c0 .1-.1.2-.2.3l-8.8 5.1c-.1 0-.2.1-.3.1s-.2 0-.3-.1l-8.8-5.1c-.1-.1-.2-.2-.2-.3V9c0-.1.1-.2.2-.3l8.8-5.1c.1 0 .2-.1.3-.1z\" fill=\"#9DCCED\" fill-opacity=\"0.3\"/><path d=\"M13.3 6.2h-2.2c-.2 0-.3.1-.4.3L5.9 19.6l2.3 1.3L13 6.5c0-.1-.1-.3-.2-.3h.4z\" fill=\"white\"/><path d=\"M15.2 6.2H13c-.2 0-.3.1-.4.3L8.1 21.4l2.3 1.3 6-16.4c0-.1-.1-.3-.2-.3v.2z\" fill=\"white\"/></svg>`\n\nexport const OPTIMISM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#FF0420\"/><path d=\"M8.5 16c-.5 0-.9-.1-1.3-.3-.4-.2-.7-.5-1-.8-.3-.4-.4-.8-.4-1.3V10c0-.5.1-1 .4-1.4.3-.4.6-.7 1-.9.4-.2.8-.3 1.3-.3.4 0 .8.1 1.2.2.3.2.6.4.8.7l-1 1c-.2-.2-.4-.3-.6-.4-.2-.1-.5-.2-.8-.2-.3 0-.6.1-.9.2-.3.2-.5.4-.6.7-.1.3-.2.6-.2 1v3.5c0 .3.1.6.2.9.1.3.3.5.6.6.3.2.6.2.9.2.3 0 .6-.1.8-.2.2-.1.4-.3.6-.5l1 1c-.2.3-.5.5-.8.7-.4.2-.9.3-1.4.3z\" fill=\"white\"/><path d=\"M15.5 16c-.5 0-.9-.1-1.3-.3-.4-.2-.7-.5-1-.8-.2-.4-.4-.8-.4-1.3V10c0-.5.1-1 .4-1.4.2-.4.5-.7.9-.9.4-.2.8-.3 1.3-.3.5 0 1 .1 1.4.3.4.2.7.5.9.9.2.4.3.9.3 1.4v.7h-2.9v-1.1c0-.3-.1-.6-.2-.9-.1-.3-.3-.5-.5-.6-.2-.1-.5-.2-.8-.2-.3 0-.6.1-.8.2-.3.2-.5.4-.6.7-.1.3-.2.6-.2 1v3.5c0 .3.1.6.2.8.1.3.3.5.6.6.2.2.5.2.8.2.3 0 .6-.1.8-.2.2-.1.4-.3.5-.6.1-.3.2-.6.2-1v-1.1h2.9v.7c0 .5-.1 1-.3 1.4-.2.4-.5.7-.9.9-.4.2-.9.3-1.4.3z\" fill=\"white\"/></svg>`\n\nexport const AVALANCHE_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#E84142\"/><path d=\"M8.6 16.8H6.3c-.5 0-.8-.1-1-.3-.2-.2-.3-.5-.3-.8 0-.2 0-.4.1-.6l5.8-10.7c.2-.4.5-.7.8-.8.3-.1.5-.1.7 0 .2.1.5.3.7.8l1.2 2.1.1.2c.3.5.5.9.5 1.3.1.4.1.8 0 1.1-.1.4-.3.8-.6 1.3l-3 5.4c-.2.5-.5.8-.8 1-.4.2-.7.2-1.2.2z\" fill=\"white\"/><path d=\"M14.5 16.8h3.3c.5 0 .7-.1 1-.3.2-.2.3-.5.3-.8 0-.2-.1-.4-.3-.7l-1.7-3-.2-.3c-.2-.4-.4-.7-.6-.8-.2-.1-.4-.1-.6 0-.2.1-.4.3-.6.8l-1.6 3c-.2.4-.4.7-.4.9 0 .2.1.5.3.7.1.1.4.3.9.3z\" fill=\"white\"/></svg>`\n\nexport const FANTOM_LOGO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#1969FF\"/><path d=\"M11.3 3.8c.4-.2 1-.2 1.4 0l4.1 2.2c.2.1.4.3.4.5h0v10.9c0 .2-.1.4-.4.6l-4.1 2.2c-.4.2-1 .2-1.4 0l-4.1-2.2c-.3-.1-.4-.4-.4-.6V6.5c0-.2.1-.4.4-.5l4.1-2.2zm5.3 8.7l-3.9 2c-.4.2-1 .2-1.4 0l-3.9-2v4.8l3.9 2c.2.1.5.2.7.2.2 0 .5-.1.7-.2l3.9-2v-4.8z\" fill=\"white\"/></svg>`\n\n// ── Registry ──────────────────────────────────────────────────────\n\nexport const CHAIN_LOGOS: Record<string, string> = {\n \"eip155:1\": ETH_LOGO, // Ethereum\n \"eip155:137\": POLYGON_LOGO, // Polygon\n \"eip155:56\": BSC_LOGO, // BSC\n \"eip155:42161\": ARBITRUM_LOGO, // Arbitrum\n \"eip155:10\": OPTIMISM_LOGO, // Optimism\n \"eip155:43114\": AVALANCHE_LOGO, // Avalanche\n \"eip155:250\": FANTOM_LOGO, // Fantom\n \"eip155:11155111\": ETH_LOGO, // Sepolia\n}\n\n/**\n * Resolve the chain logo for a given chain ID (e.g. \"eip155:1\").\n * Returns the SVG string, or undefined if unknown.\n */\nexport function getChainLogo(chainId: string): string | undefined {\n return CHAIN_LOGOS[chainId]\n}\n","import React, { createContext, useContext, useMemo } from 'react'\n\n// ── Business components ──────────────────────────────────\nimport { ConnectButton as BizConnectButton } from '../components/ConnectButton'\nimport { AccountButton as BizAccountButton } from '../components/AccountButton'\nimport { ChainSelector as BizChainSelector } from '../components/ChainSelector'\nimport { QRCodeModal as BizQRCodeModal } from '../components/QRCodeModal'\nimport { SignInButton as BizSignInButton } from '../components/SignInButton'\nimport { SeedPhraseBackup as BizSeedPhraseBackup } from '../components/SeedPhraseBackup'\nimport { ErrorBoundary as BizErrorBoundary } from '../components/ErrorBoundary'\nimport { Web3ConnectUI as BizWeb3ConnectUI } from '../components/Web3ConnectUI'\n\nexport interface ComponentRegistry {\n // ── Layer 1: Base UI (from shadcn or WC) ────────────────────────\n Button?: React.ComponentType<any>\n Card?: React.ComponentType<any>\n Badge?: React.ComponentType<any>\n Switch?: React.ComponentType<any>\n Checkbox?: React.ComponentType<any>\n Tabs?: React.ComponentType<any>\n TabsContent?: React.ComponentType<any>\n TabsList?: React.ComponentType<any>\n TabsTrigger?: React.ComponentType<any>\n DropdownMenu?: React.ComponentType<any>\n Avatar?: React.ComponentType<any>\n Skeleton?: React.ComponentType<any>\n Tooltip?: React.ComponentType<any>\n Popover?: React.ComponentType<any>\n Progress?: React.ComponentType<any>\n Separator?: React.ComponentType<any>\n ScrollArea?: React.ComponentType<any>\n Input?: React.ComponentType<any>\n Select?: React.ComponentType<any>\n Label?: React.ComponentType<any>\n Sheet?: React.ComponentType<any>\n Modal?: React.ComponentType<any>\n Dialog?: React.ComponentType<any>\n DialogContent?: React.ComponentType<any>\n DialogHeader?: React.ComponentType<any>\n DialogTitle?: React.ComponentType<any>\n\n // ── Layer 2: Business ──────────────────────────────────────────\n ConnectButton?: React.ComponentType<any>\n AccountButton?: React.ComponentType<any>\n ChainSelector?: React.ComponentType<any>\n QRCodeModal?: React.ComponentType<any>\n SignInButton?: React.ComponentType<any>\n SeedPhraseBackup?: React.ComponentType<any>\n ErrorBoundary?: React.ComponentType<any>\n AppKit?: React.ComponentType<any>\n AppKitButton?: React.ComponentType<any>\n AppKitChainSelector?: React.ComponentType<any>\n Web3ConnectUI?: React.ComponentType<any>\n}\n\n/**\n * Safe base control for the standalone AppKit build. Consumers can still\n * replace it with their design-system button through Web3ComponentProvider.\n */\nfunction DefaultButton({\n className,\n variant,\n size,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }) {\n const classes = [\n \"inline-flex items-center justify-center gap-2 rounded-lg border px-4 py-2\",\n \"text-sm font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n variant === \"outline\" ? \"border-input bg-transparent hover:bg-accent\" : \"border-primary bg-primary text-primary-foreground hover:bg-primary/90\",\n size === \"sm\" ? \"h-9 px-3\" : size === \"icon\" ? \"h-10 w-10 p-0\" : \"h-10\",\n className,\n ].filter(Boolean).join(\" \")\n\n return <button type=\"button\" className={classes} {...props} />\n}\n\nexport const DEFAULT_COMPONENTS: ComponentRegistry = {\n Button: DefaultButton,\n // Business defaults\n ConnectButton: BizConnectButton,\n AccountButton: BizAccountButton,\n ChainSelector: BizChainSelector,\n QRCodeModal: BizQRCodeModal,\n SignInButton: BizSignInButton,\n SeedPhraseBackup: BizSeedPhraseBackup,\n ErrorBoundary: BizErrorBoundary,\n Web3ConnectUI: BizWeb3ConnectUI,\n}\n\nconst ComponentRegistryContext = createContext<ComponentRegistry>({})\n\nexport interface Web3ComponentProviderProps {\n children: React.ReactNode\n components?: ComponentRegistry\n}\n\nexport function Web3ComponentProvider({\n children,\n components = {},\n}: Web3ComponentProviderProps) {\n const value = useMemo(\n () => ({ ...DEFAULT_COMPONENTS, ...components }),\n [components]\n )\n return (\n <ComponentRegistryContext.Provider value={value}>\n {children}\n </ComponentRegistryContext.Provider>\n )\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n return useContext(ComponentRegistryContext)\n}\n\nexport function useComponent<K extends keyof ComponentRegistry>(\n name: K\n): ComponentRegistry[K] | undefined {\n const registry = useComponentRegistry()\n return registry[name]\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Wallet } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\n\nexport interface AccountButtonProps {\n className?: string;\n showAddress?: boolean;\n showBalance?: boolean;\n address?: string;\n balance?: string | null;\n balanceSymbol?: string;\n onConnect?: () => void;\n}\n\nfunction DefaultAvatar({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n {children}\n </div>\n );\n}\n\nexport function AccountButton({\n className,\n showAddress = true,\n showBalance = false,\n address: externalAddress,\n balance: externalBalance,\n balanceSymbol,\n onConnect,\n}: AccountButtonProps) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n\n if (!externalAddress) {\n return (\n <Button\n aria-label=\"Connect Wallet\"\n onClick={onConnect}\n className={className}\n >\n <Wallet size={18} className=\"shrink-0\" />\n Connect Wallet\n </Button>\n );\n }\n\n const address = externalAddress.includes(\":\")\n ? externalAddress.split(\":\").pop()!\n : externalAddress;\n\n const shortAddress = address.slice(0, 6) + \"...\" + address.slice(-4);\n\n // No `?? \"ETH\"`. The caller passes null when the chain's native symbol is\n // unknown, and substituting one here labels MATIC or SOL as ether in the\n // one place a user actually reads it. An amount with no unit is worse to\n // look at and better to trust.\n const formattedBalance = externalBalance !== null && externalBalance !== undefined\n ? parseFloat(externalBalance).toLocaleString(undefined, { maximumFractionDigits: 4 }) +\n (balanceSymbol ? ` ${balanceSymbol}` : \"\")\n : null;\n\n return (\n <Button className={className}>\n <DefaultAvatar>W</DefaultAvatar>\n <div className=\"flex flex-col items-start gap-0\">\n {showAddress && (\n <span className=\"font-mono text-xs\">{shortAddress}</span>\n )}\n {showBalance && formattedBalance && (\n <span className=\"text-xs text-muted-foreground\">{formattedBalance}</span>\n )}\n {showBalance && !formattedBalance && externalBalance === null && (\n <span className=\"text-xs text-muted-foreground\">Loading...</span>\n )}\n </div>\n </Button>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { Smartphone, RefreshCw, CheckCircle2, AlertCircle, Loader2 } from \"lucide-react\";\nimport type QRCodeType from \"qrcode\";\nimport { DefaultDialog } from \"../lib/ui-defaults\";\nimport { cn } from \"../lib/cn\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport { useIsMobile } from \"../hooks/useIsMobile\";\n\nexport type QRCodeModalStatus = \"pending\" | \"scanned\" | \"expired\" | \"error\";\n\nexport interface QRCodeModalProps {\n uri: string | null;\n open: boolean;\n onClose: () => void;\n onDeepLink?: (uri: string) => void;\n onRetry?: () => void;\n status?: QRCodeModalStatus;\n showDeepLink?: boolean;\n timeoutMs?: number;\n title?: string;\n description?: string;\n className?: string;\n}\n\nasync function renderQR(canvas: HTMLCanvasElement, uri: string): Promise<void> {\n // Import the browser entry explicitly: the package's generic entry points\n // target Node's `require`, which is not available in browser-only bundles.\n // Bundlers expose the renderer either on the namespace or under `default`.\n const loaded = (await import(\"qrcode/lib/browser.js\")) as unknown as {\n default?: typeof QRCodeType;\n toCanvas?: typeof QRCodeType.toCanvas;\n };\n const qrcode = loaded.default ?? loaded;\n const toCanvas = qrcode.toCanvas ?? loaded.toCanvas;\n if (typeof toCanvas !== \"function\") {\n throw new Error(\"qrcode.toCanvas is unavailable\");\n }\n return new Promise((resolve, reject) => {\n toCanvas(canvas, uri, { width: 280, margin: 2 }, (err: Error | null | undefined) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\nexport function QRCodeModal({\n uri, open, onClose, onDeepLink, onRetry,\n status = \"pending\",\n showDeepLink: explicitShowDeepLink,\n timeoutMs = 5 * 60 * 1000,\n title = \"Scan with WalletConnect\",\n description = \"Open your wallet app and scan this QR code to connect.\",\n className,\n}: QRCodeModalProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n const [timeElapsed, setTimeElapsed] = useState(0);\n const isMobile = useIsMobile();\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string; children?: React.ReactNode; className?: string }> | undefined;\n const showDeepLink = explicitShowDeepLink ?? isMobile;\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n if (!open || !uri || !canvasRef.current) return;\n setQrError(null);\n renderQR(canvasRef.current, uri).catch((error: unknown) => {\n setQrError(error instanceof Error ? error.message : \"Unable to render QR code\");\n });\n }, [open, uri]);\n\n useEffect(() => {\n if (!open || status !== \"pending\") {\n if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; }\n setTimeElapsed(0);\n return;\n }\n const start = Date.now();\n timerRef.current = setInterval(() => setTimeElapsed(Date.now() - start), 1000);\n return () => { if (timerRef.current) clearInterval(timerRef.current); };\n }, [open, status, timeoutMs]);\n\n const isExpired = timeElapsed >= timeoutMs && status === \"pending\";\n const needsNewCode = isExpired || status === \"expired\" || status === \"error\";\n const remaining = Math.max(0, Math.ceil((timeoutMs - timeElapsed) / 1000));\n const minutes = Math.floor(remaining / 60);\n const seconds = remaining % 60;\n const progress = Math.min(timeElapsed / timeoutMs, 1);\n\n const handleDeepLink = useCallback(() => { if (uri && onDeepLink) onDeepLink(uri); }, [uri, onDeepLink]);\n\n const qrContent = uri && !isExpired && status === \"pending\" ? (\n qrError ? (\n <div className=\"w-[280px] h-[280px] flex flex-col items-center justify-center bg-muted rounded-lg gap-2\">\n <AlertCircle size={24} className=\"text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Failed to render QR code</span>\n </div>\n ) : (\n <canvas\n ref={canvasRef}\n width={280}\n height={280}\n role=\"img\"\n aria-label=\"WalletConnect pairing QR code\"\n className=\"rounded-lg border border-border\"\n />\n )\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-3 bg-muted rounded-lg w-[280px] h-[280px]\">\n {status === \"scanned\" ? (\n <CheckCircle2 size={48} className=\"text-[hsl(var(--primary))]\" />\n ) : (\n <AlertCircle size={48} className=\"text-destructive\" />\n )}\n <span className=\"text-sm text-muted-foreground\" data-testid=\"status-label\">\n {status === \"scanned\" ? \"QR code scanned! Connecting...\" :\n isExpired || status === \"expired\" ? \"Connection timed out.\" :\n \"Something went wrong. Try again.\"}\n </span>\n </div>\n );\n\n const ModalComp = registry.Modal as React.ComponentType<React.PropsWithChildren<{ open: boolean; onClose?: () => void; closable?: boolean; title?: string; className?: string; children: React.ReactNode }>> | undefined;\n const ModalToUse = ModalComp ?? DefaultDialog;\n\n return (\n <ModalToUse open={open} onClose={onClose} closable title={title} className={className}>\n <div className=\"p-6\">\n <div className=\"text-center mb-5\">\n <div className=\"flex justify-center mb-3\">\n {status === \"pending\" && !isExpired && (\n <Loader2 size={20} className=\"animate-spin text-primary\" data-testid=\"loader-icon-inline\" />\n )}\n </div>\n <h3 className=\"text-lg font-semibold m-0 text-foreground\">{title}</h3>\n {description && (\n <p className=\"text-sm text-muted-foreground mt-1.5 mb-0\">{description}</p>\n )}\n </div>\n\n <div className=\"flex justify-center mb-4\">{qrContent}</div>\n\n {status === \"pending\" && !isExpired && (\n <div className=\"mb-3\">\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\" role=\"progressbar\"\n aria-valuenow={Math.round((1 - progress) * 100)}\n aria-valuemin={0} aria-valuemax={100}>\n <div\n className=\"h-full bg-primary rounded-full transition-all duration-1000\"\n style={{ width: `${(1 - progress) * 100}%` }}\n />\n </div>\n <p data-testid=\"countdown\" className=\"text-xs text-muted-foreground text-center mt-1.5 mb-0\">\n Expires in {minutes}:{seconds.toString().padStart(2, \"0\")}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2\">\n {showDeepLink && uri && status === \"pending\" && !isExpired && (\n <button\n onClick={handleDeepLink}\n className=\"inline-flex items-center justify-center gap-2 w-full rounded-lg border border-input bg-card px-4 py-2.5 text-sm font-medium text-foreground hover:bg-accent hover:text-accent-foreground transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <Smartphone size={16} /> Open in Wallet App\n </button>\n )}\n {needsNewCode && onRetry && (\n Button ? (\n <Button\n onClick={onRetry}\n variant=\"default\"\n size=\"default\"\n className=\"w-full\"\n >\n <RefreshCw size={16} /> Generate New QR Code\n </Button>\n ) : (\n <button\n onClick={onRetry}\n className=\"inline-flex items-center justify-center gap-2 w-full rounded-lg bg-primary text-primary-foreground px-4 py-2.5 text-sm font-medium hover:bg-primary/90 transition-all duration-200 cursor-pointer border-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <RefreshCw size={16} /> Generate New QR Code\n </button>\n )\n )}\n {Button ? (\n <Button\n onClick={onClose}\n variant=\"outline\"\n size=\"default\"\n className=\"w-full\"\n >\n Cancel\n </Button>\n ) : (\n <button\n onClick={onClose}\n className=\"inline-flex items-center justify-center w-full rounded-lg border border-input bg-transparent px-4 py-2.5 text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n </ModalToUse>\n );\n}\n","\"use client\"\n\nimport React, { useEffect } from \"react\"\nimport { cn } from \"./cn\"\nimport { X } from \"lucide-react\"\n\n/** Inline fallback Button — pure CSS, no Radix/shadcn dependency. */\nexport function DefaultButton({\n children,\n className = \"\",\n onClick,\n disabled = false,\n variant = \"default\",\n size = \"default\",\n ...rest\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: \"default\" | \"outline\" | \"ghost\" | \"destructive\"\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\"\n children: React.ReactNode\n}) {\n const variantClasses: Record<string, string> = {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\n outline: \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm\",\n }\n const sizeClasses: Record<string, string> = {\n default: \"h-10 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-10 w-10\",\n }\n return (\n <button\n type=\"button\"\n {...rest}\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg\",\n \"text-sm font-medium transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"font-inherit no-underline box-border border-0 m-0\",\n variantClasses[variant],\n sizeClasses[size],\n className\n )}\n >\n {children}\n </button>\n )\n}\n\n/** Inline fallback Dialog — pure CSS, no Radix/shadcn dependency. */\nexport function DefaultDialog({\n open,\n onClose,\n children,\n closable,\n className,\n}: {\n open: boolean\n onClose?: () => void\n children: React.ReactNode\n closable?: boolean\n className?: string\n}) {\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = \"hidden\"\n return () => { document.body.style.overflow = prev }\n }, [open])\n\n useEffect(() => {\n if (!open || !onClose) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose()\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [open, onClose])\n\n if (!open) return null\n return (\n <div\n className={cn(\"fixed inset-0 z-50 flex items-center justify-center p-4\", className)}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n }}\n >\n <div\n className=\"absolute inset-0 bg-black/80\"\n aria-hidden=\"true\"\n onClick={onClose}\n style={{ position: \"absolute\", inset: 0, background: \"rgb(0 0 0 / 0.8)\" }}\n />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className=\"relative z-10 w-full max-w-sm rounded-xl border bg-card text-card-foreground shadow-2xl max-h-[85vh] overflow-y-auto p-6\"\n style={{\n position: \"relative\",\n zIndex: 10,\n width: \"100%\",\n maxWidth: \"24rem\",\n maxHeight: \"85vh\",\n overflowY: \"auto\",\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n background: \"hsl(var(--card, 0 0% 100%))\",\n color: \"hsl(var(--card-foreground, 222.2 84% 4.9%))\",\n boxShadow: \"0 25px 50px -12px rgb(0 0 0 / 0.4)\",\n }}\n >\n {closable && onClose && (\n <button\n onClick={onClose}\n type=\"button\"\n aria-label=\"Close modal\"\n className=\"absolute right-4 top-4 z-20 rounded-md p-1 text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: \"1rem\",\n top: \"1rem\",\n zIndex: 20,\n border: 0,\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"inherit\",\n }}\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M18 6 6 18M6 6l12 12\" data-testid=\"x-icon\" /></svg>\n </button>\n )}\n {children}\n </div>\n </div>\n )\n}\n\nexport function DefaultDialogHeader({\n title,\n onClose,\n showCloseButton = true,\n}: {\n title: string\n onClose?: () => void\n showCloseButton?: boolean\n}) {\n return (\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">{title}</h2>\n {showCloseButton && onClose && (\n <button\n onClick={onClose}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-all duration-200\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n )\n}\n\nexport function DefaultDialogContent({\n children,\n className = \"\",\n}: {\n children: React.ReactNode\n className?: string\n}) {\n return <div className={cn(\"flex flex-col gap-4\", className)}>{children}</div>\n}\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { LogIn, Loader2, CheckCircle2, AlertCircle, X, Copy, Check } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { DefaultDialog } from \"../lib/ui-defaults\"\nimport type { SiwxResult } from \"@naculus/siwx\"\n\nexport interface SignInButtonProps {\n className?: string\n isSignedIn?: boolean\n isSigningIn?: boolean\n result?: SiwxResult | null\n error?: Error | null\n onSignIn?: () => void\n onClearError?: () => void\n children?: React.ReactNode\n}\n\nexport function SignInButton({\n className,\n isSignedIn = false,\n isSigningIn = false,\n result = null,\n error = null,\n onSignIn,\n onClearError,\n children,\n}: SignInButtonProps) {\n const [showDetails, setShowDetails] = useState(false)\n const [copiedSign, setCopiedSign] = useState(false)\n const [copyFailed, setCopyFailed] = useState(false)\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined\n\n const handleCopySignature = async () => {\n if (result?.signature) {\n try {\n await navigator.clipboard.writeText(result.signature)\n setCopyFailed(false)\n setCopiedSign(true)\n setTimeout(() => setCopiedSign(false), 2000)\n } catch {\n // A refused clipboard write with no feedback reads as a dead button.\n setCopiedSign(false)\n setCopyFailed(true)\n }\n }\n }\n\n // Idle state\n if (!isSignedIn && !isSigningIn && !error) {\n return (\n <Button onClick={onSignIn} className={className} aria-label=\"Sign In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <LogIn size={16} />\n {children ?? \"Sign In\"}\n </span>\n </Button>\n )\n }\n\n // Signing-in state\n if (isSigningIn) {\n return (\n <Button disabled className={className} aria-label=\"Signing In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Loader2 size={16} className=\"animate-spin\" />\n Signing In...\n </span>\n </Button>\n )\n }\n\n // Error state\n if (error && !isSignedIn) {\n return (\n <div style={{ position: \"relative\", display: \"inline-flex\", flexDirection: \"column\" }}>\n <Button onClick={onSignIn} className={className} aria-label=\"Retry Sign In\">\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <AlertCircle size={16} style={{ color: \"var(--destructive, #ef4444)\" }} />\n {children ?? \"Retry Sign In\"}\n </span>\n </Button>\n <div style={{\n fontSize: \"0.75rem\", color: \"var(--destructive, #ef4444)\",\n padding: \"0.25rem 0.5rem\", borderRadius: \"0.375rem\",\n background: \"var(--destructive-foreground, #fef2f2)\",\n marginTop: \"2px\",\n wordBreak: \"break-word\",\n maxWidth: \"100%\",\n lineHeight: 1.4,\n }}>\n {error.message}\n </div>\n </div>\n )\n }\n\n // Signed-in state\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <Button\n onClick={() => setShowDetails((prev) => !prev)}\n className={className}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <CheckCircle2 size={16} style={{ color: \"#22c55e\" }} />\n <span style={{ fontSize: \"0.875rem\", fontWeight: 500 }}>Signed In</span>\n </span>\n </Button>\n\n {showDetails && (Dialog && DialogContent ? (\n <Dialog open={true} onOpenChange={(open: boolean) => { if (!open) setShowDetails(false); }}>\n <DialogContent>\n {DialogHeader && DialogTitle\n ? <><DialogHeader><DialogTitle>Sign-In Details</DialogTitle></DialogHeader><SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} copyFailed={copyFailed} onCopy={handleCopySignature} /></>\n : <><div style={{ fontWeight: 600, fontSize: \"1.125rem\", marginBottom: \"0.75rem\" }}>Sign-In Details</div><SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} copyFailed={copyFailed} onCopy={handleCopySignature} /></>\n }\n </DialogContent>\n </Dialog>\n ) : (\n showDetails && (\n <div style={{\n position: \"absolute\", top: \"calc(100% + 8px)\", right: 0, zIndex: 100,\n width: \"340px\", maxWidth: \"90vw\",\n background: \"var(--card, #fff)\", border: \"1px solid var(--border, #e2e8f0)\",\n borderRadius: \"0.75rem\", boxShadow: \"0 10px 25px rgba(0,0,0,0.1)\",\n padding: \"1rem\",\n }}>\n <SignInDetails result={result} onClose={() => setShowDetails(false)} copiedSign={copiedSign} copyFailed={copyFailed} onCopy={handleCopySignature} />\n </div>\n )\n ))}\n </div>\n )\n}\n\nfunction SignInDetails({\n result,\n onClose,\n copiedSign,\n onCopy,\n copyFailed,\n}: {\n result: SiwxResult | null\n onClose: () => void\n copiedSign: boolean\n onCopy: () => void\n copyFailed?: boolean\n}) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n if (!result) {\n return (\n <div style={{ textAlign: \"center\", padding: \"1rem 0\" }}>\n <CheckCircle2 size={32} style={{ color: \"#22c55e\", margin: \"0 auto 0.75rem\" }} />\n <p style={{ fontSize: \"0.875rem\", color: \"var(--muted-foreground, #64748b)\" }}>\n Authenticated successfully\n </p>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>Close</Button>\n </div>\n )\n }\n\n const { message: msg, signature } = result\n const shortSig = signature.length > 20\n ? signature.slice(0, 14) + \"...\" + signature.slice(-6)\n : signature\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <CheckCircle2 size={18} color=\"#22c55e\" />\n <span style={{ fontWeight: 600, fontSize: \"0.9375rem\" }}>Signed In</span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}><X size={16} /></Button>\n </div>\n\n {/* Domain and address */}\n <div style={{ display: \"grid\", gap: \"0.375rem\" }}>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Domain</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\" }}>{msg.domain}</p>\n </div>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Address</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\", wordBreak: \"break-all\" }}>{msg.address}</p>\n </div>\n <div>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Chain</span>\n <p style={{ fontSize: \"0.8125rem\", fontFamily: \"monospace\", marginTop: \"0.125rem\" }}>{msg.chainId}</p>\n </div>\n </div>\n\n {/* Statement */}\n {msg.statement && (\n <div style={{ padding: \"0.5rem 0.625rem\", borderRadius: \"0.375rem\",\n background: \"var(--muted, #f1f5f9)\", fontSize: \"0.8125rem\", lineHeight: 1.5 }}>\n {msg.statement}\n </div>\n )}\n\n {/* Signature */}\n <div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: \"0.25rem\" }}>\n <span className=\"text-xs uppercase tracking-wider text-muted-foreground\">Signature</span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onCopy}\n title={\n copyFailed\n ? \"This browser refused the clipboard — select the signature and copy it\"\n : \"Copy signature\"\n }\n aria-label={copyFailed ? \"Copy failed\" : \"Copy signature\"}\n >\n {copiedSign ? <Check size={12} color=\"#22c55e\" /> : <Copy size={12} />}\n </Button>\n </div>\n <p style={{ fontSize: \"0.75rem\", fontFamily: \"monospace\", wordBreak: \"break-all\", lineHeight: 1.4,\n color: \"var(--muted-foreground, #64748b)\", background: \"var(--muted, #f1f5f9)\", padding: \"0.375rem 0.5rem\",\n borderRadius: \"0.375rem\" }}>\n {shortSig}\n </p>\n </div>\n\n <Button variant=\"outline\" className=\"w-full\" onClick={onClose}>Close</Button>\n </div>\n )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useState, useCallback, useMemo } from \"react\"\nimport { AlertTriangle, Check, Copy, Download, Eye, EyeOff, SkipForward, ArrowLeft, ArrowRight, Shield, X } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { DefaultDialog } from \"../lib/ui-defaults\"\nimport { cn } from \"../lib/cn\"\n\nexport interface SeedPhraseBackupProps {\n seedPhrase: string\n onConfirm: () => void\n onSkip?: () => void\n onExportPrivateKey?: () => string | null\n className?: string\n wordCount?: 12 | 24\n /** When true, render inline instead of in a dialog */\n inline?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\ntype BackupStep = \"reveal\" | \"confirm\" | \"done\"\n\ninterface ConfirmWord {\n index: number\n correct: string\n options: string[]\n}\n\n/**\n * Unbiased index in [0, max) from the platform CSPRNG.\n *\n * Rejection sampling rather than `% max`, which skews toward low indices when\n * max does not divide the range evenly.\n */\nfunction randomIndex(max: number): number {\n const limit = Math.floor(0x100000000 / max) * max\n const buf = new Uint32Array(1)\n let value: number\n do {\n crypto.getRandomValues(buf)\n value = buf[0]\n } while (value >= limit)\n return value % max\n}\n\n/**\n * Fisher-Yates over the platform CSPRNG.\n *\n * `Math.random` is seeded predictably and is not a security primitive. It does\n * not leak the phrase — the user already has it — but this file decides which\n * words a backup is verified against, and every other random draw in this\n * codebase (passkey challenges, SIWS nonces, storage IVs) already uses\n * `crypto.getRandomValues`. There is no reason for the seed-phrase path to be\n * the one exception.\n */\nfunction shuffleArray<T>(arr: T[]): T[] {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = randomIndex(i + 1);\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n}\n\nfunction buildConfirmWords(phrase: string, count: number = 3): ConfirmWord[] {\n const words = phrase.trim().split(/\\s+/)\n const indices = shuffleArray(words.map((_, i) => i)).slice(0, Math.min(count, words.length))\n\n return indices.map((idx) => {\n const correct = words[idx]\n const others = words.filter((_, i) => i !== idx)\n const distractors = shuffleArray(others).slice(0, 3)\n const options = shuffleArray([correct, ...distractors])\n return { index: idx, correct, options }\n })\n}\n\nexport function SeedPhraseBackup({\n seedPhrase,\n onConfirm,\n onSkip,\n onExportPrivateKey,\n className,\n wordCount,\n inline = false,\n open = true,\n onOpenChange,\n}: SeedPhraseBackupProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined\n\n const [step, setStep] = useState<BackupStep>(\"reveal\")\n const [revealed, setRevealed] = useState(false)\n const [copied, setCopied] = useState(false)\n const [copyFailed, setCopyFailed] = useState(false)\n const [confirmWords, setConfirmWords] = useState<ConfirmWord[]>(() => buildConfirmWords(seedPhrase, 3))\n const [selectedWords, setSelectedWords] = useState<Record<number, string>>({})\n const [confirmErrors, setConfirmErrors] = useState<number[]>([])\n const [showExportKey, setShowExportKey] = useState(false)\n const [exportedKey, setExportedKey] = useState<string | null>(null)\n\n const words = useMemo(() => seedPhrase.trim().split(/\\s+/), [seedPhrase])\n const wordItems = useMemo(() => {\n const occurrences = new Map<string, number>()\n return words.map((word) => {\n const occurrence = occurrences.get(word) ?? 0\n occurrences.set(word, occurrence + 1)\n return { word, key: `${word}-${occurrence}` }\n })\n }, [words])\n const detectedWordCount = wordCount ?? (words.length === 24 ? 24 : 12)\n\n const handleReveal = useCallback(() => setRevealed(true), [])\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(seedPhrase)\n setCopyFailed(false)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Saying nothing here is the dangerous option. A clipboard write can be\n // refused — an insecure context, a denied permission, Safari outside a\n // user gesture — and a user who sees no change reasonably assumes the\n // phrase reached their password manager. They would then be relying on\n // a backup that does not exist.\n setCopied(false)\n setCopyFailed(true)\n }\n }, [seedPhrase])\n\n const handleStartConfirm = useCallback(() => {\n setConfirmWords(buildConfirmWords(seedPhrase, 3))\n setSelectedWords({})\n setConfirmErrors([])\n setStep(\"confirm\")\n }, [seedPhrase])\n\n const handleSelectWord = useCallback((wordIndex: number, word: string) => {\n setSelectedWords((prev) => ({ ...prev, [wordIndex]: word }))\n setConfirmErrors((prev) => prev.filter((i) => i !== wordIndex))\n }, [])\n\n const handleVerify = useCallback(() => {\n const errors: number[] = []\n for (const cw of confirmWords) {\n if (selectedWords[cw.index] !== cw.correct) {\n errors.push(cw.index)\n }\n }\n if (errors.length > 0) {\n setConfirmErrors(errors)\n return\n }\n setStep(\"done\")\n onConfirm()\n }, [confirmWords, selectedWords, onConfirm])\n\n const handleSkip = useCallback(() => {\n onSkip?.()\n }, [onSkip])\n\n const handleExportKey = useCallback(() => {\n if (onExportPrivateKey) {\n const key = onExportPrivateKey()\n setExportedKey(key)\n setShowExportKey(true)\n }\n }, [onExportPrivateKey])\n\n const allConfirmedSelected = confirmWords.every((cw) => selectedWords[cw.index] !== undefined)\n\n const revealContent = (\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border border-amber-200 bg-amber-50 dark:border-amber-800 dark:bg-amber-950/30 px-4 py-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle size={16} className=\"mt-0.5 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-sm text-amber-800 dark:text-amber-200\">\n Write down these words in order and store them somewhere safe. Never share them with anyone.\n If you lose your seed phrase, your funds cannot be recovered.\n </p>\n </div>\n </div>\n\n {!revealed ? (\n <div className=\"flex flex-col items-center gap-3 py-6\">\n <Shield size={40} className=\"text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground text-center\">\n Click the button below to reveal your seed phrase. Make sure no one is watching your screen.\n </p>\n <Button onClick={handleReveal} variant=\"default\">\n <Eye size={16} />\n Reveal Seed Phrase\n </Button>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {wordItems.map(({ word, key }, i) => (\n <div\n key={key}\n className=\"flex items-center gap-1.5 rounded-md border bg-card px-2.5 py-1.5 text-sm\"\n >\n <span className=\"text-xs text-muted-foreground w-5 shrink-0 text-right\">\n {i + 1}\n </span>\n <span className=\"font-mono font-medium\">{word}</span>\n </div>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button onClick={handleCopy} variant=\"outline\" size=\"sm\">\n {copied ? <Check size={14} /> : <Copy size={14} />}\n {copied ? \"Copied\" : copyFailed ? \"Copy failed\" : \"Copy\"}\n </Button>\n {onExportPrivateKey && (\n <Button onClick={handleExportKey} variant=\"outline\" size=\"sm\">\n <Download size={14} />\n Export Private Key\n </Button>\n )}\n </div>\n\n {copyFailed && (\n <p\n role=\"alert\"\n className=\"rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n This browser would not let the page write to your clipboard.\n Nothing was copied — select the words above and copy them\n yourself, or write them down.\n </p>\n )}\n\n {showExportKey && exportedKey && (\n <div className=\"rounded-lg border border-border bg-muted p-3 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <EyeOff size={14} className=\"text-muted-foreground\" />\n <span className=\"text-xs font-medium text-muted-foreground\">\n Private Key (keep secret!)\n </span>\n </div>\n <p className=\"font-mono text-xs break-all select-all\">{exportedKey}</p>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:justify-between\">\n <Button onClick={handleStartConfirm} variant=\"default\">\n I've Saved It\n <ArrowRight size={16} />\n </Button>\n {onSkip && (\n <Button onClick={handleSkip} variant=\"ghost\" size=\"sm\">\n <SkipForward size={14} />\n Skip Backup\n </Button>\n )}\n </div>\n </>\n )}\n </div>\n )\n\n const confirmContent = (\n <div className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n Verify your backup by selecting the correct word for each position.\n </p>\n\n {confirmWords.map((cw) => {\n const hasError = confirmErrors.includes(cw.index)\n return (\n <div key={cw.index} className=\"space-y-2\">\n <p className={cn(\n \"text-sm font-medium\",\n hasError ? \"text-destructive\" : \"text-foreground\"\n )}>\n Word #{cw.index + 1}\n {hasError && <span className=\"ml-2 text-xs text-destructive\">(incorrect)</span>}\n </p>\n <div className=\"grid grid-cols-2 gap-2\">\n {cw.options.map((opt) => {\n const isSelected = selectedWords[cw.index] === opt\n return (\n <button\n type=\"button\"\n // A mnemonic may legitimately repeat a word (for example,\n // \"abandon\"). Include the prompt index so React keys stay\n // unique without changing the displayed choices.\n key={`${cw.index}-${opt}`}\n onClick={() => handleSelectWord(cw.index, opt)}\n className={cn(\n \"rounded-md border px-3 py-2 text-sm font-mono transition-all duration-200 cursor-pointer text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isSelected\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : hasError\n ? \"border-destructive/50 bg-destructive/5\"\n : \"border-border bg-card hover:border-primary/50\"\n )}\n >\n {opt}\n </button>\n )\n })}\n </div>\n </div>\n )\n })}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:justify-between\">\n <Button\n onClick={handleVerify}\n variant=\"default\"\n disabled={!allConfirmedSelected}\n >\n <Check size={16} />\n Verify & Confirm\n </Button>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setStep(\"reveal\")}\n variant=\"ghost\"\n size=\"sm\"\n >\n <ArrowLeft size={14} />\n Back\n </Button>\n {onSkip && (\n <Button onClick={handleSkip} variant=\"ghost\" size=\"sm\">\n <SkipForward size={14} />\n Skip\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n\n const doneContent = (\n <div className=\"flex flex-col items-center gap-3 py-6 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30\">\n <Check size={24} className=\"text-green-600 dark:text-green-400\" />\n </div>\n <p className=\"font-medium text-foreground\">Backup Confirmed</p>\n <p className=\"text-sm text-muted-foreground\">\n Your seed phrase has been backed up successfully.\n </p>\n </div>\n )\n\n const steps: Record<BackupStep, React.ReactNode> = {\n reveal: revealContent,\n confirm: confirmContent,\n done: doneContent,\n }\n\n const titles: Record<BackupStep, string> = {\n reveal: \"Backup Seed Phrase\",\n confirm: \"Verify Backup\",\n done: \"Backup Complete\",\n }\n\n const body = steps[step]\n const title = titles[step]\n\n if (inline) {\n return (\n <div className={cn(\"space-y-4\", className)}>\n {step !== \"done\" && (\n <h3 className=\"text-lg font-semibold\">{title}</h3>\n )}\n {body}\n </div>\n )\n }\n\n if (!open) return null\n\n if (Dialog && DialogContent) {\n return (\n <Dialog open={true} onOpenChange={(o: boolean) => { if (!o) onOpenChange?.(false); }}>\n <DialogContent>\n {DialogHeader && DialogTitle ? (\n <><DialogHeader><DialogTitle>{title}</DialogTitle></DialogHeader><div className=\"mt-2 max-h-[55vh] overflow-y-auto\">{body}</div></>\n ) : (\n <><div className=\"mb-3 text-lg font-semibold\">{title}</div><div className=\"max-h-[55vh] overflow-y-auto\">{body}</div></>\n )}\n </DialogContent>\n </Dialog>\n )\n }\n\n return (\n <DefaultDialog open={true} onClose={() => onOpenChange?.(false)}>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">{title}</h2>\n {onOpenChange && (\n <button\n onClick={() => onOpenChange(false)}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-all duration-200 cursor-pointer border-none bg-transparent\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n {body}\n </DefaultDialog>\n )\n}\n","\"use client\"\n\nimport React from \"react\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport { DefaultDialog, DefaultDialogHeader, DefaultDialogContent } from \"../lib/ui-defaults\";\n\n// ── Types ─────────────────────────────────────────────────────────\n\nexport interface ErrorBoundaryProps {\n children: React.ReactNode;\n /** Optional custom fallback UI. Receives error and reset callback. */\n fallback?: (props: { error: Error; reset: () => void }) => React.ReactNode;\n /** Called when an error is caught. Useful for logging. */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n /** Called after the boundary resets. */\n onReset?: () => void;\n /** Called when the user dismisses the error dialog. */\n onDismiss?: () => void;\n /** Label for the retry button. Default: \"Try Again\" */\n retryLabel?: string;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n dismissed: boolean;\n}\n\n// ── Default Fallback UI ───────────────────────────────────────────\n\nfunction DefaultErrorFallback({\n error,\n reset,\n dismiss,\n retryLabel = \"Try Again\",\n}: {\n error: Error;\n reset: () => void;\n dismiss?: () => void;\n retryLabel?: string;\n}) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>;\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }> | undefined;\n const DialogContent = registry.DialogContent as React.ComponentType<{ children: React.ReactNode }> | undefined;\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ children: React.ReactNode }> | undefined;\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ children: React.ReactNode }> | undefined;\n\n if (Dialog && DialogContent) {\n return (\n <Dialog open={true} onOpenChange={() => {}}>\n <DialogContent>\n {DialogHeader && DialogTitle ? (\n <>\n <DialogHeader><DialogTitle>Something went wrong</DialogTitle></DialogHeader>\n <div style={{ marginTop: \"0.5rem\" }}>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </div>\n </>\n ) : (\n <>\n <div style={{ fontWeight: 600, fontSize: \"1.125rem\", marginBottom: \"0.75rem\" }}>\n Something went wrong\n </div>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n }\n\n // Fallback: use DefaultDialog\n const isOpen = true;\n const onClose = dismiss ?? undefined;\n\n return (\n <DefaultDialog open={isOpen} onClose={onClose}>\n <DefaultDialogHeader title=\"Something went wrong\" onClose={onClose} showCloseButton={!!dismiss} />\n <DefaultDialogContent>\n <p\n style={{\n color: \"var(--muted-foreground, #666)\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n margin: 0,\n }}\n >\n {error.message || \"An unexpected error occurred while connecting your wallet.\"}\n </p>\n <div style={{ display: \"flex\", gap: \"0.5rem\", marginTop: \"0.5rem\" }}>\n {dismiss && (\n <Button\n variant=\"outline\"\n size=\"default\"\n onClick={dismiss}\n >\n Dismiss\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"default\"\n onClick={reset}\n >\n {retryLabel}\n </Button>\n </div>\n </DefaultDialogContent>\n </DefaultDialog>\n );\n}\n\n// ── Error Boundary Component ──────────────────────────────────────\n\nexport class ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, dismissed: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error, dismissed: false };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = (): void => {\n this.setState({ hasError: false, error: null, dismissed: false });\n this.props.onReset?.();\n };\n\n handleDismiss = (): void => {\n this.setState((prev) => ({ ...prev, dismissed: true }));\n this.props.onDismiss?.();\n };\n\n render(): React.ReactNode {\n if (this.state.dismissed) {\n return this.props.children;\n }\n\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback({\n error: this.state.error,\n reset: this.handleReset,\n });\n }\n\n return (\n <DefaultErrorFallback\n error={this.state.error}\n reset={this.handleReset}\n dismiss={this.props.onDismiss ? this.handleDismiss : undefined}\n retryLabel={this.props.retryLabel}\n />\n );\n }\n\n return this.props.children;\n }\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Web3ConnectProvider } from '@naculus/connect-appkit-react'\nimport type { Web3ConnectConfig } from '@naculus/connect-appkit-react'\nimport { Web3ComponentProvider } from '../contexts/ComponentRegistry'\nimport { WalletConnectProvider } from '../contexts/WalletConnectContext'\nimport { ThemeProvider, type ThemeOverride, type ThemePriority } from '../contexts/ThemeContext'\nimport { QRCodeModal } from './QRCodeModal'\n\nexport type DetectionMode = \"auto\" | \"walletconnect\" | \"eip6963\"\n\nexport interface DetectionContextValue {\n mode: DetectionMode\n}\n\nconst DetectionContext = createContext<DetectionContextValue>({ mode: \"walletconnect\" })\n\nexport function useDetectionMode(): DetectionContextValue {\n return useContext(DetectionContext)\n}\n\nexport interface Web3ConnectUIProps {\n config: Web3ConnectConfig\n children: React.ReactNode\n autoConnect?: boolean\n /** Wallet connection detection mode:\n * - \"walletconnect\" (default): Always use WalletConnect relay\n * - \"eip6963\": Only use browser-injected EIP-6963 wallets\n * - \"auto\": Auto-detect EIP-6963 wallets, fall back to WalletConnect\n */\n detectionMode?: DetectionMode\n /** Theme overrides for connect UI components */\n theme?: ThemeOverride\n /** Default dark mode */\n defaultDark?: boolean\n /**\n * Theme priority mode:\n * - \"computed\" (default): Respect developer's existing CSS variables (e.g. shadcn theme)\n * - \"fallback\": Always inject connect's theme variables\n */\n themePriority?: ThemePriority\n}\n\nexport function Web3ConnectUI({\n config,\n children,\n autoConnect = false,\n detectionMode = 'walletconnect',\n theme,\n defaultDark = false,\n themePriority = 'computed',\n}: Web3ConnectUIProps) {\n const detectionCtx = useMemo<DetectionContextValue>(() => ({ mode: detectionMode }), [detectionMode])\n\n const needsWalletConnect = detectionMode === 'walletconnect' || detectionMode === 'auto'\n\n return (\n <DetectionContext.Provider value={detectionCtx}>\n <ThemeProvider theme={theme} defaultDark={defaultDark} priority={themePriority}>\n <Web3ComponentProvider components={{ QRCodeModal }}>\n <Web3ConnectProvider config={config} autoConnect={autoConnect}>\n {needsWalletConnect ? (\n <WalletConnectProvider>\n {children}\n </WalletConnectProvider>\n ) : (\n children\n )}\n </Web3ConnectProvider>\n </Web3ComponentProvider>\n </ThemeProvider>\n </DetectionContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo, useEffect, useCallback, useState } from 'react'\nimport { THEME_CONTRACT, clearCSSVariableCache, type ThemeVariableName } from '../lib/css-variables'\n\nexport interface ThemeOverride {\n primary?: string\n 'primary-foreground'?: string\n background?: string\n foreground?: string\n card?: string\n 'card-foreground'?: string\n popover?: string\n 'popover-foreground'?: string\n secondary?: string\n 'secondary-foreground'?: string\n muted?: string\n 'muted-foreground'?: string\n accent?: string\n 'accent-foreground'?: string\n destructive?: string\n 'destructive-foreground'?: string\n border?: string\n input?: string\n ring?: string\n radius?: string\n}\n\nexport type ThemePriority = 'computed' | 'fallback'\n\ninterface ThemeContextValue {\n theme: ThemeOverride\n isDark: boolean\n setTheme: (theme: ThemeOverride) => void\n toggleDarkMode: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: {},\n isDark: false,\n setTheme: () => {},\n toggleDarkMode: () => {},\n})\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n theme?: ThemeOverride\n defaultDark?: boolean\n priority?: ThemePriority\n}\n\nfunction generateCSS(theme: ThemeOverride): string {\n const rules: string[] = []\n for (const [key, value] of Object.entries(theme)) {\n const cssVar = THEME_CONTRACT[key as ThemeVariableName]\n if (cssVar && value) {\n rules.push(' ' + cssVar.name + ': ' + value + ';')\n }\n }\n if (rules.length === 0) return ''\n return ':root {\\n' + rules.join('\\n') + '\\n}'\n}\n\nfunction getDefinedVars(priority: ThemePriority): Set<string> {\n const defined = new Set<string>()\n if (priority !== 'computed') return defined\n if (typeof document === 'undefined') return defined\n for (const key of Object.keys(THEME_CONTRACT)) {\n const cssVar = THEME_CONTRACT[key as ThemeVariableName]\n const existing = getComputedStyle(document.documentElement).getPropertyValue(cssVar.name).trim()\n if (existing && existing !== cssVar.fallback) {\n defined.add(key)\n }\n }\n return defined\n}\n\nexport function ThemeProvider({\n children,\n theme = {},\n defaultDark = false,\n priority = 'fallback',\n}: ThemeProviderProps) {\n const [customTheme, setCustomTheme] = useState<ThemeOverride>(theme)\n const [isDark, setIsDark] = useState(defaultDark)\n\n // Clear CSS variable cache when theme changes\n useEffect(() => {\n clearCSSVariableCache()\n }, [customTheme])\n\n const [devDefined, setDevDefined] = useState<Set<string>>(new Set())\n useEffect(() => {\n setDevDefined(getDefinedVars(priority))\n }, [priority])\n\n const effectiveTheme = useMemo(() => {\n if (priority === 'fallback' || devDefined.size === 0) return customTheme\n const filtered: ThemeOverride = {}\n for (const [key, value] of Object.entries(customTheme)) {\n if (!devDefined.has(key) && value) {\n filtered[key as keyof ThemeOverride] = value\n }\n }\n return filtered\n }, [customTheme, priority, devDefined])\n\n const cssString = useMemo(() => generateCSS(effectiveTheme), [effectiveTheme])\n\n // Dark class management\n useEffect(() => {\n if (typeof document === 'undefined') return\n const root = document.documentElement\n if (isDark) root.classList.add('dark')\n else root.classList.remove('dark')\n clearCSSVariableCache()\n }, [isDark])\n\n // Stable style tag ID\n const styleId = useMemo(() => 'w3c-theme-' + Math.random().toString(36).slice(2, 9), [])\n\n // toggleDarkMode: at TOP LEVEL, not inside useMemo!\n const toggleDarkMode = useCallback(() => setIsDark((prev) => !prev), [])\n\n const value = useMemo(\n () => ({\n theme: customTheme,\n isDark,\n setTheme: setCustomTheme,\n toggleDarkMode,\n }),\n [customTheme, isDark, toggleDarkMode]\n )\n\n return (\n <ThemeContext.Provider value={value}>\n {cssString ? (\n <style id={styleId} dangerouslySetInnerHTML={{ __html: cssString }} />\n ) : null}\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext)\n}\n\nexport function useThemeVariable(name: ThemeVariableName): string {\n const { theme } = useTheme()\n const [value, setValue] = useState<string>('')\n\n useEffect(() => {\n const cssVar = THEME_CONTRACT[name]\n if (!cssVar) return\n const customValue = theme[name as keyof ThemeOverride]\n if (customValue) {\n setValue(customValue)\n return\n }\n if (typeof document === 'undefined') {\n setValue(cssVar.fallback)\n return\n }\n const cssValue = getComputedStyle(document.documentElement)\n .getPropertyValue(cssVar.name)\n .trim()\n setValue(cssValue || cssVar.fallback)\n }, [name, theme])\n\n return value || THEME_CONTRACT[name]?.fallback || ''\n}\n","/**\n * CSS Variables — Theme contract + host mapping utilities.\n *\n * Two APIs live here:\n * 1. THEME_CONTRACT (consumed by ThemeContext for computed/fallback modes)\n * 2. REQUIRED_VARS / OPTIONAL_VARS / DARK_VARS (Mode C mapping docs)\n */\n\n// ── Theme Contract (consumed by ThemeContext) ─────────────────────\n// These are the canonical shadcn CSS variable names and their default\n// fallback values. Do NOT remove — ThemeContext.test.tsx depends on them.\n\nexport interface ThemeVariable {\n name: string\n fallback: string\n}\n\nexport const THEME_CONTRACT = {\n primary: { name: '--primary', fallback: '221.2 83.2% 53.3%' },\n 'primary-foreground': { name: '--primary-foreground', fallback: '210 40% 98%' },\n background: { name: '--background', fallback: '0 0% 100%' },\n foreground: { name: '--foreground', fallback: '222.2 84% 4.9%' },\n card: { name: '--card', fallback: '0 0% 100%' },\n 'card-foreground': { name: '--card-foreground', fallback: '222.2 84% 4.9%' },\n popover: { name: '--popover', fallback: '0 0% 100%' },\n 'popover-foreground': { name: '--popover-foreground', fallback: '222.2 84% 4.9%' },\n secondary: { name: '--secondary', fallback: '210 40% 96.1%' },\n 'secondary-foreground': { name: '--secondary-foreground', fallback: '222.2 47.4% 11.2%' },\n muted: { name: '--muted', fallback: '210 40% 96.1%' },\n 'muted-foreground': { name: '--muted-foreground', fallback: '215.4 16.3% 46.9%' },\n accent: { name: '--accent', fallback: '210 40% 96.1%' },\n 'accent-foreground': { name: '--accent-foreground', fallback: '222.2 47.4% 11.2%' },\n destructive: { name: '--destructive', fallback: '0 84.2% 60.2%' },\n border: { name: '--border', fallback: '214.3 31.8% 91.4%' },\n input: { name: '--input', fallback: '214.3 31.8% 91.4%' },\n ring: { name: '--ring', fallback: '221.2 83.2% 53.3%' },\n radius: { name: '--radius', fallback: '0.5rem' },\n} as const\n\nexport type ThemeVariableName = keyof typeof THEME_CONTRACT\n\nconst cache = new Map<string, string>()\n\nfunction computeValue(name: ThemeVariableName): string {\n const { name: varName, fallback } = THEME_CONTRACT[name]\n if (typeof window === 'undefined') return fallback\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n}\n\nexport function getCSSVariable(name: ThemeVariableName): string {\n const cached = cache.get(name)\n if (cached !== undefined) return cached\n const value = computeValue(name)\n cache.set(name, value)\n return value\n}\n\nexport function clearCSSVariableCache(): void {\n cache.clear()\n}\n\nexport function refreshCSSVariable(name: ThemeVariableName): string {\n const value = computeValue(name)\n cache.set(name, value)\n return value\n}\n\nexport function getThemeStyles(): Record<string, string> {\n const styles: Record<string, string> = {}\n for (const key of Object.keys(THEME_CONTRACT) as ThemeVariableName[]) {\n styles[key] = getCSSVariable(key)\n }\n return styles\n}\n\nexport function isCSSVariableDefined(name: ThemeVariableName): boolean {\n if (typeof window === 'undefined') return false\n const cached = cache.get(name)\n if (cached !== undefined) return cached.length > 0\n const value = computeValue(name)\n cache.set(name, value)\n return value.length > 0\n}\n\nexport function getDefinedCSSVariables(): ThemeVariableName[] {\n return Object.keys(THEME_CONTRACT).filter((n) =>\n isCSSVariableDefined(n as ThemeVariableName)\n ) as ThemeVariableName[]\n}\n\n// ── Mode C: Host theme mapping (documentation + generate helper) ──\n\nexport const REQUIRED_VARS = {\n \"--background\": { fallback: \"0 0% 100%\", desc: \"Page background color (HSL)\" },\n \"--foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Primary text color (HSL)\" },\n \"--primary\": { fallback: \"221.2 83.2% 53.3%\", desc: \"Primary action color (HSL)\" },\n \"--primary-foreground\": { fallback: \"210 40% 98%\", desc: \"Text on primary surfaces (HSL)\" },\n \"--border\": { fallback: \"214.3 31.8% 91.4%\", desc: \"Border color (HSL)\" },\n \"--ring\": { fallback: \"221.2 83.2% 53.3%\", desc: \"Focus ring color (HSL)\" },\n} as const;\n\nexport const OPTIONAL_VARS = {\n \"--card\": { fallback: \"0 0% 100%\", desc: \"Card surface\" },\n \"--card-foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Card text\" },\n \"--popover\": { fallback: \"0 0% 100%\", desc: \"Popover surface\" },\n \"--popover-foreground\": { fallback: \"222.2 84% 4.9%\", desc: \"Popover text\" },\n \"--secondary\": { fallback: \"210 40% 96.1%\", desc: \"Secondary surface\" },\n \"--secondary-foreground\": { fallback: \"222.2 47.4% 11.2%\", desc: \"Secondary text\" },\n \"--muted\": { fallback: \"210 40% 96.1%\", desc: \"Muted/disabled surface\" },\n \"--muted-foreground\": { fallback: \"215.4 16.3% 46.9%\", desc: \"Muted text\" },\n \"--accent\": { fallback: \"210 40% 96.1%\", desc: \"Accent surface\" },\n \"--accent-foreground\": { fallback: \"222.2 47.4% 11.2%\", desc: \"Accent text\" },\n \"--destructive\": { fallback: \"0 84.2% 60.2%\", desc: \"Destructive action\" },\n \"--destructive-foreground\": { fallback: \"210 40% 98%\", desc: \"Destructive text\" },\n \"--input\": { fallback: \"214.3 31.8% 91.4%\", desc: \"Input border\" },\n \"--radius\": { fallback: \"0.5rem\", desc: \"Border radius\" },\n} as const;\n\nexport const DARK_VARS = {\n \"--background\": { value: \"222.2 84% 4.9%\" },\n \"--foreground\": { value: \"210 40% 98%\" },\n \"--primary\": { value: \"217.2 91.2% 59.8%\" },\n \"--primary-foreground\": { value: \"222.2 47.4% 11.2%\" },\n \"--border\": { value: \"217.2 32.6% 17.5%\" },\n \"--ring\": { value: \"224.3 76.3% 48%\" },\n} as const;\n\nexport function generateVarCSS(\n vars: Record<string, { value?: string; fallback?: string }>,\n selector: string = \":root\",\n): string {\n const rules = Object.entries(vars)\n .filter(([, v]) => v.value || v.fallback)\n .map(([k, v]) => ` ${k}: ${v.value || v.fallback};`)\n .join(\"\\n\");\n return `${selector} {\\n${rules}\\n}`;\n}\n","\"use client\";\n\nimport type {\n EmbeddedWalletAccountView,\n WalletNamespace,\n} from \"@naculus/connect-appkit-react\";\nimport { useEmbeddedWallet } from \"@naculus/connect-appkit-react\";\nimport { Check, Copy, Loader2, Plus } from \"lucide-react\";\nimport type React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport interface AccountSelectorProps {\n className?: string;\n /** Hide the \"derive missing accounts\" affordance. */\n hideBackfill?: boolean;\n onSelect?: (namespace: WalletNamespace) => void;\n}\n\n/**\n * A recovery phrase derives an independent key per BIP-44 coin type, so one\n * phrase owns an EVM account *and* a Solana account. These are not two views\n * of one key: holding one reveals nothing about the other.\n *\n * The label matters. `eip155` is not \"Ethereum\" — the same address is the\n * user's account on Polygon, Arbitrum and every other EVM chain, and calling\n * it Ethereum would tell someone their Polygon funds live somewhere else.\n */\nconst NAMESPACE_LABEL: Record<\n WalletNamespace,\n { name: string; detail: string }\n> = {\n eip155: {\n name: \"Ethereum & EVM\",\n detail:\n \"One address across Ethereum, Polygon, Arbitrum and every EVM chain\",\n },\n solana: {\n name: \"Solana\",\n detail: \"A separate key on a different curve\",\n },\n};\n\nfunction shortAddress(address: string): string {\n // Both ends, never one. A user checking an address compares the first and\n // last characters, and a prefix alone is what an address-poisoning attack\n // needs to pass.\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\nfunction AccountRow({\n account,\n isActive,\n onSelect,\n}: {\n account: EmbeddedWalletAccountView;\n isActive: boolean;\n onSelect: () => void;\n}) {\n const [copied, setCopied] = useState(false);\n const label = NAMESPACE_LABEL[account.namespace] ?? {\n name: account.namespace,\n detail: \"\",\n };\n\n const copy = useCallback(\n (e: React.MouseEvent) => {\n // Copying an address is not choosing which account signs.\n e.stopPropagation();\n const write = navigator?.clipboard?.writeText;\n if (!write) return;\n write.call(navigator.clipboard, account.address).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n () => {\n // Denied clipboard permission is not worth an error state; the\n // address is on screen and selectable.\n },\n );\n },\n [account.address],\n );\n\n return (\n // The selectable row also contains a real copy button. A native radio\n // cannot contain that separate action, so the row uses the ARIA radio\n // interaction while avoiding invalid nested buttons.\n // biome-ignore lint/a11y/useSemanticElements: composite row has an independent copy action\n <div\n role=\"radio\"\n tabIndex={0}\n aria-checked={isActive}\n onClick={onSelect}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onSelect();\n }\n }}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-3 py-2.5 text-left text-sm transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isActive\n ? \"border-primary bg-accent\"\n : \"border-border hover:bg-accent/50\",\n )}\n >\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"flex items-center gap-2 font-medium\">\n {label.name}\n {isActive && (\n <span className=\"rounded-sm bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-primary\">\n Signing\n </span>\n )}\n </span>\n <span className=\"truncate font-mono text-xs text-muted-foreground\">\n {shortAddress(account.address)}\n </span>\n </span>\n <button\n type=\"button\"\n aria-label={`Copy ${label.name} address`}\n onClick={copy}\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n {isActive && <Check size={16} className=\"shrink-0 text-primary\" />}\n </div>\n );\n}\n\n/**\n * Lists the accounts an embedded wallet holds and lets the user choose which\n * one signs.\n *\n * Renders nothing when there is no embedded wallet, rather than an empty\n * panel: a consumer can mount this unconditionally.\n */\nexport interface AccountSelectorViewProps extends AccountSelectorProps {\n accounts: EmbeddedWalletAccountView[];\n activeNamespace: WalletNamespace | null;\n /** Whether a stored phrase could derive an account not listed above. */\n canDerive: boolean;\n setActiveNamespace: (namespace: WalletNamespace) => void;\n backfillAccounts: () => Promise<unknown>;\n}\n\n/**\n * The presentation, separated from where the accounts come from.\n *\n * Exported because Storybook and a consumer with its own account source are\n * both real second callers; a raw-key wallet and a phrase wallet differ only\n * in `canDerive`, and that state is otherwise reachable only by importing an\n * actual key.\n */\nexport function AccountSelectorView({\n className,\n hideBackfill = false,\n onSelect,\n accounts,\n activeNamespace,\n canDerive,\n setActiveNamespace,\n backfillAccounts,\n}: AccountSelectorViewProps) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSelect = useCallback(\n (namespace: WalletNamespace) => {\n if (namespace === activeNamespace) return;\n try {\n setActiveNamespace(namespace);\n setError(null);\n onSelect?.(namespace);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Could not switch account\");\n }\n },\n [activeNamespace, setActiveNamespace, onSelect],\n );\n\n const handleBackfill = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n await backfillAccounts();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Could not derive accounts\");\n } finally {\n setBusy(false);\n }\n }, [backfillAccounts]);\n\n if (accounts.length === 0) return null;\n\n const canBackfill = !hideBackfill && canDerive;\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n Accounts\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n Chooses the signing key, not the network\n </span>\n </div>\n\n <div\n role=\"radiogroup\"\n aria-label=\"Wallet accounts\"\n className=\"flex flex-col gap-1.5\"\n >\n {accounts.map((account) => (\n <AccountRow\n key={account.namespace}\n account={account}\n isActive={account.namespace === activeNamespace}\n onSelect={() => handleSelect(account.namespace)}\n />\n ))}\n </div>\n\n {canBackfill && (\n <button\n type=\"button\"\n onClick={handleBackfill}\n disabled={busy}\n className={cn(\n \"flex items-center justify-center gap-2 rounded-md border border-dashed border-border px-3 py-2 text-xs text-muted-foreground\",\n \"hover:bg-accent/50 disabled:opacity-60\",\n )}\n >\n {busy ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Plus size={14} />\n )}\n {busy ? \"Deriving…\" : \"Show accounts this phrase already owns\"}\n </button>\n )}\n\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Lists the embedded wallet's accounts and lets the user choose which signs.\n *\n * Renders nothing when there is no embedded wallet, so a consumer can mount\n * this unconditionally.\n */\nexport function AccountSelector(props: AccountSelectorProps) {\n const {\n wallet,\n accounts,\n activeNamespace,\n setActiveNamespace,\n backfillAccounts,\n } = useEmbeddedWallet();\n if (!wallet) return null;\n return (\n <AccountSelectorView\n {...props}\n accounts={accounts}\n activeNamespace={activeNamespace}\n // Only true when deriving can actually do something. A wallet imported\n // from a raw private key has no phrase, so there is no second account\n // to derive — the affordance would promise a key that cannot exist.\n canDerive={wallet.recoveryAvailable && accounts.length < 2}\n setActiveNamespace={setActiveNamespace}\n backfillAccounts={backfillAccounts}\n />\n );\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { AlertTriangle, Info, ShieldAlert, ShieldCheck } from \"lucide-react\"\nimport { useEmbeddedWallet } from \"@naculus/connect-appkit-react\"\nimport type {\n StorageSecurityFinding,\n StorageSecurityReport,\n} from \"@naculus/connect-appkit-react\"\nimport { cn } from \"../lib/cn\"\n\nexport interface WalletSecurityPanelProps {\n className?: string\n /** Hide findings that cost no points. Off by default — the hot-wallet\n * exposure is one of them, and it is the one users most need to read. */\n hideInformational?: boolean\n}\n\nconst SEVERITY_ICON = {\n critical: ShieldAlert,\n warning: AlertTriangle,\n info: Info,\n} as const\n\nconst SEVERITY_CLASS = {\n critical: \"text-destructive\",\n warning: \"text-amber-600 dark:text-amber-500\",\n info: \"text-muted-foreground\",\n} as const\n\nfunction scoreTone(score: number): string {\n if (score >= 90) return \"text-emerald-600 dark:text-emerald-500\"\n if (score >= 70) return \"text-amber-600 dark:text-amber-500\"\n return \"text-destructive\"\n}\n\nfunction FindingRow({ finding }: { finding: StorageSecurityFinding }) {\n const Icon = SEVERITY_ICON[finding.severity] ?? Info\n return (\n <li className=\"flex gap-2.5 rounded-md border border-border px-3 py-2.5\">\n <Icon size={16} className={cn(\"mt-0.5 shrink-0\", SEVERITY_CLASS[finding.severity])} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-sm font-medium\">{finding.title}</span>\n {finding.deduction > 0 && (\n <span className=\"shrink-0 font-mono text-xs text-muted-foreground\">\n −{finding.deduction}\n </span>\n )}\n </div>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {finding.detail}\n </p>\n {finding.remedy && (\n <p className=\"text-xs leading-relaxed\">\n <span className=\"font-medium\">What helps: </span>\n <span className=\"text-muted-foreground\">{finding.remedy}</span>\n </p>\n )}\n </div>\n </li>\n )\n}\n\n/**\n * Shows how the embedded wallet is stored, as a score with the specific\n * reasons it is not higher.\n *\n * A tier from 1 to 4 tells a user where they stand and nothing about why or\n * what to do about it. Every point this panel removes is attached to the\n * sentence that explains it.\n *\n * Renders nothing when no embedded wallet exists — the storage backend is\n * chosen when the wallet is created, so there is nothing to assess before\n * then, and a warning about a wallet that does not exist is noise.\n */\nexport interface WalletSecurityPanelViewProps extends WalletSecurityPanelProps {\n report: StorageSecurityReport | null\n}\n\n/**\n * The presentation, separated from where the report comes from.\n *\n * Exported because Storybook and any consumer holding its own report are both\n * real second callers, and because every visual state here is otherwise only\n * reachable by arranging a wallet on disk to be in that state.\n */\nexport function WalletSecurityPanelView({\n className,\n hideInformational = false,\n report: securityReport,\n}: WalletSecurityPanelViewProps) {\n if (!securityReport) return null\n\n const { score, level, findings, encrypted, backend, unlock } = securityReport\n const shown = hideInformational\n ? findings.filter((f) => f.deduction > 0)\n : findings\n const perfect = findings.every((f) => f.deduction === 0)\n\n return (\n <div className={cn(\"flex flex-col gap-3\", className)}>\n <div className=\"flex items-center gap-3 rounded-lg border border-border px-4 py-3\">\n <ShieldCheck size={22} className={cn(\"shrink-0\", scoreTone(score))} />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-baseline gap-2\">\n <span className={cn(\"text-2xl font-semibold tabular-nums\", scoreTone(score))}>\n {score}\n </span>\n <span className=\"text-sm text-muted-foreground\">/ 100</span>\n <span className=\"ml-auto text-xs text-muted-foreground\">\n Tier {level}\n </span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {backend === \"localStorage\" ? \"localStorage\" : \"IndexedDB\"}\n {encrypted ? \" · encrypted\" : \" · not encrypted\"}\n {unlock.sealedWith?.includes(\"prf\") ? \" · passkey\" : \"\"}\n </span>\n </div>\n </div>\n\n {perfect ? (\n <p className=\"text-xs text-muted-foreground\">\n Nothing is holding this score down.\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {/* Said plainly, because a number with an invented authority behind\n it is worse than no number. */}\n Scored against this SDK's own published rubric, not an external\n standard. Each item below names the points it costs.\n </p>\n )}\n\n <ul className=\"flex flex-col gap-1.5\">\n {shown.map((finding) => (\n <FindingRow key={finding.id} finding={finding} />\n ))}\n </ul>\n </div>\n )\n}\n\n/** Reads the report from the embedded wallet and renders it. */\nexport function WalletSecurityPanel(props: WalletSecurityPanelProps) {\n const { securityReport } = useEmbeddedWallet()\n return <WalletSecurityPanelView {...props} report={securityReport} />\n}\n","\"use client\"\n\nimport React, { useCallback, useEffect, useRef, useState } from \"react\"\nimport { Eye, EyeOff, KeyRound, ShieldAlert } from \"lucide-react\"\nimport { usePassphraseGate } from \"@naculus/connect-appkit-react\"\nimport type { PassphraseRequest } from \"@naculus/connect-appkit-react\"\nimport { cn } from \"../lib/cn\"\n\n/**\n * NIST SP 800-63B's floor for a user-chosen memorized secret. Not a number\n * invented here, and not a claim that eight characters is enough — the copy\n * below says what actually helps.\n */\nconst MIN_LENGTH = 8\n\n/** Below this, a single word is the likely shape and worth saying something about. */\nconst SHORT_LENGTH = 12\n\nexport interface PassphraseDialogProps {\n className?: string\n}\n\n/**\n * Asks for the passphrase that encrypts the embedded wallet on this device.\n *\n * Renders only while something is actually blocked on the answer — a load or\n * a save inside the storage adapter — and nothing at all when the app supplies\n * its own `encryptionPassphrase` or has encryption off.\n */\nexport interface PassphraseDialogViewProps extends PassphraseDialogProps {\n request: PassphraseRequest | null\n submit: (passphrase: string) => void\n cancel: () => void\n}\n\n/**\n * The presentation, separated from the gate that drives it.\n *\n * Exported because reaching the retry and create states otherwise means\n * arranging an actual failed decrypt.\n */\nexport function PassphraseDialogView({\n className,\n request,\n submit,\n cancel,\n}: PassphraseDialogViewProps) {\n const [value, setValue] = useState(\"\")\n const [confirm, setConfirm] = useState(\"\")\n const [visible, setVisible] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const isCreate = request?.intent === \"create\"\n\n // Cleared between prompts. Carrying a value across would re-offer a\n // passphrase that has just been rejected.\n useEffect(() => {\n if (!request) {\n setValue(\"\")\n setConfirm(\"\")\n setVisible(false)\n return\n }\n setValue(\"\")\n setConfirm(\"\")\n inputRef.current?.focus()\n }, [request])\n\n const tooShort = isCreate && value.length > 0 && value.length < MIN_LENGTH\n const mismatch = isCreate && confirm.length > 0 && confirm !== value\n const canSubmit = isCreate\n ? value.length >= MIN_LENGTH && confirm === value\n : value.length > 0\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (!canSubmit) return\n submit(value)\n },\n [canSubmit, submit, value],\n )\n\n if (!request) return null\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n role=\"presentation\"\n >\n <form\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={isCreate ? \"Choose a passphrase\" : \"Unlock your wallet\"}\n onSubmit={handleSubmit}\n className={cn(\n \"flex w-full max-w-sm flex-col gap-4 rounded-lg border border-border bg-card p-5 shadow-lg\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <KeyRound size={18} className=\"shrink-0 text-primary\" />\n <h2 className=\"text-base font-semibold\">\n {isCreate ? \"Choose a passphrase\" : \"Unlock your wallet\"}\n </h2>\n </div>\n\n {request.previousError && (\n <p\n role=\"alert\"\n className=\"rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n {request.previousError}\n </p>\n )}\n\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {isCreate\n ? \"This encrypts your wallet on this device. Without it, anything that can run script on this page can read your keys.\"\n : \"Your wallet is encrypted on this device. Enter the passphrase you chose to open it.\"}\n </p>\n\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">\n {isCreate ? \"Passphrase\" : \"Passphrase\"}\n </span>\n <span className=\"relative flex items-center\">\n <input\n ref={inputRef}\n type={visible ? \"text\" : \"password\"}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n autoComplete={isCreate ? \"new-password\" : \"current-password\"}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 pr-9 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <button\n type=\"button\"\n aria-label={visible ? \"Hide passphrase\" : \"Show passphrase\"}\n onClick={() => setVisible((v) => !v)}\n className=\"absolute right-2 text-muted-foreground hover:text-foreground\"\n >\n {visible ? <EyeOff size={15} /> : <Eye size={15} />}\n </button>\n </span>\n </label>\n\n {isCreate && (\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">Type it again</span>\n <input\n type={visible ? \"text\" : \"password\"}\n value={confirm}\n onChange={(e) => setConfirm(e.target.value)}\n autoComplete=\"new-password\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n )}\n\n {tooShort && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n At least {MIN_LENGTH} characters.\n </p>\n )}\n {mismatch && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n These do not match.\n </p>\n )}\n\n {isCreate && !tooShort && value.length > 0 && value.length < SHORT_LENGTH && (\n <p className=\"text-xs text-muted-foreground\">\n {/* Factual, and the advice that actually helps. No strength meter:\n a colour computed from character classes rates \"P@ssw0rd!\"\n above four ordinary words, which is backwards. */}\n Short. Several ordinary words are far harder to guess than a short\n one with symbols in it.\n </p>\n )}\n\n {isCreate && (\n <p className=\"flex gap-2 rounded-md bg-amber-500/10 px-3 py-2 text-xs leading-relaxed text-amber-700 dark:text-amber-500\">\n <ShieldAlert size={14} className=\"mt-0.5 shrink-0\" />\n <span>\n If you forget this, nothing can open this copy of the wallet —\n not us, not your browser. Your recovery phrase is the only thing\n that gets it back.\n </span>\n </p>\n )}\n\n <div className=\"flex justify-end gap-2 pt-1\">\n <button\n type=\"button\"\n onClick={() => cancel()}\n className=\"rounded-md border border-border px-3 py-2 text-sm hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n >\n {isCreate ? \"Encrypt wallet\" : \"Unlock\"}\n </button>\n </div>\n </form>\n </div>\n )\n}\n\n/**\n * Asks for the passphrase that encrypts the embedded wallet on this device.\n *\n * Renders only while a load or save inside the storage adapter is actually\n * blocked on the answer, and nothing at all when the app supplies its own\n * `encryptionPassphrase` or has encryption off.\n */\nexport function PassphraseDialog(props: PassphraseDialogProps) {\n const { request, submit, cancel } = usePassphraseGate()\n return (\n <PassphraseDialogView\n {...props}\n request={request}\n submit={submit}\n cancel={cancel}\n />\n )\n}\n","\"use client\"\n\nimport React, { useCallback, useState } from \"react\"\nimport { Fingerprint, Loader2, ShieldAlert, ShieldCheck, TriangleAlert } from \"lucide-react\"\nimport { useEmbeddedWallet, useWeb3 } from \"@naculus/connect-appkit-react\"\nimport { cn } from \"../lib/cn\"\n\nexport interface PasskeySetupProps {\n className?: string\n}\n\n/**\n * Registers a passkey and puts the wallet's stored record under it.\n *\n * Two facts drive the whole of this component:\n *\n * PRF cannot be added to a credential after creation. A passkey registered\n * without it can never unlock anything, and the only route forward is\n * registering a new one — so the result of the attempt has to be reported\n * honestly rather than as a generic success.\n *\n * A passkey protects the local copy, not the wallet. The recovery phrase is\n * still the only backup that survives losing the device, and that has to be\n * said here, at the moment someone turns this on, rather than in a document\n * they will not read.\n */\nexport interface PasskeySetupViewProps extends PasskeySetupProps {\n /** Null when passkeys are not enabled on the client. */\n passkeys: {\n hasCredential?: () => boolean\n createPasskey: () => Promise<unknown>\n } | null\n unlock: UnlockSnapshot | undefined\n onRegistered?: () => Promise<void> | void\n}\n\n/**\n * What the unlock layer reports, which is what decides the copy shown.\n *\n * `prf` being absent is a different fact from it being `\"unavailable\"`, and\n * the component must not collapse them.\n */\nexport interface UnlockSnapshot {\n prf?: \"unknown\" | \"available\" | \"unavailable\" | \"none\"\n sealedWith?: string[] | null\n}\n\n/**\n * The presentation, separated from the client and wallet it reads.\n *\n * Exported because every state here — registered but unusable, registered but\n * unsealed, not yet checked — otherwise needs a real authenticator behaving a\n * particular way.\n */\nexport function PasskeySetupView({\n className,\n passkeys,\n unlock,\n onRegistered,\n}: PasskeySetupViewProps) {\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [justRegistered, setJustRegistered] = useState(false)\n\n const hasCredential = Boolean(passkeys?.hasCredential?.()) || justRegistered\n\n const register = useCallback(async () => {\n if (!passkeys) return\n setBusy(true)\n setError(null)\n try {\n await passkeys.createPasskey()\n setJustRegistered(true)\n // The record on disk was sealed before this credential existed and is\n // still passphrase-only. One save re-seals it under both, which is the\n // whole migration — a v2 write either lands or leaves the previous\n // record untouched.\n await onRegistered?.()\n } catch (e) {\n setError(\n e instanceof Error ? e.message : \"Could not register a passkey\",\n )\n } finally {\n setBusy(false)\n }\n }, [passkeys, onRegistered])\n\n // Nothing to offer when passkeys are not enabled on the client.\n if (!passkeys) return null\n\n const sealed = unlock?.sealedWith?.includes(\"prf\") ?? false\n\n let status: {\n tone: \"good\" | \"warn\" | \"bad\" | \"neutral\"\n icon: React.ReactNode\n title: string\n detail: string\n } | null = null\n\n if (hasCredential) {\n switch (unlock?.prf) {\n case \"available\":\n status = sealed\n ? {\n tone: \"good\",\n icon: <ShieldCheck size={16} />,\n title: \"Your passkey unlocks this wallet\",\n detail:\n \"Opening it needs your fingerprint or face, not a value a script on this page can supply.\",\n }\n : {\n tone: \"warn\",\n icon: <TriangleAlert size={16} />,\n title: \"Registered, but not applied yet\",\n detail:\n \"This device can produce the key material. The next time the wallet is saved, the record is sealed under it.\",\n }\n break\n case \"unavailable\":\n status = {\n tone: \"bad\",\n icon: <ShieldAlert size={16} />,\n title: \"This passkey cannot unlock the wallet\",\n detail:\n \"The authenticator did not return the key material. Firefox does not implement the extension, and a passkey created before it was requested cannot have it added afterwards — a new one has to be registered on a browser that supports it.\",\n }\n break\n default:\n // Configured but not yet exercised, or the platform cannot report.\n // Not the same as \"no\", and saying \"no\" here would tell someone their\n // device cannot do something it may well do.\n status = {\n tone: \"neutral\",\n icon: <Fingerprint size={16} />,\n title: \"A passkey is registered\",\n detail:\n \"Whether it can unlock this wallet is not known until the wallet is opened once. It will be used if it works.\",\n }\n break\n }\n }\n\n const TONE_CLASS = {\n good: \"text-emerald-600 dark:text-emerald-500\",\n warn: \"text-amber-600 dark:text-amber-500\",\n bad: \"text-destructive\",\n neutral: \"text-muted-foreground\",\n } as const\n\n return (\n <div className={cn(\"flex flex-col gap-3\", className)}>\n {status ? (\n <div className=\"flex gap-2.5 rounded-md border border-border px-3 py-2.5\">\n <span className={cn(\"mt-0.5 shrink-0\", TONE_CLASS[status.tone])}>\n {status.icon}\n </span>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-medium\">{status.title}</span>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {status.detail}\n </p>\n </div>\n </div>\n ) : (\n <>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n A passkey raises what it takes to read your stored keys from\n “any script on this page” to your fingerprint or face.\n The passphrase keeps working, so a broken or replaced authenticator\n does not cost you this copy.\n </p>\n <p className=\"flex gap-2 rounded-md bg-amber-500/10 px-3 py-2 text-xs leading-relaxed text-amber-700 dark:text-amber-500\">\n <ShieldAlert size={14} className=\"mt-0.5 shrink-0\" />\n <span>\n This protects the copy on this device. It does not back up your\n wallet — the recovery phrase is still the only thing that\n survives losing this device.\n </span>\n </p>\n <button\n type=\"button\"\n onClick={register}\n disabled={busy}\n className=\"flex items-center justify-center gap-2 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground disabled:opacity-60\"\n >\n {busy ? (\n <Loader2 size={15} className=\"animate-spin\" />\n ) : (\n <Fingerprint size={15} />\n )}\n {busy ? \"Waiting for your device…\" : \"Protect with a passkey\"}\n </button>\n </>\n )}\n\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n\n/**\n * Registers a passkey for the embedded wallet and re-seals its stored record.\n */\nexport function PasskeySetup(props: PasskeySetupProps) {\n const { client } = useWeb3()\n const { securityReport, hasWallet } = useEmbeddedWallet()\n const onRegistered = useCallback(async () => {\n const embedded = client?.embeddedConnector\n if (embedded && hasWallet) await embedded.save()\n }, [client, hasWallet])\n\n return (\n <PasskeySetupView\n {...props}\n passkeys={client?.passkeysConnector ?? null}\n unlock={securityReport?.unlock}\n onRegistered={onRegistered}\n />\n )\n}\n","\"use client\";\n\nimport type { Web3ConnectConfig } from \"@naculus/connect-appkit-react\";\nimport {\n useAccount,\n useBalance,\n useChain,\n useDisconnect,\n useEmbeddedWallet,\n useWallet,\n useWeb3,\n} from \"@naculus/connect-appkit-react\";\nimport type React from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport * as componentRegistry from \"../contexts/ComponentRegistry\";\nimport type { DiscoveredWallet } from \"../hooks/useEIP6963\";\nimport { useEIP6963 } from \"../hooks/useEIP6963\";\nimport { cn } from \"../lib/cn\";\nimport { ChainSelector } from \"./ChainSelector\";\nimport { ConnectButton } from \"./ConnectButton\";\nimport { SeedPhraseBackup } from \"./SeedPhraseBackup\";\nimport { Web3ConnectUI, type Web3ConnectUIProps } from \"./Web3ConnectUI\";\n\nexport interface AppKitProps {\n projectId: string;\n metadata: {\n name: string;\n description: string;\n url: string;\n icons: string[];\n };\n enableEmbedded?: boolean;\n enablePasskeys?: boolean;\n /** Chain/RPC configuration forwarded to connect-appkit-react. */\n chains?: Web3ConnectConfig[\"chains\"];\n /** Embedded wallet storage, signer and isolation configuration. */\n embeddedConfig?: Web3ConnectConfig[\"embeddedConfig\"];\n /** Encrypts persisted connection metadata at rest (not a frontend secret). */\n encryptionKey?: Web3ConnectConfig[\"encryptionKey\"];\n /** Optional SIWx authentication policy. */\n siwx?: Web3ConnectConfig[\"siwx\"];\n children?: React.ReactNode;\n className?: string;\n autoConnect?: boolean;\n theme?: Web3ConnectUIProps[\"theme\"];\n defaultDark?: boolean;\n themePriority?: Web3ConnectUIProps[\"themePriority\"];\n detectionMode?: Web3ConnectUIProps[\"detectionMode\"];\n}\n\nexport interface AppKitContextValue {\n connect: () => void;\n disconnect: () => Promise<void>;\n isConnected: boolean;\n isConnecting: boolean;\n address: string | null;\n balance: string | null;\n /** Null when the chain's native symbol is not known. Do not substitute one. */\n balanceSymbol: string | null;\n chainName: string | null;\n availableChains: Array<{ caip2: string; name: string; token?: string }>;\n switchChain: (chainId: string) => Promise<void>;\n wallets: DiscoveredWallet[];\n hasWallets: boolean;\n /** Embedded wallet backup state */\n backupPending: boolean;\n seedPhrase: string | null;\n confirmBackup: () => void;\n skipBackup: () => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst AppKitContext = createContext<AppKitContextValue | null>(null);\n\nexport function useAppKit(): AppKitContextValue {\n const ctx = useContext(AppKitContext);\n if (!ctx) {\n throw new Error(\"useAppKit must be used within an <AppKit> component\");\n }\n return ctx;\n}\n\nexport function AppKit({\n projectId,\n metadata,\n enableEmbedded = false,\n enablePasskeys = false,\n chains,\n embeddedConfig,\n encryptionKey,\n siwx,\n children,\n className,\n autoConnect = false,\n theme,\n defaultDark = false,\n themePriority = \"computed\",\n detectionMode = \"auto\",\n}: AppKitProps) {\n const [open, setOpen] = useState(false);\n const [backupOpen, setBackupOpen] = useState(false);\n\n const config = useMemo<Web3ConnectConfig>(\n () => ({\n projectId,\n metadata,\n enableEmbedded,\n enablePasskeys,\n chains,\n embeddedConfig,\n encryptionKey,\n siwx,\n }),\n [\n projectId,\n metadata,\n enableEmbedded,\n enablePasskeys,\n chains,\n embeddedConfig,\n encryptionKey,\n siwx,\n ],\n );\n\n return (\n <Web3ConnectUI\n config={config}\n autoConnect={autoConnect}\n detectionMode={detectionMode}\n theme={theme}\n defaultDark={defaultDark}\n themePriority={themePriority}\n >\n <AppKitInner\n className={className}\n open={open}\n setOpen={setOpen}\n backupOpen={backupOpen}\n setBackupOpen={setBackupOpen}\n >\n {children}\n </AppKitInner>\n </Web3ConnectUI>\n );\n}\n\ninterface AppKitInnerProps {\n children: React.ReactNode;\n className?: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n backupOpen: boolean;\n setBackupOpen: (open: boolean) => void;\n}\n\nfunction AppKitInner({\n children,\n className,\n open,\n setOpen,\n backupOpen,\n setBackupOpen,\n}: AppKitInnerProps) {\n const { isConnected, isConnecting } = useWallet();\n const { primaryAccount } = useAccount();\n const { currentChain, availableChains, switchChain } = useChain();\n const embedded = useEmbeddedWallet();\n const { disconnect } = useDisconnect();\n const { wallets, hasWallets } = useEIP6963();\n const { formatted: balanceRaw } = useBalance();\n const balance = balanceRaw ?? null;\n\n const handleDisconnect = useCallback(async () => {\n await disconnect();\n }, [disconnect]);\n\n const handleConfirmBackup = useCallback(() => {\n embedded.confirmBackup();\n setBackupOpen(false);\n }, [embedded, setBackupOpen]);\n\n const handleSkipBackup = useCallback(() => {\n // Dismissal must clear the one-shot seed phrase held by the hook. Keeping\n // it in the React tree after the dialog closes needlessly expands its\n // exposure to app code and browser extensions.\n embedded.confirmBackup();\n setBackupOpen(false);\n }, [embedded, setBackupOpen]);\n\n const handleExportPrivateKey = useCallback((): string | null => {\n return embedded.getPrivateKey();\n }, [embedded]);\n\n const value = useMemo<AppKitContextValue>(\n () => ({\n connect: () => setOpen(true),\n disconnect: handleDisconnect,\n isConnected,\n isConnecting,\n address: primaryAccount,\n balance,\n // No `?? \"ETH\"`: this sits beside the number, and labelling MATIC or\n // SOL as ether is a statement about what the user holds.\n balanceSymbol: currentChain?.token ?? null,\n chainName: currentChain?.name ?? null,\n availableChains: availableChains.map((c) => ({\n caip2: c.caip2,\n name: c.name,\n token: c.token,\n })),\n switchChain,\n wallets,\n hasWallets,\n backupPending: embedded.backupPending,\n seedPhrase: embedded.seedPhrase,\n confirmBackup: handleConfirmBackup,\n skipBackup: handleSkipBackup,\n open,\n setOpen,\n }),\n [\n isConnected,\n isConnecting,\n primaryAccount,\n balance,\n currentChain,\n availableChains,\n switchChain,\n wallets,\n hasWallets,\n embedded.backupPending,\n embedded.seedPhrase,\n handleConfirmBackup,\n handleSkipBackup,\n handleDisconnect,\n open,\n setOpen,\n ],\n );\n\n // Open backup dialog when embedded wallet generates a seed phrase\n useEffect(() => {\n if (embedded.seedPhrase && embedded.backupPending) {\n setBackupOpen(true);\n }\n }, [embedded.seedPhrase, embedded.backupPending, setBackupOpen]);\n\n return (\n <AppKitContext.Provider value={value}>\n {children}\n\n {embedded.seedPhrase && backupOpen && (\n <SeedPhraseBackup\n seedPhrase={embedded.seedPhrase}\n onConfirm={handleConfirmBackup}\n onSkip={handleSkipBackup}\n onExportPrivateKey={handleExportPrivateKey}\n open={backupOpen}\n onOpenChange={setBackupOpen}\n />\n )}\n </AppKitContext.Provider>\n );\n}\n\n// ── Convenience sub-components ──────────────────────────────────────\n\nexport interface AppKitButtonProps {\n className?: string;\n}\n\nexport function AppKitButton({ className }: AppKitButtonProps) {\n const ctx = useAppKit();\n const { connectInjected } = useWeb3();\n const { primaryAccount } = useAccount();\n const { disconnect } = useDisconnect();\n\n // The Web Component emits the selected wallet id, but the previous adapter\n // left AppKitButton without an onConnect handler. That made the injected\n // wallet rows look clickable while never reaching the provider. Keep the\n // adapter generic and wire the public AppKit convenience button here.\n const handleConnect = useCallback(\n async (\n walletKind: \"injected\" | \"walletconnect\",\n closeModal: () => void,\n walletId?: string,\n ) => {\n if (walletKind !== \"injected\") return;\n await connectInjected(walletId);\n closeModal();\n },\n [connectInjected],\n );\n\n if (ctx.isConnected && primaryAccount) {\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <ChainSelector variant=\"minimal\" />\n <ConnectButton\n isConnected={ctx.isConnected}\n address={primaryAccount}\n balance={ctx.balance}\n balanceSymbol={ctx.balanceSymbol ?? undefined}\n onDisconnect={disconnect}\n onConnect={handleConnect}\n className={className}\n />\n </div>\n );\n }\n\n return (\n <ConnectButton\n isConnected={ctx.isConnected}\n isConnecting={ctx.isConnecting}\n address={primaryAccount}\n balance={ctx.balance}\n balanceSymbol={ctx.balanceSymbol ?? undefined}\n onDisconnect={disconnect}\n onConnect={handleConnect}\n className={className}\n />\n );\n}\n\nexport interface AppKitChainSelectorProps {\n className?: string;\n variant?: \"dropdown\" | \"buttons\" | \"minimal\";\n}\n\nexport function AppKitChainSelector({\n className,\n variant = \"dropdown\",\n}: AppKitChainSelectorProps) {\n return <ChainSelector className={className} variant={variant} />;\n}\n\n// Register AppKit business components after their module has initialized.\n// ComponentRegistry intentionally does not import this module, which keeps\n// ChainSelector's registry dependency acyclic in production bundles.\ntry {\n const defaults = componentRegistry.DEFAULT_COMPONENTS;\n if (defaults)\n Object.assign(defaults, { AppKit, AppKitButton, AppKitChainSelector });\n} catch {\n // Test consumers may mock the registry module without its optional defaults.\n}\n","\"use client\";\n\n/**\n * RouteSelector — UI component for cross-chain route selection.\n *\n * Displays route quotes from RouteEngine and lets users pick one.\n * Supports loading, executing, success, and error states.\n *\n * Uses ComponentRegistry for all base UI (Button, Card, Badge, Skeleton, Progress).\n */\n\nimport React from \"react\";\nimport {\n ArrowRight,\n CheckCircle2,\n Clock,\n DollarSign,\n Loader2,\n XCircle,\n AlertCircle,\n} from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { getChainLogo } from \"../assets/chains\";\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\";\nimport type { Token } from \"@naculus/connect-core\";\n\n/**\n * Shape this component renders, declared locally on purpose.\n *\n * The sibling hooks already define their own domain types (\"hook domain\n * types, not core exports\") — this component was the one place reaching into\n * core's routing internals, which coupled the UI to whichever routing engine\n * core happened to export. Declaring it here keeps the component usable\n * against any aggregator, which is the point of shipping one appkit for every\n * frontend target.\n */\nexport interface Route {\n id?: string;\n provider?: string;\n fromChain: string;\n toChain: string;\n fromToken?: string;\n toToken?: string;\n fromAmount?: string;\n toAmount?: string;\n toAmountMin?: string;\n steps: Array<{ type?: string; [key: string]: unknown }>;\n gasCosts: { totalUsd: string; [key: string]: unknown };\n estimatedTime: number;\n /** Aggregators attach their own fields; the component only reads the above. */\n [key: string]: unknown;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface TokenDisplay {\n chainId: number;\n address: string;\n symbol: string;\n}\n\nexport interface RouteSelectorProps {\n /** Optional input token info for the header display */\n inputToken?: TokenDisplay;\n /** Optional output token info for the header display */\n outputToken?: TokenDisplay;\n /** Input amount in human-readable units (natural numbers, not wei) */\n amount?: bigint;\n /** Current list of route quotes (pass empty array for no routes state) */\n routes?: Route[];\n /** Whether route quotes are being fetched */\n loading?: boolean;\n /** Whether a route execution is in progress */\n executing?: boolean;\n /** Called when user selects a route */\n onRouteSelected?: (route: Route) => void;\n /** Called when user cancels route selection */\n onCancel?: () => void;\n /** Success message (tx hash) after route execution completes */\n successTxHash?: string | null;\n /** Error message to display */\n error?: string | null;\n /** Optional className overrides */\n className?: string;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction humanReadableCost(cost: bigint, decimals = 18): string {\n // Rough estimate: convert wei to ether\n const divisor = BigInt(10) ** BigInt(decimals);\n const whole = cost / divisor;\n const fraction = cost % divisor;\n\n if (whole === 0n && fraction === 0n) return \"$0.00\";\n if (whole === 0n) return `~$${(Number(fraction) / Number(divisor)).toFixed(2)}`;\n\n const ethValue = Number(whole) + Number(fraction) / Number(divisor);\n return `~$${ethValue.toFixed(2)}`;\n}\n\nfunction formatTime(ms: number): string {\n if (ms < 1000) return `<1s`;\n if (ms < 60_000) return `~${Math.round(ms / 1000)}s`;\n const min = Math.floor(ms / 60_000);\n const sec = Math.round((ms % 60_000) / 1000);\n return sec > 0 ? `~${min}m ${sec}s` : `~${min}m`;\n}\n\nfunction formatSlippage(percent: number): string {\n const pct = percent < 0.01 ? \"<0.01\" : percent.toFixed(2);\n return `${pct}%`;\n}\n\nfunction formatSymbol(token: Token): string {\n return token.symbol || \"UNKNOWN\";\n}\n\nfunction getProviderBadgeVariant(provider: string): string {\n const p = provider.toLowerCase();\n if (p.includes(\"lifi\")) return \"default\";\n if (p.includes(\"axelar\")) return \"secondary\";\n return \"outline\";\n}\n\nfunction formatTxHash(txHash: string): string {\n return txHash.length > 12\n ? `${txHash.slice(0, 6)}...${txHash.slice(-6)}`\n : txHash;\n}\n\n// ── Route Card ────────────────────────────────────────────────────────\n\ninterface RouteCardProps {\n route: Route;\n onSelect: () => void;\n}\n\nfunction RouteCard({ route, onSelect }: RouteCardProps) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n const Badge = registry.Badge as React.ComponentType<\n React.HTMLAttributes<HTMLSpanElement> & { variant?: string }\n >;\n\n const providerName = route.provider ?? \"Route\";\n\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-border p-4 transition-colors hover:bg-accent/30\">\n <div className=\"flex flex-col gap-1.5 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {Badge ? (\n <Badge variant={getProviderBadgeVariant(providerName)}>\n {providerName}\n </Badge>\n ) : (\n <span className=\"inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-medium\">\n {providerName}\n </span>\n )}\n {route.steps.length > 1 && (\n <span className=\"text-xs text-muted-foreground\">\n {route.steps.length} steps\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm\">\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <DollarSign className=\"h-3.5 w-3.5\" />\n ${route.gasCosts.totalUsd}\n </span>\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" />\n {formatTime(\n route.steps.reduce<number>((max, _step) => {\n // Estimate: 15s per swap step, 2min per bridge step\n const baseTime = route.estimatedTime > 0 ? 15_000 : 0;\n return max + baseTime;\n }, 0),\n )}\n </span>\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n {route.gasCosts.totalUsd} cost\n </span>\n </div>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onSelect}\n >\n Select\n </Button>\n </div>\n );\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────\n\nfunction LoadingSkeleton() {\n const registry = useComponentRegistry();\n const Skeleton = registry.Skeleton as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement>\n >;\n\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"route-selector-loading\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Fetching best routes...</span>\n </div>\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"flex items-center justify-between gap-4 rounded-lg border border-border p-4\"\n >\n <div className=\"flex flex-col gap-2 flex-1\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-48\" />\n </>\n ) : (\n <>\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-48 animate-pulse rounded bg-muted\" />\n </>\n )}\n </div>\n {Skeleton ? (\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n ) : (\n <div className=\"h-8 w-20 animate-pulse rounded-md bg-muted\" />\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction EmptyState() {\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-2 py-8 text-sm text-muted-foreground\"\n data-testid=\"route-selector-empty\"\n >\n <AlertCircle className=\"h-8 w-8 opacity-40\" />\n <span>No routes found for this pair</span>\n <span className=\"text-xs\">Try a different token or amount</span>\n </div>\n );\n}\n\nfunction ErrorState({ error, onRetry }: { error: string; onRetry?: () => void }) {\n const registry = useComponentRegistry();\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-2 py-6\"\n data-testid=\"route-selector-error\"\n >\n <XCircle className=\"h-8 w-8 text-destructive\" />\n <p className=\"text-sm text-destructive font-medium\">Failed to fetch routes</p>\n <p className=\"text-xs text-muted-foreground max-w-xs text-center\">{error}</p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n Retry\n </Button>\n )}\n </div>\n );\n}\n\nfunction ExecutionProgress() {\n const registry = useComponentRegistry();\n const Progress = registry.Progress as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement> & { value?: number }\n >;\n\n return (\n <div className=\"flex flex-col items-center gap-3 py-6\" data-testid=\"route-selector-executing\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <p className=\"text-sm font-medium\">Executing route...</p>\n <p className=\"text-xs text-muted-foreground\">Please confirm the transaction in your wallet</p>\n {Progress ? (\n <Progress value={50} className=\"w-48 h-1.5\" />\n ) : (\n <div className=\"h-1.5 w-48 rounded-full bg-muted\">\n <div className=\"h-full w-1/2 rounded-full bg-primary animate-pulse\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction SuccessState({ txHash }: { txHash: string }) {\n return (\n <div\n className=\"flex flex-col items-center gap-2 py-6\"\n data-testid=\"route-selector-success\"\n >\n <CheckCircle2 className=\"h-8 w-8 text-green-500\" />\n <p className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n Route executed successfully!\n </p>\n <p className=\"text-xs text-muted-foreground font-mono\">\n TX: {formatTxHash(txHash)}\n </p>\n </div>\n );\n}\n\nfunction ChainLogo({ chainId, className }: { chainId: number; className?: string }) {\n const svgStr = getChainLogo(`eip155:${chainId}`);\n if (!svgStr) return null;\n return (\n <span\n className={cn(\"inline-flex items-center justify-center shrink-0\", className)}\n dangerouslySetInnerHTML={{ __html: svgStr }}\n />\n );\n}\n\n// ── Main Component ─────────────────────────────────────────────────────\n\nexport function RouteSelector({\n inputToken,\n outputToken,\n amount,\n routes = [],\n loading = false,\n executing = false,\n onRouteSelected,\n onCancel,\n successTxHash,\n error,\n className,\n}: RouteSelectorProps) {\n const registry = useComponentRegistry();\n const Card = registry.Card as React.ComponentType<\n React.HTMLAttributes<HTMLDivElement>\n >;\n const Button = registry.Button as React.ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }\n >;\n\n // ── Determine state ──────────────────────────────────────────────\n\n // Execution states take precedence\n if (successTxHash) {\n return (\n <div className={cn(\"rounded-lg border border-border\", className)}>\n <SuccessState txHash={successTxHash} />\n </div>\n );\n }\n\n if (executing) {\n return (\n <div className={cn(\"rounded-lg border border-border\", className)}>\n <ExecutionProgress />\n </div>\n );\n }\n\n // ── Content ──────────────────────────────────────────────────────\n\n const content = Card ? (\n <Card className={cn(\"p-4\", className)}>\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </Card>\n ) : (\n <div className={cn(\"rounded-lg border border-border p-4\", className)}>\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </div>\n );\n\n return content;\n\n // ── Internal render helpers ─────────────────────────────────────\n\n function renderHeader() {\n if (!inputToken && !outputToken) return null;\n\n return (\n <div className=\"mb-4 flex flex-wrap items-center gap-2 text-sm\">\n {inputToken && (\n <span className=\"inline-flex items-center gap-1.5 font-medium\">\n <ChainLogo chainId={inputToken.chainId} className=\"h-4 w-4\" />\n {amount ? `${amount.toString()} ` : \"\"}\n {formatSymbol(inputToken as unknown as Token)}\n </span>\n )}\n {inputToken && outputToken && (\n <ArrowRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n {outputToken && (\n <span className=\"inline-flex items-center gap-1.5 font-medium\">\n <ChainLogo chainId={outputToken.chainId} className=\"h-4 w-4\" />\n {formatSymbol(outputToken as unknown as Token)}\n </span>\n )}\n </div>\n );\n }\n\n function renderBody() {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorState error={error} />;\n }\n\n if (routes.length === 0) {\n return <EmptyState />;\n }\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid=\"route-selector-routes\">\n {routes.map((route, idx) => (\n <RouteCard\n key={`${route.fromChain}-${route.toChain}-${route.gasCosts.totalUsd}-${idx}`}\n route={route}\n onSelect={() => onRouteSelected?.(route)}\n />\n ))}\n </div>\n );\n }\n\n function renderFooter() {\n // Show cancel button only when we have routes to select or are loading\n if (!loading && routes.length === 0 && !error) return null;\n\n return (\n <div className=\"mt-4 flex justify-end\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n </div>\n );\n }\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { Shield, ShieldCheck, LoaderCircle, Settings, ChevronRight, AlertCircle, RotateCcw, CheckCircle2, Fuel, Zap, RefreshCw } from \"lucide-react\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\n\nexport interface SmartWalletToggleProps {\n isDeployed?: boolean\n isDeploying?: boolean\n estimatedGas?: bigint\n error?: string | null\n onUpgrade?: () => void\n onShowSettings?: () => void\n onRetry?: () => void\n}\n\nfunction formatGas(gas: bigint): string {\n const eth = Number(gas) / 1e18\n return eth < 0.001 ? `~${eth.toFixed(6)} ETH` : `~${eth.toFixed(3)} ETH`\n}\n\ntype ShadcnButton = React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\n\nexport function SmartWalletToggle({\n isDeployed = false, isDeploying = false, estimatedGas,\n error = null, onUpgrade, onShowSettings, onRetry,\n}: SmartWalletToggleProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as ShadcnButton\n const Card = registry.Card as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n const Badge = registry.Badge as React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { variant?: string }>\n\n const settingsBtn = onShowSettings ? (\n <Button variant=\"outline\" className=\"w-full\" onClick={onShowSettings}>\n <Settings size={15} /> Advanced Settings <ChevronRight size={14} className=\"text-muted-foreground\" />\n </Button>\n ) : null\n\n // ── Deployed ────────────────────────────────────\n if (isDeployed) {\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-green-500/10\">\n <ShieldCheck size={22} className=\"text-green-500\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">Smart Wallet</span>\n <Badge variant=\"secondary\" className=\"rounded-full bg-green-500/10 px-2 py-0 text-xs font-medium text-green-500\">\n <CheckCircle2 size={12} className=\"mr-0.5 inline\" /> Deployed\n </Badge>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">Your wallet has been upgraded to a smart wallet</p>\n </div>\n </div>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n {[[Fuel, \"Gas Sponsorship\", \"Enabled\"] as const, [RefreshCw, \"Recovery\", \"Enabled\"] as const].map(([Icon, label, val], i) => (\n <div key={i} className=\"rounded-lg bg-muted/50 p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {React.createElement(Icon as never, { size: 14 })}\n <span>{label}</span>\n </div>\n <div className=\"mt-1 text-sm font-medium text-foreground\">{val}</div>\n </div>\n ))}\n </div>\n {onShowSettings && <div className=\"mt-4\">{settingsBtn}</div>}\n </Card>\n )\n }\n\n // ── Deploying ────────────────────────────────────\n if (isDeploying) {\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex flex-col items-center text-center\">\n <div className=\"mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-primary/10\">\n <LoaderCircle size={28} className=\"animate-spin text-primary\" />\n </div>\n <h3 className=\"mb-1 text-base font-semibold text-foreground\">Deploying Smart Wallet...</h3>\n <p className=\"mb-4 text-sm text-muted-foreground\">Please wait, contract deployment may take a few seconds</p>\n <div className=\"h-2 w-full max-w-[200px] overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full w-full animate-pulse rounded-full bg-primary\" style={{ animationDuration: \"1.5s\" }} />\n </div>\n </div>\n </Card>\n )\n }\n\n // ── Error ────────────────────────────────────────\n if (error) {\n return (\n <Card className=\"w-full rounded-xl border border-destructive/30 bg-destructive/5 p-5 shadow-sm\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-destructive/10\">\n <AlertCircle size={18} className=\"text-destructive\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h4 className=\"text-sm font-semibold text-destructive\">Deployment Failed</h4>\n <p className=\"mt-1 text-xs text-destructive/80 break-words\">{error}</p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-3 border-destructive/30 text-destructive hover:bg-destructive/10\" onClick={onRetry}>\n <RotateCcw size={13} /> Retry\n </Button>\n )}\n </div>\n </div>\n {onShowSettings && <div className=\"mt-3\">{settingsBtn}</div>}\n </Card>\n )\n }\n\n // ── Not deployed ─────────────────────────────────\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-amber-500/10\">\n <Shield size={20} className=\"text-amber-500\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-semibold text-foreground\">Smart Wallet</span>\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">Not Upgraded</span>\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">Upgrade to a smart wallet for more features</p>\n </div>\n </div>\n <div className=\"mt-4 space-y-2\">\n <Benefit icon={Zap} color=\"text-green-500\" text=\"No ETH needed for transactions — pay gas with USDC/USDT\" />\n <Benefit icon={Fuel} color=\"text-blue-500\" text=\"Optional dApp sponsorship, zero-cost transactions\" />\n <Benefit icon={ShieldCheck} color=\"text-purple-500\" text=\"Secure recovery mechanism, no fear of losing keys\" />\n </div>\n {onUpgrade && (\n <Button className=\"mt-4 w-full\" onClick={onUpgrade}>\n Upgrade Now\n {estimatedGas !== undefined && <span className=\"ml-1 text-xs opacity-80\">(Estimated gas fee: {formatGas(estimatedGas)})</span>}\n </Button>\n )}\n {onShowSettings && <>\n <div className=\"mt-4 mb-3 flex items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" /><span className=\"text-xs text-muted-foreground\">or</span><div className=\"h-px flex-1 bg-border\" />\n </div>\n {settingsBtn}\n </>}\n </Card>\n )\n}\n\nfunction Benefit({ icon: Icon, color, text }: { icon: React.ComponentType<{ size: number; className?: string }>; color: string; text: string }) {\n return (\n <div className=\"flex items-center gap-2.5 text-sm text-foreground/80\">\n <Icon size={14} className={`shrink-0 ${color}`} />\n <span>{text}</span>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useState, useCallback } from \"react\"\nimport { ArrowLeft, Save, Shield, Users, KeyRound, Fuel, Wrench, Plus, X } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\n\nexport type AccountType = \"simple\" | \"multi-sig\" | \"social-recovery\"\nexport type PaymasterType = \"self\" | \"sponsor\" | \"erc20\" | \"custom\"\nexport type BundlerPreset = \"pimlico\" | \"stackup\" | \"alchemy\" | \"custom\"\n\nexport interface SmartWalletConfig {\n accountType: AccountType\n paymasterType: PaymasterType\n customPaymasterUrl: string\n bundlerPreset: BundlerPreset\n customBundlerUrl: string\n guardians: string[]\n threshold: number\n}\n\nexport interface SmartWalletSettingsProps {\n currentConfig?: Partial<SmartWalletConfig>\n onSave?: (config: SmartWalletConfig) => void\n onBack?: () => void\n}\n\nconst ACCOUNT_TYPE_OPTIONS: Array<{\n value: AccountType; label: string; description: string; icon: React.ReactNode\n}> = [\n { value: \"simple\", label: \"Single Sign (default)\", description: \"Single key control, simple and secure\", icon: <Shield size={16} /> },\n { value: \"multi-sig\", label: \"Multi-Sign (2-of-3)\", description: \"Requires multiple signers to authorize transactions\", icon: <Users size={16} /> },\n { value: \"social-recovery\", label: \"Social Recovery\", description: \"Set guardian accounts to help recover\", icon: <KeyRound size={16} /> },\n]\n\nconst PAYMASTER_OPTIONS: Array<{ value: PaymasterType; label: string; description: string }> = [\n { value: \"self\", label: \"Pay Self (ETH)\", description: \"Pay gas fees with ETH\" },\n { value: \"sponsor\", label: \"Sponsored by dApp\", description: \"dApp covers your gas fees\" },\n { value: \"erc20\", label: \"Pay with USDC/USDT\", description: \"Use ERC-20 tokens for gas\" },\n { value: \"custom\", label: \"Custom Paymaster URL\", description: \"Use a custom paymaster service\" },\n]\n\nconst BUNDLER_OPTIONS: Array<{ value: BundlerPreset; label: string; description: string }> = [\n { value: \"pimlico\", label: \"Pimlico\", description: \"High-performance bundler service\" },\n { value: \"stackup\", label: \"Stackup\", description: \"Decentralized bundler network\" },\n { value: \"alchemy\", label: \"Alchemy\", description: \"Alchemy AA infrastructure\" },\n { value: \"custom\", label: \"Custom Bundler URL\", description: \"Use custom bundler endpoint\" },\n]\n\nfunction defaultConfig(): SmartWalletConfig {\n return {\n accountType: \"simple\", paymasterType: \"self\", customPaymasterUrl: \"\",\n bundlerPreset: \"pimlico\", customBundlerUrl: \"\",\n guardians: [], threshold: 2,\n }\n}\n\ntype ShadcnButton = React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string }>\ntype ShadcnInput = React.ComponentType<React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>\n\nexport function SmartWalletSettings({ currentConfig, onSave, onBack }: SmartWalletSettingsProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as ShadcnButton\n const Input = registry.Input as ShadcnInput\n const Card = registry.Card as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n const Separator = registry.Separator as React.ComponentType<React.HTMLAttributes<HTMLDivElement>>\n\n const [config, setConfig] = useState<SmartWalletConfig>({ ...defaultConfig(), ...currentConfig })\n const [newGuardian, setNewGuardian] = useState(\"\")\n const [saved, setSaved] = useState(false)\n\n const radioStyle = (active: boolean) =>\n cn(\"flex cursor-pointer items-center gap-3 rounded-lg border px-4 py-3 transition-all duration-200\",\n active ? \"border-primary bg-primary/5\" : \"border-border hover:bg-accent\")\n\n const sectionInputStyle =\n \"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground outline-none focus:border-ring focus:ring-2 focus:ring-ring focus:ring-offset-2 transition-all duration-200\"\n\n const handleSave = useCallback(() => {\n onSave?.(config)\n setSaved(true)\n setTimeout(() => setSaved(false), 2000)\n }, [config, onSave])\n\n const handleAddGuardian = useCallback(() => {\n const addr = newGuardian.trim()\n if (!addr || config.guardians.includes(addr)) return\n setConfig((prev) => ({ ...prev, guardians: [...prev.guardians, addr] }))\n setNewGuardian(\"\")\n }, [newGuardian, config.guardians])\n\n return (\n <Card className=\"w-full rounded-xl border border-border bg-card p-5 shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-5\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ArrowLeft size={15} />\n Back\n </Button>\n )}\n <h2 className=\"text-lg font-semibold text-foreground\">Smart Wallet Settings</h2>\n </div>\n </div>\n\n {/* Account Type */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Shield size={15} /> Verification Method\n </h3>\n <div className=\"space-y-2\">\n {ACCOUNT_TYPE_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.accountType === opt.value)}>\n <input type=\"radio\" name=\"accountType\" value={opt.value}\n checked={config.accountType === opt.value}\n onChange={() => setConfig((p) => ({ ...p, accountType: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex items-center gap-2 text-foreground\">{opt.icon}</div>\n <div>\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n </section>\n\n {/* Social Recovery */}\n {config.accountType === \"social-recovery\" && (\n <section className=\"mb-6 rounded-lg border border-border bg-muted/30 p-4\">\n <h4 className=\"mb-2 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <KeyRound size={14} /> Guardian Addresses\n </h4>\n <p className=\"mb-3 text-xs text-muted-foreground\">\n Set at least one guardian to help recover your wallet if you lose your key\n </p>\n {config.guardians.length > 0 && (\n <div className=\"mb-3 space-y-1.5\">\n {config.guardians.map((addr) => (\n <div key={addr} className=\"flex items-center justify-between rounded-md bg-card px-3 py-2 text-sm\">\n <span className=\"font-mono text-xs text-foreground\">\n {addr.slice(0, 8)}...{addr.slice(-6)}\n </span>\n <Button variant=\"ghost\" size=\"icon\"\n onClick={() => setConfig((p) => ({ ...p, guardians: p.guardians.filter((g) => g !== addr) }))}>\n <X size={14} />\n </Button>\n </div>\n ))}\n </div>\n )}\n <div className=\"flex gap-2\">\n <Input\n type=\"text\" placeholder=\"Enter guardian address (0x...)\" value={newGuardian}\n onChange={(e) => setNewGuardian(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") { e.preventDefault(); handleAddGuardian() } }}\n className=\"flex-1\"\n />\n <Button size=\"sm\" onClick={handleAddGuardian} disabled={!newGuardian.trim()}>\n <Plus size={14} /> Add\n </Button>\n </div>\n </section>\n )}\n\n {/* Multi-sig threshold */}\n {config.accountType === \"multi-sig\" && (\n <section className=\"mb-6 rounded-lg border border-border bg-muted/30 p-4\">\n <h4 className=\"mb-2 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Users size={14} /> Signing Threshold\n </h4>\n <p className=\"mb-3 text-xs text-muted-foreground\">\n Set how many signers are needed to authorize a transaction\n </p>\n <div className=\"flex items-center gap-3\">\n {[1, 2, 3].map((n) => (\n <label key={n} className={radioStyle(config.threshold === n)}>\n <input type=\"radio\" name=\"threshold\" value={n}\n checked={config.threshold === n}\n onChange={() => setConfig((p) => ({ ...p, threshold: n }))}\n className=\"sr-only\" />\n {n}-of-3\n </label>\n ))}\n </div>\n </section>\n )}\n\n <Separator className=\"my-4\" />\n\n {/* Gas / Paymaster */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Fuel size={15} /> Gas Fees\n </h3>\n <div className=\"space-y-2\">\n {PAYMASTER_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.paymasterType === opt.value)}>\n <input type=\"radio\" name=\"paymasterType\" value={opt.value}\n checked={config.paymasterType === opt.value}\n onChange={() => setConfig((p) => ({ ...p, paymasterType: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n {config.paymasterType === \"custom\" && (\n <div className=\"mt-3\">\n <input type=\"text\" placeholder=\"Custom Paymaster URL\" value={config.customPaymasterUrl}\n onChange={(e) => setConfig((p) => ({ ...p, customPaymasterUrl: e.target.value }))}\n className={sectionInputStyle} />\n </div>\n )}\n </section>\n\n <Separator className=\"my-4\" />\n\n {/* Bundler */}\n <section className=\"mb-6\">\n <h3 className=\"mb-3 flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Wrench size={15} /> Bundler\n </h3>\n <div className=\"space-y-2\">\n {BUNDLER_OPTIONS.map((opt) => (\n <label key={opt.value} className={radioStyle(config.bundlerPreset === opt.value)}>\n <input type=\"radio\" name=\"bundlerPreset\" value={opt.value}\n checked={config.bundlerPreset === opt.value}\n onChange={() => setConfig((p) => ({ ...p, bundlerPreset: opt.value }))}\n className=\"h-4 w-4 text-primary accent-primary\" />\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-foreground\">{opt.label}</div>\n <div className=\"text-xs text-muted-foreground\">{opt.description}</div>\n </div>\n </label>\n ))}\n </div>\n {config.bundlerPreset === \"custom\" && (\n <div className=\"mt-3\">\n <input type=\"text\" placeholder=\"Custom Bundler URL\" value={config.customBundlerUrl}\n onChange={(e) => setConfig((p) => ({ ...p, customBundlerUrl: e.target.value }))}\n className={sectionInputStyle} />\n </div>\n )}\n </section>\n\n {/* Actions */}\n <div className=\"flex items-center gap-3\">\n <Button className=\"flex-1\" onClick={handleSave}>\n <Save size={15} />\n {saved ? \"Saved ✓\" : \"Save Settings\"}\n </Button>\n {onBack && (\n <Button variant=\"outline\" onClick={onBack}>\n <ArrowLeft size={15} />\n ← Back to Simple Mode\n </Button>\n )}\n </div>\n </Card>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { AlertTriangle, CheckCircle, ShieldAlert, X } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport { useValidateDestination } from \"@naculus/connect-appkit-react\"\nimport type { AddressValidationLevel } from \"@naculus/connect-appkit-react\"\n\nexport interface AddressWarningDialogProps {\n address: string\n open: boolean\n onClose: () => void\n onProceed?: () => void\n}\n\nconst LEVEL_CONFIG: Record<\n AddressValidationLevel,\n { icon: React.ReactNode; label: string; colorClass: string; bgClass: string; buttonVariant: string }\n> = {\n ok: {\n icon: <CheckCircle size={20} />,\n // Not \"Safe\". The checks behind this are syntactic: non-empty, correctly\n // formed, not the zero or a burn address. They say nothing about whether\n // the recipient is who the user believes, and a green \"Safe\" beside an\n // address-poisoning lookalike is worse than no badge at all.\n label: \"No problem found\",\n colorClass: \"text-muted-foreground\",\n bgClass: \"bg-muted\",\n buttonVariant: \"default\",\n },\n warning: {\n icon: <AlertTriangle size={20} />,\n label: \"Warning\",\n colorClass: \"text-[hsl(var(--warning,38_92%_50%))]\",\n bgClass: \"bg-[hsl(var(--warning)/0.1)]\",\n buttonVariant: \"default\",\n },\n blocked: {\n icon: <ShieldAlert size={20} />,\n label: \"Blocked\",\n colorClass: \"text-destructive\",\n bgClass: \"bg-destructive/10\",\n buttonVariant: \"destructive\",\n },\n}\n\nexport function AddressWarningDialog({\n address,\n open,\n onClose,\n onProceed,\n}: AddressWarningDialogProps) {\n const registry = useComponentRegistry()\n const Button = registry.Button as React.ComponentType<React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: string; size?: string; disabled?: boolean; className?: string; children?: React.ReactNode }> | undefined\n const Dialog = registry.Dialog as React.ComponentType<{ open: boolean; onOpenChange?: (v: boolean) => void; children?: React.ReactNode }> | undefined\n const DialogContent = registry.DialogContent as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n const DialogHeader = registry.DialogHeader as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n const DialogTitle = registry.DialogTitle as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n\n const { validation } = useValidateDestination({ address })\n const { level, warning } = validation\n const config = LEVEL_CONFIG[level]\n const isBlocked = level === \"blocked\"\n\n const shortAddress = address.length > 12\n ? `${address.slice(0, 6)}...${address.slice(-4)}`\n : address\n\n const buttonClass = (variant: string) =>\n cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-lg\",\n \"text-sm font-medium transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"h-10 px-4 py-2\",\n variant === \"outline\" && \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n variant === \"destructive\" && \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm\",\n variant === \"default\" && \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\n )\n\n const body = (\n <div className=\"flex flex-col gap-4\">\n <div className={cn(\"flex items-center gap-3 rounded-lg p-4\", config.bgClass)}>\n <span className={config.colorClass}>{config.icon}</span>\n <div className=\"flex flex-col gap-0.5\">\n <span className={cn(\"text-sm font-semibold\", config.colorClass)}>\n {config.label}\n </span>\n <span className=\"text-xs text-muted-foreground break-all font-mono\">\n {shortAddress}\n </span>\n </div>\n </div>\n\n {warning && (\n <p className=\"text-sm text-muted-foreground m-0\">{warning}</p>\n )}\n\n <div className=\"flex gap-2 justify-end pt-2\">\n {Button ? (\n <Button\n onClick={onClose}\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n >\n Cancel\n </Button>\n ) : (\n <button type=\"button\" onClick={onClose} className={cn(buttonClass(\"outline\"), \"w-full sm:w-auto\")}>\n Cancel\n </button>\n )}\n {onProceed && (Button ? (\n <Button\n onClick={onProceed}\n variant={isBlocked ? \"destructive\" : \"default\"}\n disabled={isBlocked}\n className=\"w-full sm:w-auto\"\n >\n Proceed anyway\n </Button>\n ) : (\n <button\n type=\"button\"\n onClick={onProceed}\n disabled={isBlocked}\n className={cn(buttonClass(isBlocked ? \"destructive\" : \"default\"), \"w-full sm:w-auto\")}\n >\n Proceed anyway\n </button>\n ))}\n </div>\n </div>\n )\n\n if (Dialog && DialogContent && DialogHeader && DialogTitle) {\n return (\n <Dialog open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Address Warning</DialogTitle>\n </DialogHeader>\n {body}\n </DialogContent>\n </Dialog>\n )\n }\n\n if (!open) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div className=\"absolute inset-0 bg-black/80\" aria-hidden=\"true\" onClick={onClose} />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className=\"relative z-10 w-full max-w-sm rounded-xl border bg-card text-card-foreground shadow-2xl p-6\"\n >\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold m-0\">Address Warning</h2>\n <button\n onClick={onClose}\n type=\"button\"\n className=\"rounded-md p-1 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n {body}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { Wallet, AlertCircle } from \"lucide-react\"\nimport { cn } from \"../lib/cn\"\nimport { useComponentRegistry } from \"../contexts/ComponentRegistry\"\nimport type { DiscoveredWallet } from \"../hooks/useEIP6963\"\n\nexport interface WalletPickerProps {\n wallets: DiscoveredWallet[]\n onSelect: (wallet: DiscoveredWallet) => void\n loading?: boolean\n error?: string | null\n}\n\nexport function WalletPicker({\n wallets,\n onSelect,\n loading = false,\n error = null,\n}: WalletPickerProps) {\n const registry = useComponentRegistry()\n const Card = registry.Card as React.ComponentType<{ className?: string; children?: React.ReactNode }> | undefined\n\n const wrapper = (children: React.ReactNode) =>\n Card ? (\n <Card className=\"p-4\">{children}</Card>\n ) : (\n <div className=\"rounded-xl border bg-card text-card-foreground shadow-sm p-4\">{children}</div>\n )\n\n if (loading) {\n return wrapper(\n <div className=\"flex flex-col gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 p-3 rounded-lg animate-pulse\">\n <div className=\"h-10 w-10 rounded-full bg-muted\" />\n <div className=\"h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n <p className=\"text-xs text-muted-foreground text-center m-0\">Detecting wallets...</p>\n </div>\n )\n }\n\n if (error) {\n return wrapper(\n <div className=\"flex flex-col items-center gap-3 py-4\">\n <AlertCircle size={24} className=\"text-destructive\" />\n <p className=\"text-sm text-destructive m-0 font-medium\">{error}</p>\n </div>\n )\n }\n\n if (wallets.length === 0) {\n return wrapper(\n <div className=\"flex flex-col items-center gap-3 py-6\">\n <Wallet size={32} className=\"text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground m-0 text-center\">\n No wallets detected.\n <br />\n Install a browser wallet extension to get started.\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {wallets.map((wallet) => (\n <button\n key={wallet.id}\n type=\"button\"\n onClick={() => onSelect(wallet)}\n className={cn(\n \"flex items-center gap-3 w-full p-3 rounded-lg\",\n \"border border-input bg-card hover:bg-accent hover:text-accent-foreground\",\n \"transition-all duration-200 cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n )}\n >\n {wallet.icon ? (\n <img\n src={wallet.icon}\n alt={wallet.name}\n className=\"h-10 w-10 rounded-full object-cover shrink-0\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\"\n }}\n />\n ) : (\n <div className=\"h-10 w-10 rounded-full bg-muted flex items-center justify-center shrink-0\">\n <Wallet size={18} className=\"text-muted-foreground\" />\n </div>\n )}\n <div className=\"flex flex-col items-start gap-0.5 text-left min-w-0\">\n <span className=\"text-sm font-medium truncate w-full\">{wallet.name}</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">{wallet.rdns}</span>\n </div>\n </button>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":["require_can_promise","__commonJSMin","exports","module","require_utils","__commonJSMin","exports","toSJISFunction","CODEWORDS_COUNT","version","data","digit","f","kanji","require_error_correction_level","__commonJSMin","exports","fromString","string","level","value","defaultValue","require_bit_buffer","__commonJSMin","exports","module","BitBuffer","index","bufIndex","num","length","i","bit","require_bit_matrix","__commonJSMin","exports","module","BitMatrix","size","row","col","value","reserved","index","require_alignment_pattern","__commonJSMin","exports","getSymbolSize","version","posCount","size","intervals","positions","i","coords","pos","posLength","j","require_finder_pattern","__commonJSMin","exports","getSymbolSize","FINDER_PATTERN_SIZE","version","size","require_mask_pattern","__commonJSMin","exports","PenaltyScores","mask","value","data","size","points","sameCountCol","sameCountRow","lastCol","lastRow","row","col","module","last","bitsCol","bitsRow","darkCount","modulesCount","i","getMaskAt","maskPattern","j","pattern","setupFormatFunc","numPatterns","bestPattern","lowerPenalty","p","penalty","require_error_correction_code","__commonJSMin","exports","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","version","errorCorrectionLevel","require_galois_field","__commonJSMin","exports","EXP_TABLE","LOG_TABLE","x","i","n","y","require_polynomial","__commonJSMin","exports","GF","p1","p2","coeff","i","j","divident","divisor","result","offset","degree","poly","require_reed_solomon_encoder","__commonJSMin","exports","module","Polynomial","ReedSolomonEncoder","degree","data","paddedData","remainder","start","buff","require_version_check","__commonJSMin","exports","version","require_regex","__commonJSMin","exports","numeric","alphanumeric","kanji","byte","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","str","require_mode","__commonJSMin","exports","VersionCheck","Regex","mode","version","dataStr","fromString","string","value","defaultValue","require_version","__commonJSMin","exports","Utils","ECCode","ECLevel","Mode","VersionCheck","G18","G18_BCH","getBestVersionForDataLength","mode","length","errorCorrectionLevel","currentVersion","getReservedBitsCount","version","getTotalBitsFromDataArray","segments","totalBits","data","reservedBits","getBestVersionForMixedData","value","defaultValue","totalCodewords","ecTotalCodewords","dataTotalCodewordsBits","usableBits","seg","ecl","d","require_format_info","__commonJSMin","exports","Utils","G15","G15_MASK","G15_BCH","errorCorrectionLevel","mask","data","d","require_numeric_data","__commonJSMin","exports","module","Mode","NumericData","data","length","bitBuffer","i","group","value","remainingNum","require_alphanumeric_data","__commonJSMin","exports","module","Mode","ALPHA_NUM_CHARS","AlphanumericData","data","length","bitBuffer","i","value","require_byte_data","__commonJSMin","exports","module","Mode","ByteData","data","length","bitBuffer","i","l","require_kanji_data","__commonJSMin","exports","module","Mode","Utils","KanjiData","data","length","bitBuffer","i","value","require_dijkstra","__commonJSMin","exports","module","dijkstra","graph","s","d","predecessors","costs","open","closest","u","v","cost_of_s_to_u","adjacent_nodes","cost_of_e","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","first_visit","msg","nodes","predecessor","opts","T","t","key","a","b","value","cost","item","require_segments","__commonJSMin","exports","Mode","NumericData","AlphanumericData","ByteData","KanjiData","Regex","Utils","dijkstra","getStringByteLength","str","getSegments","regex","mode","segments","result","getSegmentsFromString","dataStr","numSegs","alphaNumSegs","byteSegs","kanjiSegs","s1","s2","obj","getSegmentBitsLength","length","mergeSegments","segs","acc","curr","prevSeg","buildNodes","nodes","i","seg","buildGraph","version","table","graph","prevNodeIds","nodeGroup","currentNodeIds","j","node","key","n","prevNodeId","buildSingleSegment","data","modesHint","bestMode","array","path","optimizedSegs","require_qrcode","__commonJSMin","exports","Utils","ECLevel","BitBuffer","BitMatrix","AlignmentPattern","FinderPattern","MaskPattern","ECCode","ReedSolomonEncoder","Version","FormatInfo","Mode","Segments","setupFinderPattern","matrix","version","size","pos","i","row","col","r","c","setupTimingPattern","value","setupAlignmentPattern","setupVersionInfo","bits","mod","setupFormatInfo","errorCorrectionLevel","maskPattern","setupData","data","inc","bitIndex","byteIndex","dark","createData","segments","buffer","totalCodewords","ecTotalCodewords","dataTotalCodewordsBits","remainingByte","createCodewords","bitBuffer","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","offset","dcData","ecData","maxDataSize","b","dataSize","index","createSymbol","estimatedVersion","rawSegments","bestVersion","dataBits","moduleCount","modules","options","mask","require_utils","__commonJSMin","exports","hex2rgba","hex","hexCode","c","hexValue","options","margin","width","scale","qrSize","opts","imgData","qr","size","data","symbolSize","scaledMargin","palette","i","j","posDst","pxColor","iSrc","jSrc","require_canvas","__commonJSMin","exports","Utils","clearCanvas","ctx","canvas","size","getCanvasElement","qrData","options","opts","canvasEl","image","type","rendererOpts","require_svg_tag","__commonJSMin","exports","Utils","getColorAttrib","color","attrib","alpha","str","svgCmd","cmd","x","y","qrToPath","data","size","margin","path","moveBy","newRow","lineLength","col","row","qrData","options","cb","opts","qrcodesize","bg","viewBox","svgTag","require_browser","__commonJSMin","exports","canPromise","QRCode","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","canvas","text","opts","cb","args","argsNum","isLastArgCb","resolve","reject","data","e","_","index_exports","__export","AccountButton","AccountSelector","AccountSelectorView","AddressWarningDialog","AppKit","AppKitButton","AppKitChainSelector","ChainSelector","ConnectButtonAdapter","ErrorBoundary","PasskeySetup","PasskeySetupView","PassphraseDialog","PassphraseDialogView","QRCodeModal","RouteSelector","SeedPhraseBackup","SignInButton","SmartWalletSettings","SmartWalletToggle","ThemeProvider","WalletConnectProvider","WalletPicker","WalletSecurityPanel","WalletSecurityPanelView","Web3ComponentProvider","Web3ConnectUI","cn","useAppKit","useComponent","useComponentRegistry","useDetectionMode","useEIP6963","useIsMobile","useTheme","useThemeVariable","useWalletConnect","useWalletConnectOptional","__toCommonJS","import_react","import_connect_appkit_react","import_react","import_connect_appkit_react","import_jsx_runtime","WalletConnectContext","WalletConnectProvider","children","web3","qrUri","setQrUri","showQR","setShowQR","qrStatus","setQrStatus","error","setError","attemptRef","settleTimerRef","cancelQR","connectRef","attempt","isCurrent","uri","err","connectWalletConnect","retryQR","state","value","useWalletConnect","context","useWalletConnectOptional","import_react","useEIP6963","wallets","setWallets","isDetecting","setIsDetecting","seenRef","handleAnnounce","e","detail","info","provider","prev","w","timer","import_react","useIsMobile","mobile","setMobile","ua","import_jsx_runtime","ConnectButtonAdapter","className","extConnected","extConnecting","onConnect","onDisconnect","onMobileDeepLink","mobileWalletName","startPairing","completePairing","address","balance","balanceSymbol","tokenBalances","isBalanceLoading","explorerUrl","explorerLabel","wcCtx","useWalletConnectOptional","wallets","useEIP6963","isMobile","useIsMobile","walletsJson","id","name","icon","rdns","qrUri","setQrUri","qrLoading","setQrLoading","qrError","setQrError","pairingRef","cancelPairing","qrStatus","ctxUri","ctxErr","emitConnect","kind","walletId","uri","err","e","import_connect_core","import_react","import_connect_appkit_react","import_clsx","import_tailwind_merge","cn","inputs","ETH_LOGO","POLYGON_LOGO","BSC_LOGO","ARBITRUM_LOGO","OPTIMISM_LOGO","AVALANCHE_LOGO","FANTOM_LOGO","CHAIN_LOGOS","getChainLogo","chainId","import_react","import_lucide_react","import_jsx_runtime","DefaultAvatar","children","AccountButton","className","showAddress","showBalance","externalAddress","externalBalance","balanceSymbol","onConnect","Button","useComponentRegistry","address","shortAddress","formattedBalance","import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","DefaultDialog","open","onClose","children","closable","className","prev","handler","e","cn","DefaultDialogHeader","title","showCloseButton","DefaultDialogContent","import_jsx_runtime","renderQR","canvas","uri","loaded","toCanvas","resolve","reject","err","QRCodeModal","open","onClose","onDeepLink","onRetry","status","explicitShowDeepLink","timeoutMs","title","description","className","canvasRef","qrError","setQrError","timeElapsed","setTimeElapsed","isMobile","useIsMobile","registry","useComponentRegistry","Button","showDeepLink","timerRef","error","start","isExpired","needsNewCode","remaining","minutes","seconds","progress","handleDeepLink","qrContent","ModalToUse","DefaultDialog","import_react","import_lucide_react","import_jsx_runtime","SignInButton","className","isSignedIn","isSigningIn","result","error","onSignIn","onClearError","children","showDetails","setShowDetails","copiedSign","setCopiedSign","copyFailed","setCopyFailed","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","handleCopySignature","prev","open","SignInDetails","onClose","onCopy","msg","signature","shortSig","import_react","import_lucide_react","import_jsx_runtime","randomIndex","max","limit","buf","value","shuffleArray","arr","a","i","j","buildConfirmWords","phrase","count","words","_","idx","correct","others","distractors","options","SeedPhraseBackup","seedPhrase","onConfirm","onSkip","onExportPrivateKey","className","wordCount","inline","open","onOpenChange","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","step","setStep","revealed","setRevealed","copied","setCopied","copyFailed","setCopyFailed","confirmWords","setConfirmWords","selectedWords","setSelectedWords","confirmErrors","setConfirmErrors","showExportKey","setShowExportKey","exportedKey","setExportedKey","wordItems","occurrences","word","occurrence","detectedWordCount","handleReveal","handleCopy","handleStartConfirm","handleSelectWord","wordIndex","prev","handleVerify","errors","cw","handleSkip","handleExportKey","key","allConfirmedSelected","revealContent","confirmContent","hasError","cn","opt","isSelected","steps","titles","body","title","o","DefaultDialog","import_react","import_jsx_runtime","DefaultErrorFallback","error","reset","dismiss","retryLabel","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","isOpen","onClose","DefaultDialog","DefaultDialogHeader","DefaultDialogContent","ErrorBoundary","React","props","errorInfo","prev","import_react","import_connect_appkit_react","import_react","THEME_CONTRACT","cache","clearCSSVariableCache","cache","import_jsx_runtime","ThemeContext","generateCSS","theme","rules","key","value","cssVar","THEME_CONTRACT","getDefinedVars","priority","defined","existing","ThemeProvider","children","defaultDark","customTheme","setCustomTheme","isDark","setIsDark","clearCSSVariableCache","devDefined","setDevDefined","effectiveTheme","filtered","cssString","root","styleId","toggleDarkMode","prev","useTheme","useThemeVariable","name","setValue","customValue","cssValue","import_jsx_runtime","DetectionContext","useDetectionMode","Web3ConnectUI","config","children","autoConnect","detectionMode","theme","defaultDark","themePriority","detectionCtx","needsWalletConnect","ThemeProvider","Web3ComponentProvider","QRCodeModal","WalletConnectProvider","import_jsx_runtime","DefaultButton","className","variant","size","props","classes","DEFAULT_COMPONENTS","ConnectButtonAdapter","AccountButton","ChainSelector","QRCodeModal","SignInButton","SeedPhraseBackup","ErrorBoundary","Web3ConnectUI","ComponentRegistryContext","Web3ComponentProvider","children","components","value","useComponentRegistry","useComponent","name","import_jsx_runtime","logSwitchFailure","error","details","causeMessage","ChainLogo","chainId","className","svgStr","getChainLogo","cn","ChainSelector","showLabel","variant","currentChain","availableChains","switchChain","isEvm","isConnected","isOpen","setIsOpen","RegistryButton","useComponentRegistry","dropdownRef","handleClickOutside","e","chainName","hasMultipleChains","chain","isActive","import_connect_appkit_react","import_lucide_react","import_react","import_jsx_runtime","NAMESPACE_LABEL","shortAddress","address","AccountRow","account","isActive","onSelect","copied","setCopied","label","copy","e","write","event","cn","AccountSelectorView","className","hideBackfill","accounts","activeNamespace","canDerive","setActiveNamespace","backfillAccounts","busy","setBusy","error","setError","handleSelect","namespace","handleBackfill","canBackfill","AccountSelector","props","wallet","import_lucide_react","import_connect_appkit_react","import_jsx_runtime","SEVERITY_ICON","SEVERITY_CLASS","scoreTone","score","FindingRow","finding","Icon","cn","WalletSecurityPanelView","className","hideInformational","securityReport","level","findings","encrypted","backend","unlock","shown","f","perfect","WalletSecurityPanel","props","import_react","import_lucide_react","import_connect_appkit_react","import_jsx_runtime","MIN_LENGTH","SHORT_LENGTH","PassphraseDialogView","className","request","submit","cancel","value","setValue","confirm","setConfirm","visible","setVisible","inputRef","isCreate","tooShort","mismatch","canSubmit","handleSubmit","e","cn","PassphraseDialog","props","import_react","import_lucide_react","import_connect_appkit_react","import_jsx_runtime","PasskeySetupView","className","passkeys","unlock","onRegistered","busy","setBusy","error","setError","justRegistered","setJustRegistered","hasCredential","register","e","sealed","status","TONE_CLASS","cn","PasskeySetup","props","client","securityReport","hasWallet","embedded","import_connect_appkit_react","import_react","import_jsx_runtime","AppKitContext","useAppKit","ctx","AppKit","projectId","metadata","enableEmbedded","enablePasskeys","chains","embeddedConfig","encryptionKey","siwx","children","className","autoConnect","theme","defaultDark","themePriority","detectionMode","open","setOpen","backupOpen","setBackupOpen","config","Web3ConnectUI","AppKitInner","isConnected","isConnecting","primaryAccount","currentChain","availableChains","switchChain","embedded","disconnect","wallets","hasWallets","useEIP6963","balanceRaw","balance","handleDisconnect","handleConfirmBackup","handleSkipBackup","handleExportPrivateKey","value","c","SeedPhraseBackup","AppKitButton","connectInjected","handleConnect","walletKind","closeModal","walletId","cn","ChainSelector","ConnectButtonAdapter","AppKitChainSelector","variant","defaults","DEFAULT_COMPONENTS","import_lucide_react","import_jsx_runtime","formatTime","ms","min","sec","formatSymbol","token","getProviderBadgeVariant","provider","p","formatTxHash","txHash","RouteCard","route","onSelect","registry","useComponentRegistry","Button","Badge","providerName","formatTime","max","_step","baseTime","LoadingSkeleton","Skeleton","i","EmptyState","ErrorState","error","onRetry","ExecutionProgress","Progress","SuccessState","ChainLogo","chainId","className","svgStr","getChainLogo","cn","RouteSelector","inputToken","outputToken","amount","routes","loading","executing","onRouteSelected","onCancel","successTxHash","Card","renderHeader","renderBody","renderFooter","idx","import_react","import_lucide_react","import_jsx_runtime","formatGas","gas","eth","SmartWalletToggle","isDeployed","isDeploying","estimatedGas","error","onUpgrade","onShowSettings","onRetry","registry","useComponentRegistry","Button","Card","Badge","settingsBtn","Icon","label","val","i","React","Benefit","color","text","import_react","import_lucide_react","import_jsx_runtime","ACCOUNT_TYPE_OPTIONS","PAYMASTER_OPTIONS","BUNDLER_OPTIONS","defaultConfig","SmartWalletSettings","currentConfig","onSave","onBack","registry","useComponentRegistry","Button","Input","Card","Separator","config","setConfig","newGuardian","setNewGuardian","saved","setSaved","radioStyle","active","cn","sectionInputStyle","handleSave","handleAddGuardian","addr","prev","opt","p","g","e","n","import_lucide_react","import_connect_appkit_react","import_jsx_runtime","LEVEL_CONFIG","AddressWarningDialog","address","open","onClose","onProceed","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","validation","level","warning","config","isBlocked","shortAddress","buttonClass","variant","cn","body","v","import_lucide_react","import_jsx_runtime","WalletPicker","wallets","onSelect","loading","error","Card","useComponentRegistry","wrapper","children","_","i","wallet","cn","e"]}
|