@naculus/connect-appkit-ui 0.1.2
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/LICENSE +21 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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":["\"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":["useState","useEffect","useCallback","useRef","AppkitConnectButton","createContext","useContext","useState","useCallback","useMemo","useRef","useWeb3","jsx","WalletConnectContext","WalletConnectProvider","children","web3","qrUri","setQrUri","showQR","setShowQR","qrStatus","setQrStatus","error","setError","cancelQR","connectRef","uri","err","connectWalletConnect","retryQR","state","value","useWalletConnect","context","useWalletConnectOptional","useState","useEffect","useRef","useEIP6963","wallets","setWallets","isDetecting","setIsDetecting","seenRef","handleAnnounce","e","detail","info","provider","prev","w","timer","useState","useEffect","useIsMobile","mobile","setMobile","ua","jsx","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","useState","qrLoading","setQrLoading","qrError","setQrError","pairingRef","useRef","useEffect","qrStatus","ctxUri","ctxErr","emitConnect","useCallback","kind","walletId","uri","err","AppkitConnectButton","e","logger","useState","useRef","useEffect","useChain","useWallet","clsx","twMerge","cn","inputs","ETH_LOGO","POLYGON_LOGO","BSC_LOGO","ARBITRUM_LOGO","OPTIMISM_LOGO","AVALANCHE_LOGO","FANTOM_LOGO","CHAIN_LOGOS","getChainLogo","chainId","createContext","useContext","useMemo","Wallet","jsx","jsxs","DefaultAvatar","children","AccountButton","className","showAddress","showBalance","externalAddress","externalBalance","balanceSymbol","onConnect","Button","useComponentRegistry","Wallet","address","shortAddress","formattedBalance","useRef","useEffect","useState","useCallback","Smartphone","RefreshCw","CheckCircle2","AlertCircle","Loader2","useEffect","X","jsx","jsxs","DefaultDialog","open","onClose","children","closable","useEffect","prev","handler","e","jsxs","jsx","DefaultDialogHeader","title","showCloseButton","X","DefaultDialogContent","className","cn","jsx","jsxs","renderQR","canvas","uri","qrcode","resolve","reject","err","QRCodeModal","open","onClose","onDeepLink","onRetry","status","explicitShowDeepLink","timeoutMs","title","description","className","canvasRef","useRef","qrError","setQrError","useState","timeElapsed","setTimeElapsed","isMobile","useIsMobile","registry","useComponentRegistry","Button","showDeepLink","timerRef","useEffect","start","isExpired","needsNewCode","remaining","minutes","seconds","progress","handleDeepLink","useCallback","qrContent","AlertCircle","CheckCircle2","ModalToUse","DefaultDialog","Loader2","Smartphone","RefreshCw","useState","LogIn","Loader2","CheckCircle2","AlertCircle","X","Copy","Check","Fragment","jsx","jsxs","SignInButton","className","isSignedIn","isSigningIn","result","error","onSignIn","onClearError","children","showDetails","setShowDetails","useState","copiedSign","setCopiedSign","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","handleCopySignature","LogIn","Loader2","AlertCircle","prev","CheckCircle2","open","SignInDetails","onClose","onCopy","msg","signature","shortSig","X","Check","Copy","useState","useCallback","useMemo","AlertTriangle","Check","Copy","Download","Eye","EyeOff","SkipForward","ArrowLeft","ArrowRight","Shield","X","Fragment","jsx","jsxs","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","useState","revealed","setRevealed","copied","setCopied","confirmWords","setConfirmWords","selectedWords","setSelectedWords","confirmErrors","setConfirmErrors","showExportKey","setShowExportKey","exportedKey","setExportedKey","useMemo","detectedWordCount","handleReveal","useCallback","handleCopy","handleStartConfirm","handleSelectWord","wordIndex","word","prev","handleVerify","errors","cw","handleSkip","handleExportKey","key","allConfirmedSelected","revealContent","AlertTriangle","Check","Copy","Download","EyeOff","ArrowRight","SkipForward","Shield","Eye","confirmContent","hasError","cn","opt","isSelected","ArrowLeft","steps","titles","body","title","o","DefaultDialog","X","React","Fragment","jsx","jsxs","DefaultErrorFallback","error","reset","dismiss","retryLabel","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","isOpen","onClose","DefaultDialog","DefaultDialogHeader","DefaultDialogContent","ErrorBoundary","React","props","errorInfo","prev","createContext","useContext","useMemo","useState","useCallback","useEffect","useAccount","useWallet","useChain","useEmbeddedWallet","useDisconnect","useBalance","createContext","useContext","useMemo","Web3ConnectProvider","createContext","useContext","useMemo","useEffect","useCallback","useState","THEME_CONTRACT","cache","clearCSSVariableCache","cache","jsx","jsxs","ThemeContext","createContext","generateCSS","theme","rules","key","value","cssVar","THEME_CONTRACT","getDefinedVars","priority","defined","existing","ThemeProvider","children","defaultDark","customTheme","setCustomTheme","useState","isDark","setIsDark","useEffect","clearCSSVariableCache","devDefined","setDevDefined","effectiveTheme","useMemo","filtered","cssString","root","styleId","toggleDarkMode","useCallback","prev","useTheme","useContext","useThemeVariable","name","setValue","customValue","cssValue","jsx","DetectionContext","createContext","useDetectionMode","useContext","Web3ConnectUI","config","children","autoConnect","detectionMode","theme","defaultDark","themePriority","detectionCtx","useMemo","needsWalletConnect","ThemeProvider","Web3ComponentProvider","QRCodeModal","Web3ConnectProvider","WalletConnectProvider","jsx","jsxs","AppKitContext","createContext","useAppKit","ctx","useContext","AppKit","projectId","metadata","enableEmbedded","enablePasskeys","children","className","autoConnect","theme","defaultDark","themePriority","detectionMode","open","setOpen","useState","backupOpen","setBackupOpen","config","useMemo","Web3ConnectUI","AppKitInner","isConnected","isConnecting","useWallet","primaryAccount","useAccount","currentChain","availableChains","switchChain","useChain","embedded","useEmbeddedWallet","disconnect","useDisconnect","wallets","hasWallets","useEIP6963","balanceRaw","useBalance","balance","handleDisconnect","useCallback","handleConfirmBackup","handleSkipBackup","handleExportPrivateKey","value","c","useEffect","SeedPhraseBackup","AppKitButton","cn","ChainSelector","ConnectButtonAdapter","AppKitChainSelector","variant","jsx","DEFAULT_COMPONENTS","ConnectButtonAdapter","AccountButton","ChainSelector","QRCodeModal","SignInButton","SeedPhraseBackup","ErrorBoundary","AppKit","AppKitButton","AppKitChainSelector","Web3ConnectUI","ComponentRegistryContext","createContext","Web3ComponentProvider","children","components","value","useMemo","useComponentRegistry","useContext","useComponent","name","jsx","jsxs","ChainLogo","chainId","className","svgStr","getChainLogo","cn","ChainSelector","showLabel","variant","currentChain","availableChains","switchChain","isEvm","useChain","isConnected","useWallet","isOpen","setIsOpen","useState","RegistryButton","useComponentRegistry","dropdownRef","useRef","useEffect","handleClickOutside","e","chainName","hasMultipleChains","chain","isActive","logger","ArrowRight","CheckCircle2","Clock","DollarSign","Loader2","XCircle","AlertCircle","Fragment","jsx","jsxs","formatTime","ms","min","sec","formatSymbol","token","getProviderBadgeVariant","provider","p","formatTxHash","txHash","RouteCard","route","onSelect","registry","useComponentRegistry","Button","Badge","providerName","jsxs","jsx","DollarSign","Clock","formatTime","max","_step","baseTime","LoadingSkeleton","Skeleton","Loader2","i","Fragment","EmptyState","AlertCircle","ErrorState","error","onRetry","XCircle","ExecutionProgress","Progress","SuccessState","CheckCircle2","ChainLogo","chainId","className","svgStr","getChainLogo","cn","RouteSelector","inputToken","outputToken","amount","routes","loading","executing","onRouteSelected","onCancel","successTxHash","Card","renderHeader","renderBody","renderFooter","ArrowRight","idx","React","Shield","ShieldCheck","LoaderCircle","Settings","ChevronRight","AlertCircle","RotateCcw","CheckCircle2","Fuel","Zap","RefreshCw","Fragment","jsx","jsxs","formatGas","gas","eth","SmartWalletToggle","isDeployed","isDeploying","estimatedGas","error","onUpgrade","onShowSettings","onRetry","registry","useComponentRegistry","Button","Card","Badge","settingsBtn","Settings","ChevronRight","ShieldCheck","CheckCircle2","Fuel","RefreshCw","Icon","label","val","i","React","LoaderCircle","AlertCircle","RotateCcw","Shield","Benefit","Zap","color","text","useState","useCallback","ArrowLeft","Save","Shield","Users","KeyRound","Fuel","Wrench","Plus","X","jsx","jsxs","ACCOUNT_TYPE_OPTIONS","Shield","Users","KeyRound","PAYMASTER_OPTIONS","BUNDLER_OPTIONS","defaultConfig","SmartWalletSettings","currentConfig","onSave","onBack","registry","useComponentRegistry","Button","Input","Card","Separator","config","setConfig","useState","newGuardian","setNewGuardian","saved","setSaved","radioStyle","active","cn","sectionInputStyle","handleSave","useCallback","handleAddGuardian","addr","prev","ArrowLeft","opt","p","g","X","e","Plus","n","Fuel","Wrench","Save","AlertTriangle","CheckCircle","ShieldAlert","X","useValidateDestination","jsx","jsxs","LEVEL_CONFIG","CheckCircle","AlertTriangle","ShieldAlert","AddressWarningDialog","address","open","onClose","onProceed","registry","useComponentRegistry","Button","Dialog","DialogContent","DialogHeader","DialogTitle","validation","level","warning","config","isBlocked","shortAddress","buttonClass","variant","cn","body","v","X","Wallet","AlertCircle","jsx","jsxs","WalletPicker","wallets","onSelect","loading","error","Card","useComponentRegistry","wrapper","children","_","AlertCircle","Wallet","wallet","cn","e"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@naculus/connect-appkit-ui",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./styles": {
|
|
13
|
+
"default": "./dist/styles/index.css"
|
|
14
|
+
},
|
|
15
|
+
"./styles/utilities": {
|
|
16
|
+
"default": "./dist/styles/utilities.css"
|
|
17
|
+
},
|
|
18
|
+
"./styles/tokens": {
|
|
19
|
+
"default": "./dist/styles/tokens.css"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@radix-ui/react-alert-dialog": "^1.1.23",
|
|
27
|
+
"@radix-ui/react-dialog": "^1.1.18",
|
|
28
|
+
"@radix-ui/react-dropdown-menu": "^2.1.20",
|
|
29
|
+
"@radix-ui/react-popover": "^1.1.19",
|
|
30
|
+
"@radix-ui/react-select": "^2.3.3",
|
|
31
|
+
"@radix-ui/react-slot": "^1.3.0",
|
|
32
|
+
"@radix-ui/react-tooltip": "^1.2.12",
|
|
33
|
+
"class-variance-authority": "^0.7.1",
|
|
34
|
+
"clsx": "^2.1.0",
|
|
35
|
+
"lucide-react": "^0.545.0",
|
|
36
|
+
"qrcode": "^1.5.4",
|
|
37
|
+
"tailwind-merge": "^3.0.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@naculus/connect-appkit-react": "^0.1.2",
|
|
41
|
+
"@naculus/connect-core": "^0.1.2",
|
|
42
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
43
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@naculus/connect-core": "^0.1.2",
|
|
47
|
+
"@types/qrcode": "^1.5.6",
|
|
48
|
+
"@types/react": "^19.0.0",
|
|
49
|
+
"@types/react-dom": "^19.0.0",
|
|
50
|
+
"react": "^19.0.0",
|
|
51
|
+
"react-dom": "^19.0.0",
|
|
52
|
+
"tsup": "^8.3.6",
|
|
53
|
+
"typescript": "^5.9.3",
|
|
54
|
+
"@naculus/connect-appkit-react": "0.1.2"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public",
|
|
58
|
+
"registry": "https://registry.npmjs.org"
|
|
59
|
+
},
|
|
60
|
+
"sideEffects": false,
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsup",
|
|
63
|
+
"clean": "rm -rf dist",
|
|
64
|
+
"test:run": "vitest run",
|
|
65
|
+
"typecheck": "tsc --noEmit"
|
|
66
|
+
}
|
|
67
|
+
}
|