accesly 0.1.0 → 0.1.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AcceslyClient.ts","../src/auth.ts","../src/AcceslyProvider.tsx","../src/hooks/useAccesly.ts","../src/components/ConnectModal.tsx","../src/components/WalletPanel.tsx","../src/components/ConnectButton.tsx","../src/index.ts"],"names":["STORAGE_KEY","DEFAULT_BASE_URL","AcceslyClient","appId","baseUrl","tokens","raw","path","options","retry","headers","res","data","refreshToken","params","limit","openAuthPopup","resolve","reject","left","top","popup","handleMessage","event","cleanup","pollClosed","AcceslyContext","createContext","AcceslyProvider","children","config","client","useMemo","wallet","setWallet","useState","balance","setBalance","loading","setLoading","creating","setCreating","error","setError","useEffect","loadWallet","fetchBalance","interval","err","createWallet","native","b","connect","useCallback","disconnect","sendPayment","refreshBalance","refreshWallet","contextValue","jsx","useAccesly","context","useContext","ConnectModal","onClose","onConnect","styles","jsxs","e","WalletPanel","activeTab","setActiveTab","sendDest","setSendDest","sendAmount","setSendAmount","sendMemo","setSendMemo","sending","setSending","sendResult","setSendResult","sendError","setSendError","transactions","setTransactions","txLoading","setTxLoading","copiedField","setCopiedField","loadTransactions","handleSend","result","truncate","addr","start","end","copyToClipboard","text","field","handleDisconnect","formattedBalance","idColor","identiconColor","tabs","tab","renderWalletTab","renderActivityTab","renderAccountTab","renderSecurityTab","fields","f","address","hash","i","ConnectButton","showModal","setShowModal","showPanel","setShowPanel","Fragment","truncated","balanceText","color","STYLE_ID","style"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * AcceslyClient.ts - HTTP client for the Accesly backend API.\r\n *\r\n * Handles:\r\n * - All wallet API calls (balance, send, create, etc.)\r\n * - Automatic token refresh on 401 responses\r\n * - API key injection in every request\r\n */\r\n\r\nimport type { WalletInfo, TransactionRecord, SendPaymentParams, AuthTokens } from './types';\r\n\r\nconst STORAGE_KEY = 'accesly_auth';\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport class AcceslyClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n\r\n constructor(appId: string, baseUrl?: string) {\r\n this.appId = appId;\r\n this.baseUrl = baseUrl || DEFAULT_BASE_URL;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Token management (stored in localStorage)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Save auth tokens to localStorage */\r\n setTokens(tokens: AuthTokens): void {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(tokens));\r\n }\r\n\r\n /** Get stored auth tokens */\r\n getTokens(): AuthTokens | null {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (!raw) return null;\r\n try {\r\n return JSON.parse(raw) as AuthTokens;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear stored auth tokens */\r\n clearTokens(): void {\r\n localStorage.removeItem(STORAGE_KEY);\r\n }\r\n\r\n /** Check if we have a stored session */\r\n hasSession(): boolean {\r\n return this.getTokens() !== null;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // HTTP layer\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Make an authenticated request to the Accesly API.\r\n * Automatically adds the API key and auth token.\r\n * Retries once with a refreshed token on 401.\r\n */\r\n private async request<T>(\r\n path: string,\r\n options: RequestInit = {},\r\n retry = true\r\n ): Promise<T> {\r\n const tokens = this.getTokens();\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-accesly-key': this.appId,\r\n ...(tokens ? { Authorization: `Bearer ${tokens.accessToken}` } : {}),\r\n };\r\n\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n ...options,\r\n headers: { ...headers, ...(options.headers as Record<string, string>) },\r\n });\r\n\r\n // If unauthorized, try to refresh the token once\r\n if (res.status === 401 && retry && tokens?.refreshToken) {\r\n const refreshed = await this.refreshToken(tokens.refreshToken);\r\n if (refreshed) {\r\n return this.request<T>(path, options, false);\r\n }\r\n // Refresh failed - clear tokens\r\n this.clearTokens();\r\n throw new Error('Session expired. Please reconnect.');\r\n }\r\n\r\n if (!res.ok) {\r\n const data = await res.json().catch(() => ({}));\r\n throw new Error(data.error || data.details || `Request failed: ${res.status}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** Refresh the access token using the refresh token */\r\n private async refreshToken(refreshToken: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/auth/refresh`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n\r\n if (!res.ok) return false;\r\n\r\n const data = await res.json();\r\n const tokens = this.getTokens();\r\n if (tokens) {\r\n this.setTokens({\r\n ...tokens,\r\n accessToken: data.accessToken,\r\n refreshToken: data.refreshToken,\r\n expiresAt: data.expiresAt,\r\n });\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Wallet API methods\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Get wallet info for the authenticated user */\r\n async getWalletInfo(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/info');\r\n }\r\n\r\n /** Create a new wallet for the authenticated user */\r\n async createWallet(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/create', { method: 'POST' });\r\n }\r\n\r\n /** Get the wallet's balance */\r\n async getBalance(): Promise<{ balances: Array<{ asset: string; balance: string }> }> {\r\n return this.request('/api/wallet/balance');\r\n }\r\n\r\n /** Send a payment */\r\n async sendPayment(params: SendPaymentParams): Promise<{ txHash: string }> {\r\n return this.request('/api/wallet/send', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n });\r\n }\r\n\r\n /** Get transaction history */\r\n async getTransactions(limit = 20): Promise<{ transactions: TransactionRecord[] }> {\r\n return this.request(`/api/wallet/transactions?limit=${limit}`);\r\n }\r\n\r\n /** Rotate wallet keys */\r\n async rotateKeys(): Promise<{ newStellarAddress: string }> {\r\n return this.request('/api/wallet/rotate', { method: 'POST' });\r\n }\r\n}\r\n","/**\r\n * auth.ts - Popup-based OAuth authentication for the SDK.\r\n *\r\n * Opens a popup window pointing to the Accesly auth page.\r\n * The popup handles Google OAuth and sends the resulting tokens\r\n * back to this window via postMessage.\r\n */\r\n\r\nimport type { AuthTokens } from './types';\r\n\r\n/** Popup window dimensions */\r\nconst POPUP_WIDTH = 450;\r\nconst POPUP_HEIGHT = 600;\r\n\r\n/**\r\n * Open the Accesly auth popup and wait for the user to authenticate.\r\n * Returns the auth tokens on success, or throws on failure/cancellation.\r\n */\r\nexport function openAuthPopup(baseUrl: string, appId: string): Promise<AuthTokens> {\r\n return new Promise((resolve, reject) => {\r\n // Center the popup on screen\r\n const left = window.screenX + (window.innerWidth - POPUP_WIDTH) / 2;\r\n const top = window.screenY + (window.innerHeight - POPUP_HEIGHT) / 2;\r\n\r\n const popup = window.open(\r\n `${baseUrl}/auth/popup?appId=${appId}`,\r\n 'accesly-auth',\r\n `width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top},toolbar=no,menubar=no`\r\n );\r\n\r\n if (!popup) {\r\n reject(new Error('Failed to open popup. Please allow popups for this site.'));\r\n return;\r\n }\r\n\r\n /** Handle messages from the popup */\r\n function handleMessage(event: MessageEvent) {\r\n // Only accept messages from the Accesly domain\r\n if (!event.origin.includes(new URL(baseUrl).host)) return;\r\n\r\n if (event.data?.type === 'accesly-auth-success') {\r\n cleanup();\r\n resolve(event.data.payload as AuthTokens);\r\n }\r\n\r\n if (event.data?.type === 'accesly-auth-error') {\r\n cleanup();\r\n reject(new Error(event.data.error || 'Authentication failed'));\r\n }\r\n }\r\n\r\n /** Detect if the user closed the popup manually */\r\n const pollClosed = setInterval(() => {\r\n if (popup.closed) {\r\n cleanup();\r\n reject(new Error('Authentication cancelled'));\r\n }\r\n }, 500);\r\n\r\n /** Remove all listeners and intervals */\r\n function cleanup() {\r\n window.removeEventListener('message', handleMessage);\r\n clearInterval(pollClosed);\r\n }\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n}\r\n","/**\r\n * AcceslyProvider.tsx - Main SDK provider component.\r\n *\r\n * Wraps the application and provides wallet state to all children.\r\n * Handles auth token management, wallet loading, and balance refresh.\r\n *\r\n * Usage:\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <App />\r\n * </AcceslyProvider>\r\n */\r\n\r\nimport {\r\n createContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { AcceslyClient } from './AcceslyClient';\r\nimport { openAuthPopup } from './auth';\r\nimport type {\r\n AcceslyConfig,\r\n AcceslyContextType,\r\n WalletInfo,\r\n SendPaymentParams,\r\n} from './types';\r\n\r\n/** Internal context - use the useAccesly hook to access it */\r\nexport const AcceslyContext = createContext<AcceslyContextType | null>(null);\r\n\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport function AcceslyProvider({\r\n children,\r\n ...config\r\n}: AcceslyConfig & { children: ReactNode }) {\r\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\r\n\r\n // Create a stable client instance\r\n const client = useMemo(\r\n () => new AcceslyClient(config.appId, baseUrl),\r\n [config.appId, baseUrl]\r\n );\r\n\r\n const [wallet, setWallet] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [creating, setCreating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // --- Check for existing session on mount ---\r\n useEffect(() => {\r\n if (client.hasSession()) {\r\n loadWallet();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, [client]);\r\n\r\n // --- Auto-refresh balance every 15s when connected ---\r\n useEffect(() => {\r\n if (!wallet) return;\r\n fetchBalance();\r\n const interval = setInterval(fetchBalance, 15000);\r\n return () => clearInterval(interval);\r\n }, [wallet]);\r\n\r\n /** Load wallet info from the backend. Creates wallet if first login. */\r\n async function loadWallet() {\r\n setError(null);\r\n try {\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n // If 404, create wallet (first login)\r\n if (err.message?.includes('404') || err.message?.includes('not found')) {\r\n await createWallet();\r\n return;\r\n }\r\n // If session expired, clear and let user reconnect\r\n if (err.message?.includes('Session expired')) {\r\n client.clearTokens();\r\n setWallet(null);\r\n }\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Create a new wallet for the user */\r\n async function createWallet() {\r\n setCreating(true);\r\n setError(null);\r\n try {\r\n await client.createWallet();\r\n // Fetch the full wallet info after creation\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setCreating(false);\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Fetch current XLM balance */\r\n async function fetchBalance() {\r\n try {\r\n const data = await client.getBalance();\r\n const native = data.balances.find((b) => b.asset === 'native');\r\n setBalance(native?.balance || '0');\r\n } catch {\r\n // Silently fail, keep previous balance\r\n }\r\n }\r\n\r\n /** Open auth popup, get tokens, load wallet */\r\n const connect = useCallback(async () => {\r\n setError(null);\r\n try {\r\n const tokens = await openAuthPopup(baseUrl, config.appId);\r\n client.setTokens(tokens);\r\n setLoading(true);\r\n await loadWallet();\r\n } catch (err: any) {\r\n if (err.message !== 'Authentication cancelled') {\r\n setError(err.message);\r\n }\r\n }\r\n }, [baseUrl, config.appId, client]);\r\n\r\n /** Disconnect: clear tokens and state */\r\n const disconnect = useCallback(() => {\r\n client.clearTokens();\r\n setWallet(null);\r\n setBalance(null);\r\n setError(null);\r\n config.onDisconnect?.();\r\n }, [client, config.onDisconnect]);\r\n\r\n /** Send a payment */\r\n const sendPayment = useCallback(\r\n async (params: SendPaymentParams) => {\r\n return client.sendPayment(params);\r\n },\r\n [client]\r\n );\r\n\r\n /** Refresh balance on demand */\r\n const refreshBalance = useCallback(async () => {\r\n await fetchBalance();\r\n }, [client]);\r\n\r\n /** Refresh wallet info on demand */\r\n const refreshWallet = useCallback(async () => {\r\n await loadWallet();\r\n }, [client]);\r\n\r\n const contextValue: AcceslyContextType = {\r\n loading,\r\n creating,\r\n wallet,\r\n balance,\r\n error,\r\n connect,\r\n disconnect,\r\n sendPayment,\r\n refreshBalance,\r\n refreshWallet,\r\n };\r\n\r\n return (\r\n <AcceslyContext.Provider value={contextValue}>\r\n {children}\r\n </AcceslyContext.Provider>\r\n );\r\n}\r\n","/**\r\n * useAccesly.ts - Public hook for accessing wallet state and actions.\r\n *\r\n * Usage:\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n *\r\n * Must be used within an <AcceslyProvider>.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { AcceslyContext } from '../AcceslyProvider';\r\nimport type { AcceslyContextType } from '../types';\r\n\r\nexport function useAccesly(): AcceslyContextType {\r\n const context = useContext(AcceslyContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useAccesly must be used within an <AcceslyProvider>. ' +\r\n 'Wrap your app with <AcceslyProvider appId=\"acc_xxxxx\">.'\r\n );\r\n }\r\n return context;\r\n}\r\n","/**\r\n * ConnectModal.tsx - SDK login modal.\r\n *\r\n * Shows a centered modal with the Google login option.\r\n * When the user clicks \"Continue with Google\", triggers the\r\n * popup-based OAuth flow.\r\n */\r\n\r\ninterface ConnectModalProps {\r\n onClose: () => void;\r\n onConnect: () => void;\r\n}\r\n\r\nexport function ConnectModal({ onClose, onConnect }: ConnectModalProps) {\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\r\n {/* Close button */}\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Branding */}\r\n <div style={styles.iconWrapper}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667eea\" strokeWidth=\"1.5\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n </div>\r\n <h2 style={styles.title}>Connect to Accesly</h2>\r\n <p style={styles.subtitle}>Choose how you want to connect</p>\r\n\r\n {/* Google button */}\r\n <button onClick={onConnect} style={styles.googleBtn}>\r\n <svg style={styles.googleIcon} viewBox=\"0 0 24 24\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\r\n </svg>\r\n Continue with Google\r\n </button>\r\n\r\n <p style={styles.footer}>\r\n Powered by Accesly\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n modal: {\r\n position: 'relative' as const,\r\n backgroundColor: '#141428',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n padding: '2rem',\r\n width: '100%',\r\n maxWidth: '380px',\r\n textAlign: 'center' as const,\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n iconWrapper: {\r\n width: '56px',\r\n height: '56px',\r\n borderRadius: '16px',\r\n backgroundColor: 'rgba(102, 126, 234, 0.1)',\r\n border: '1px solid rgba(102, 126, 234, 0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto 1rem',\r\n },\r\n title: {\r\n fontSize: '1.3rem',\r\n fontWeight: 700,\r\n color: '#e2e8f0',\r\n margin: '0 0 0.25rem',\r\n },\r\n subtitle: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n margin: '0 0 1.5rem',\r\n },\r\n googleBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.75rem',\r\n padding: '0.85rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n color: '#e2e8f0',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '12px',\r\n fontSize: '0.95rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginBottom: '1.25rem',\r\n },\r\n googleIcon: {\r\n width: '20px',\r\n height: '20px',\r\n flexShrink: 0,\r\n },\r\n footer: {\r\n color: '#475569',\r\n fontSize: '0.7rem',\r\n margin: 0,\r\n },\r\n};\r\n","/**\r\n * WalletPanel.tsx - SDK wallet panel modal with tabs.\r\n *\r\n * Opened by clicking the connected pill.\r\n * Tabs: Wallet (send/receive), Activity (transactions),\r\n * Account (details), Security (recovery + disconnect).\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport type { TransactionRecord, SendPaymentParams } from '../types';\r\n\r\ntype Tab = 'wallet' | 'activity' | 'account' | 'security';\r\n\r\ninterface WalletPanelProps {\r\n onClose: () => void;\r\n}\r\n\r\nexport function WalletPanel({ onClose }: WalletPanelProps) {\r\n const { wallet, balance, disconnect, sendPayment, refreshBalance } = useAccesly();\r\n const [activeTab, setActiveTab] = useState<Tab>('wallet');\r\n\r\n // Send form state\r\n const [sendDest, setSendDest] = useState('');\r\n const [sendAmount, setSendAmount] = useState('');\r\n const [sendMemo, setSendMemo] = useState('');\r\n const [sending, setSending] = useState(false);\r\n const [sendResult, setSendResult] = useState<string | null>(null);\r\n const [sendError, setSendError] = useState<string | null>(null);\r\n\r\n // Activity state\r\n const [transactions, setTransactions] = useState<TransactionRecord[]>([]);\r\n const [txLoading, setTxLoading] = useState(false);\r\n\r\n // Clipboard feedback\r\n const [copiedField, setCopiedField] = useState<string | null>(null);\r\n\r\n // Lazy-load transactions when Activity tab is selected\r\n useEffect(() => {\r\n if (activeTab === 'activity' && transactions.length === 0) {\r\n loadTransactions();\r\n }\r\n }, [activeTab]);\r\n\r\n if (!wallet) return null;\r\n\r\n async function loadTransactions() {\r\n setTxLoading(true);\r\n try {\r\n // Use the AcceslyClient indirectly through the parent context\r\n // For SDK, we fetch directly since we have the client\r\n const res = await fetch('/api/wallet/transactions?limit=20');\r\n // Note: This won't work cross-origin. In the SDK, transactions\r\n // are loaded via the AcceslyClient. For now, we'll show placeholder.\r\n // TODO: Expose getTransactions through context\r\n } catch {\r\n // Silently fail\r\n } finally {\r\n setTxLoading(false);\r\n }\r\n }\r\n\r\n async function handleSend() {\r\n if (!sendDest || !sendAmount) return;\r\n setSending(true);\r\n setSendError(null);\r\n try {\r\n const result = await sendPayment({\r\n destination: sendDest,\r\n amount: sendAmount,\r\n memo: sendMemo || undefined,\r\n });\r\n setSendResult(result.txHash);\r\n refreshBalance();\r\n } catch (err: any) {\r\n setSendError(err.message);\r\n } finally {\r\n setSending(false);\r\n }\r\n }\r\n\r\n function truncate(addr: string, start = 6, end = 6): string {\r\n if (addr.length <= start + end + 3) return addr;\r\n return `${addr.slice(0, start)}...${addr.slice(-end)}`;\r\n }\r\n\r\n async function copyToClipboard(text: string, field: string) {\r\n await navigator.clipboard.writeText(text);\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 1500);\r\n }\r\n\r\n function handleDisconnect() {\r\n disconnect();\r\n onClose();\r\n }\r\n\r\n const formattedBalance = balance\r\n ? parseFloat(balance).toLocaleString('en-US', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n })\r\n : '---';\r\n\r\n const idColor = identiconColor(wallet.stellarAddress);\r\n\r\n const tabs: { key: Tab; label: string }[] = [\r\n { key: 'wallet', label: 'Wallet' },\r\n { key: 'activity', label: 'Activity' },\r\n { key: 'account', label: 'Account' },\r\n { key: 'security', label: 'Security' },\r\n ];\r\n\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.panel} onClick={(e) => e.stopPropagation()}>\r\n {/* Header */}\r\n <div style={styles.header}>\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <div style={{ ...styles.identicon, backgroundColor: idColor }} />\r\n <p style={styles.headerAddr}>{truncate(wallet.stellarAddress, 8, 8)}</p>\r\n <p style={styles.headerBalance}>\r\n {formattedBalance} <span style={styles.headerCurrency}>XLM</span>\r\n </p>\r\n </div>\r\n\r\n {/* Tab bar */}\r\n <div style={styles.tabBar}>\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.key}\r\n onClick={() => setActiveTab(tab.key)}\r\n style={{\r\n ...styles.tab,\r\n ...(activeTab === tab.key ? styles.tabActive : {}),\r\n }}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab content */}\r\n <div style={styles.content}>\r\n {activeTab === 'wallet' && renderWalletTab()}\r\n {activeTab === 'activity' && renderActivityTab()}\r\n {activeTab === 'account' && renderAccountTab()}\r\n {activeTab === 'security' && renderSecurityTab()}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // --- Tab renderers ---\r\n\r\n function renderWalletTab() {\r\n // Send success state\r\n if (sendResult) {\r\n return (\r\n <div style={styles.centeredCol}>\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#34d399\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"8 12 11 15 16 9\" />\r\n </svg>\r\n <p style={{ color: '#34d399', fontWeight: 600, margin: '0.5rem 0' }}>Payment Sent</p>\r\n <p style={{ color: '#64748b', fontSize: '0.75rem', fontFamily: 'monospace' }}>\r\n {sendResult.slice(0, 12)}...{sendResult.slice(-12)}\r\n </p>\r\n <button onClick={() => { setSendResult(null); setSendDest(''); setSendAmount(''); setSendMemo(''); }} style={styles.primaryBtn}>\r\n Done\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={styles.walletTab}>\r\n {/* Send form */}\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Destination</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"G...\"\r\n value={sendDest}\r\n onChange={(e) => setSendDest(e.target.value)}\r\n maxLength={56}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Amount (XLM)</label>\r\n <input\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n value={sendAmount}\r\n onChange={(e) => setSendAmount(e.target.value)}\r\n min=\"0.0000001\"\r\n step=\"any\"\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Memo (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"What is this for?\"\r\n value={sendMemo}\r\n onChange={(e) => setSendMemo(e.target.value)}\r\n maxLength={28}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n {sendError && <p style={styles.error}>{sendError}</p>}\r\n <button\r\n onClick={handleSend}\r\n disabled={sending || !sendDest || !sendAmount}\r\n style={{\r\n ...styles.primaryBtn,\r\n opacity: sending || !sendDest || !sendAmount ? 0.5 : 1,\r\n }}\r\n >\r\n {sending ? 'Sending...' : 'Send Payment'}\r\n </button>\r\n\r\n {/* Copy address for receiving */}\r\n <button\r\n onClick={() => copyToClipboard(wallet!.stellarAddress, 'receive')}\r\n style={styles.receiveBtn}\r\n >\r\n {copiedField === 'receive' ? 'Address Copied!' : 'Copy Address to Receive'}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n function renderActivityTab() {\r\n return (\r\n <p style={styles.emptyText}>\r\n Transaction history coming soon.\r\n </p>\r\n );\r\n }\r\n\r\n function renderAccountTab() {\r\n const fields = [\r\n { label: 'Email', value: wallet!.email, key: 'email' },\r\n { label: 'Contract ID', value: wallet!.contractId, key: 'contract', copy: true },\r\n { label: 'Stellar Address', value: wallet!.stellarAddress, key: 'stellar', copy: true },\r\n { label: 'Public Key', value: wallet!.publicKey, key: 'pubkey', copy: true },\r\n { label: 'Created', value: new Date(wallet!.createdAt).toLocaleDateString(), key: 'created' },\r\n ];\r\n\r\n return (\r\n <div style={styles.fieldList}>\r\n {fields.map((f) => (\r\n <div key={f.key} style={styles.field}>\r\n <span style={styles.fieldLabel}>{f.label}</span>\r\n {f.copy ? (\r\n <button\r\n onClick={() => copyToClipboard(f.value, f.key)}\r\n style={{\r\n ...styles.copyBtn,\r\n color: copiedField === f.key ? '#34d399' : '#a5b4fc',\r\n borderColor: copiedField === f.key ? '#34d399' : '#2a2a4a',\r\n }}\r\n >\r\n {copiedField === f.key ? 'Copied!' : truncate(f.value, 8, 8)}\r\n </button>\r\n ) : (\r\n <span style={styles.fieldValue}>{f.value}</span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n function renderSecurityTab() {\r\n return (\r\n <div style={styles.securityTab}>\r\n <div style={styles.fieldList}>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Recovery</span>\r\n <span style={{ ...styles.fieldValue, color: '#34d399' }}>Protected</span>\r\n </div>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Method</span>\r\n <span style={styles.fieldValue}>Google ({wallet!.email})</span>\r\n </div>\r\n </div>\r\n <button onClick={handleDisconnect} style={styles.disconnectBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n Disconnect\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Styles\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n panel: {\r\n backgroundColor: '#0f0f1e',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n width: '100%',\r\n maxWidth: '420px',\r\n maxHeight: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n position: 'relative' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n padding: '1.5rem 1.5rem 1rem',\r\n background: 'linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)',\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n identicon: {\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n marginBottom: '0.5rem',\r\n },\r\n headerAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n margin: '0 0 0.25rem',\r\n },\r\n headerBalance: {\r\n fontSize: '1.75rem',\r\n fontWeight: 700,\r\n color: '#ffffff',\r\n margin: 0,\r\n },\r\n headerCurrency: {\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n color: '#8b8ba7',\r\n },\r\n tabBar: {\r\n display: 'flex',\r\n borderBottom: '1px solid #2a2a4a',\r\n padding: '0 0.5rem',\r\n },\r\n tab: {\r\n flex: 1,\r\n padding: '0.75rem 0.5rem',\r\n background: 'none',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: '#64748b',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n borderRadius: 0,\r\n },\r\n tabActive: {\r\n color: '#e2e8f0',\r\n borderBottomColor: '#667eea',\r\n },\r\n content: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n padding: '1rem 1.25rem 1.25rem',\r\n },\r\n // Wallet tab\r\n walletTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.75rem',\r\n },\r\n formGroup: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.3rem',\r\n },\r\n formLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.75rem',\r\n fontWeight: 500,\r\n },\r\n formInput: {\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '8px',\r\n padding: '0.65rem 0.75rem',\r\n color: '#e2e8f0',\r\n fontSize: '0.9rem',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n fontFamily: 'inherit',\r\n },\r\n primaryBtn: {\r\n backgroundColor: '#667eea',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '10px',\r\n padding: '0.75rem',\r\n fontSize: '0.95rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginTop: '0.25rem',\r\n },\r\n receiveBtn: {\r\n backgroundColor: 'transparent',\r\n color: '#a5b4fc',\r\n border: '1.5px solid #4a4a7a',\r\n borderRadius: '10px',\r\n padding: '0.65rem',\r\n fontSize: '0.85rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n },\r\n error: {\r\n color: '#f87171',\r\n fontSize: '0.8rem',\r\n margin: 0,\r\n padding: '0.4rem 0.6rem',\r\n backgroundColor: 'rgba(248, 113, 113, 0.1)',\r\n borderRadius: '6px',\r\n },\r\n centeredCol: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '1rem 0',\r\n },\r\n // Account tab\r\n fieldList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n },\r\n field: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0.6rem 0',\r\n borderBottom: '1px solid #1a1a2e',\r\n },\r\n fieldLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.8rem',\r\n },\r\n fieldValue: {\r\n color: '#e2e8f0',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n },\r\n copyBtn: {\r\n background: 'none',\r\n border: '1px solid #2a2a4a',\r\n color: '#a5b4fc',\r\n padding: '0.2rem 0.5rem',\r\n borderRadius: '4px',\r\n fontSize: '0.72rem',\r\n fontFamily: 'monospace',\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n },\r\n // Security tab\r\n securityTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '1rem',\r\n },\r\n disconnectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.65rem',\r\n backgroundColor: 'transparent',\r\n color: '#f87171',\r\n border: '1px solid rgba(248, 113, 113, 0.2)',\r\n borderRadius: '10px',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n },\r\n emptyText: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n textAlign: 'center' as const,\r\n padding: '2rem 0',\r\n },\r\n};\r\n","/**\r\n * ConnectButton.tsx - SDK drop-in wallet button.\r\n *\r\n * Renders a dynamic button that:\r\n * - Shows \"Connect Wallet\" when disconnected → opens ConnectModal\r\n * - Shows a pill with address + balance when connected → opens WalletPanel\r\n * - Handles loading/creating states with spinners\r\n *\r\n * Usage:\r\n * <ConnectButton />\r\n */\r\n\r\nimport { useState } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport { ConnectModal } from './ConnectModal';\r\nimport { WalletPanel } from './WalletPanel';\r\n\r\nexport function ConnectButton() {\r\n const { wallet, balance, loading, creating, connect } = useAccesly();\r\n const [showModal, setShowModal] = useState(false);\r\n const [showPanel, setShowPanel] = useState(false);\r\n\r\n // Initial auth check\r\n if (loading) {\r\n return (\r\n <div style={styles.pillLoading}>\r\n <div style={styles.spinner} />\r\n </div>\r\n );\r\n }\r\n\r\n // Not connected\r\n if (!wallet) {\r\n return (\r\n <>\r\n <button\r\n onClick={() => setShowModal(true)}\r\n style={creating ? styles.pill : styles.connectBtn}\r\n disabled={creating}\r\n >\r\n {creating ? (\r\n <>\r\n <div style={styles.spinnerSmall} />\r\n <span style={styles.pillText}>Creating wallet...</span>\r\n </>\r\n ) : (\r\n <>\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n Connect Wallet\r\n </>\r\n )}\r\n </button>\r\n\r\n {showModal && (\r\n <ConnectModal\r\n onClose={() => setShowModal(false)}\r\n onConnect={async () => {\r\n setShowModal(false);\r\n await connect();\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n // Connected - show pill\r\n const addr = wallet.stellarAddress;\r\n const truncated = `${addr.slice(0, 4)}...${addr.slice(-4)}`;\r\n const balanceText = balance\r\n ? `${parseFloat(balance).toFixed(2)} XLM`\r\n : '--- XLM';\r\n const color = identiconColor(addr);\r\n\r\n return (\r\n <>\r\n <button onClick={() => setShowPanel(true)} style={styles.pill}>\r\n <div style={{ ...styles.identicon, backgroundColor: color }} />\r\n <span style={styles.pillAddr}>{truncated}</span>\r\n <span style={styles.divider} />\r\n <span style={styles.pillBalance}>{balanceText}</span>\r\n </button>\r\n\r\n {showPanel && <WalletPanel onClose={() => setShowPanel(false)} />}\r\n </>\r\n );\r\n}\r\n\r\n/** Generate a deterministic HSL color from a Stellar address */\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Inline styles (zero CSS dependencies)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n connectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.6rem',\r\n padding: '0.85rem 1.75rem',\r\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '12px',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'transform 0.15s, box-shadow 0.15s',\r\n boxShadow: '0 4px 15px rgba(102, 126, 234, 0.4)',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pill: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '0.5rem 0.85rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n cursor: 'pointer',\r\n transition: 'border-color 0.2s, box-shadow 0.2s',\r\n color: '#e2e8f0',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pillLoading: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n height: '42px',\r\n },\r\n identicon: {\r\n width: '24px',\r\n height: '24px',\r\n borderRadius: '50%',\r\n flexShrink: 0,\r\n },\r\n pillAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#e2e8f0',\r\n },\r\n divider: {\r\n width: '1px',\r\n height: '16px',\r\n backgroundColor: '#3a3a5a',\r\n },\r\n pillBalance: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n fontWeight: 500,\r\n },\r\n pillText: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n },\r\n spinner: {\r\n width: '20px',\r\n height: '20px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n },\r\n spinnerSmall: {\r\n width: '16px',\r\n height: '16px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n flexShrink: 0,\r\n },\r\n};\r\n","/**\r\n * Accesly SDK - Account abstraction wallet for Stellar.\r\n *\r\n * Quick start:\r\n *\r\n * import { AcceslyProvider, ConnectButton } from 'accesly';\r\n *\r\n * function App() {\r\n * return (\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <ConnectButton />\r\n * </AcceslyProvider>\r\n * );\r\n * }\r\n *\r\n * For custom UI, use the useAccesly hook:\r\n *\r\n * import { useAccesly } from 'accesly';\r\n *\r\n * function MyWallet() {\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n * // Build your own UI\r\n * }\r\n */\r\n\r\n// --- CSS keyframes injection ---\r\n// Since the SDK uses inline styles, we inject required keyframes once\r\nif (typeof document !== 'undefined') {\r\n const STYLE_ID = 'accesly-keyframes';\r\n if (!document.getElementById(STYLE_ID)) {\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes accesly-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n\r\n// --- Components ---\r\nexport { AcceslyProvider } from './AcceslyProvider';\r\nexport { ConnectButton } from './components/ConnectButton';\r\n\r\n// --- Hooks ---\r\nexport { useAccesly } from './hooks/useAccesly';\r\n\r\n// --- Types ---\r\nexport type {\r\n AcceslyConfig,\r\n WalletInfo,\r\n TransactionRecord,\r\n SendPaymentParams,\r\n AcceslyContextType,\r\n} from './types';\r\n"]}
1
+ {"version":3,"sources":["../src/AcceslyClient.ts","../src/auth.ts","../src/AcceslyProvider.tsx","../src/hooks/useAccesly.ts","../src/components/ConnectModal.tsx","../src/components/WalletPanel.tsx","../src/components/ConnectButton.tsx","../src/index.ts"],"names":["STORAGE_KEY","DEFAULT_BASE_URL","AcceslyApiError","message","status","AcceslyClient","appId","baseUrl","tokens","raw","path","options","retry","headers","res","data","refreshToken","params","limit","openAuthPopup","resolve","reject","left","top","popup","handleMessage","event","cleanup","pollClosed","AcceslyContext","createContext","AcceslyProvider","children","config","client","useMemo","wallet","setWallet","useState","balance","setBalance","loading","setLoading","creating","setCreating","error","setError","useEffect","loadWallet","fetchBalance","interval","err","createWallet","native","b","connect","useCallback","disconnect","sendPayment","rotateKeys","getTransactions","refreshBalance","refreshWallet","contextValue","jsx","useAccesly","context","useContext","ConnectModal","onClose","onConnect","styles","jsxs","e","WalletPanel","activeTab","setActiveTab","walletView","setWalletView","sendDest","setSendDest","sendAmount","setSendAmount","sendMemo","setSendMemo","sending","setSending","sendResult","setSendResult","sendError","setSendError","transactions","setTransactions","txLoading","setTxLoading","rotating","setRotating","rotateError","setRotateError","copiedField","setCopiedField","loadTransactions","txs","handleSend","result","resetSendForm","handleRotateKeys","handleDisconnect","truncate","addr","start","end","copyToClipboard","text","field","relativeTime","isoDate","diff","formattedBalance","idColor","identiconColor","tabs","tab","renderWalletTab","renderActivityTab","renderAccountTab","renderSecurityTab","tx","Fragment","fields","f","address","hash","ConnectButton","showModal","setShowModal","showPanel","setShowPanel","truncated","balanceText","color","STYLE_ID","style"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * AcceslyClient.ts - HTTP client for the Accesly backend API.\r\n *\r\n * Handles:\r\n * - All wallet API calls (balance, send, create, etc.)\r\n * - Automatic token refresh on 401 responses\r\n * - API key injection in every request\r\n */\r\n\r\nimport type { WalletInfo, TransactionRecord, SendPaymentParams, AuthTokens } from './types';\r\n\r\nconst STORAGE_KEY = 'accesly_auth';\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\n/** Custom error that preserves the HTTP status code */\r\nexport class AcceslyApiError extends Error {\r\n status: number;\r\n constructor(message: string, status: number) {\r\n super(message);\r\n this.name = 'AcceslyApiError';\r\n this.status = status;\r\n }\r\n}\r\n\r\nexport class AcceslyClient {\r\n private baseUrl: string;\r\n private appId: string;\r\n\r\n constructor(appId: string, baseUrl?: string) {\r\n this.appId = appId;\r\n this.baseUrl = baseUrl || DEFAULT_BASE_URL;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Token management (stored in localStorage)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Save auth tokens to localStorage */\r\n setTokens(tokens: AuthTokens): void {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(tokens));\r\n }\r\n\r\n /** Get stored auth tokens */\r\n getTokens(): AuthTokens | null {\r\n const raw = localStorage.getItem(STORAGE_KEY);\r\n if (!raw) return null;\r\n try {\r\n return JSON.parse(raw) as AuthTokens;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear stored auth tokens */\r\n clearTokens(): void {\r\n localStorage.removeItem(STORAGE_KEY);\r\n }\r\n\r\n /** Check if we have a stored session */\r\n hasSession(): boolean {\r\n return this.getTokens() !== null;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // HTTP layer\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Make an authenticated request to the Accesly API.\r\n * Automatically adds the API key and auth token.\r\n * Retries once with a refreshed token on 401.\r\n */\r\n private async request<T>(\r\n path: string,\r\n options: RequestInit = {},\r\n retry = true\r\n ): Promise<T> {\r\n const tokens = this.getTokens();\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-accesly-key': this.appId,\r\n ...(tokens ? { Authorization: `Bearer ${tokens.accessToken}` } : {}),\r\n };\r\n\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n ...options,\r\n headers: { ...headers, ...(options.headers as Record<string, string>) },\r\n });\r\n\r\n // If unauthorized, try to refresh the token once\r\n if (res.status === 401 && retry && tokens?.refreshToken) {\r\n const refreshed = await this.refreshToken(tokens.refreshToken);\r\n if (refreshed) {\r\n return this.request<T>(path, options, false);\r\n }\r\n // Refresh failed - clear tokens\r\n this.clearTokens();\r\n throw new Error('Session expired. Please reconnect.');\r\n }\r\n\r\n if (!res.ok) {\r\n const data = await res.json().catch(() => ({}));\r\n throw new AcceslyApiError(\r\n data.error || data.details || `Request failed: ${res.status}`,\r\n res.status\r\n );\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n }\r\n\r\n /** Refresh the access token using the refresh token */\r\n private async refreshToken(refreshToken: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/auth/refresh`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n\r\n if (!res.ok) return false;\r\n\r\n const data = await res.json();\r\n const tokens = this.getTokens();\r\n if (tokens) {\r\n this.setTokens({\r\n ...tokens,\r\n accessToken: data.accessToken,\r\n refreshToken: data.refreshToken,\r\n expiresAt: data.expiresAt,\r\n });\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Wallet API methods\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Get wallet info for the authenticated user */\r\n async getWalletInfo(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/info');\r\n }\r\n\r\n /** Create a new wallet for the authenticated user */\r\n async createWallet(): Promise<{ wallet: WalletInfo }> {\r\n return this.request('/api/wallet/create', { method: 'POST' });\r\n }\r\n\r\n /** Get the wallet's balance */\r\n async getBalance(): Promise<{ balances: Array<{ asset: string; balance: string }> }> {\r\n return this.request('/api/wallet/balance');\r\n }\r\n\r\n /** Send a payment */\r\n async sendPayment(params: SendPaymentParams): Promise<{ txHash: string }> {\r\n return this.request('/api/wallet/send', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n });\r\n }\r\n\r\n /** Get transaction history */\r\n async getTransactions(limit = 20): Promise<{ transactions: TransactionRecord[] }> {\r\n return this.request(`/api/wallet/transactions?limit=${limit}`);\r\n }\r\n\r\n /** Rotate wallet keys */\r\n async rotateKeys(): Promise<{ newStellarAddress: string }> {\r\n return this.request('/api/wallet/rotate', { method: 'POST' });\r\n }\r\n}\r\n","/**\r\n * auth.ts - Popup-based OAuth authentication for the SDK.\r\n *\r\n * Opens a popup window pointing to the Accesly auth page.\r\n * The popup handles Google OAuth and sends the resulting tokens\r\n * back to this window via postMessage.\r\n */\r\n\r\nimport type { AuthTokens } from './types';\r\n\r\n/** Popup window dimensions */\r\nconst POPUP_WIDTH = 450;\r\nconst POPUP_HEIGHT = 600;\r\n\r\n/**\r\n * Open the Accesly auth popup and wait for the user to authenticate.\r\n * Returns the auth tokens on success, or throws on failure/cancellation.\r\n */\r\nexport function openAuthPopup(baseUrl: string, appId: string): Promise<AuthTokens> {\r\n return new Promise((resolve, reject) => {\r\n // Center the popup on screen\r\n const left = window.screenX + (window.innerWidth - POPUP_WIDTH) / 2;\r\n const top = window.screenY + (window.innerHeight - POPUP_HEIGHT) / 2;\r\n\r\n const popup = window.open(\r\n `${baseUrl}/auth/popup?appId=${appId}`,\r\n 'accesly-auth',\r\n `width=${POPUP_WIDTH},height=${POPUP_HEIGHT},left=${left},top=${top},toolbar=no,menubar=no`\r\n );\r\n\r\n if (!popup) {\r\n reject(new Error('Failed to open popup. Please allow popups for this site.'));\r\n return;\r\n }\r\n\r\n /** Handle messages from the popup */\r\n function handleMessage(event: MessageEvent) {\r\n // Only accept messages from the Accesly domain\r\n if (!event.origin.includes(new URL(baseUrl).host)) return;\r\n\r\n if (event.data?.type === 'accesly-auth-success') {\r\n cleanup();\r\n resolve(event.data.payload as AuthTokens);\r\n }\r\n\r\n if (event.data?.type === 'accesly-auth-error') {\r\n cleanup();\r\n reject(new Error(event.data.error || 'Authentication failed'));\r\n }\r\n }\r\n\r\n /** Detect if the user closed the popup manually */\r\n const pollClosed = setInterval(() => {\r\n if (popup.closed) {\r\n cleanup();\r\n reject(new Error('Authentication cancelled'));\r\n }\r\n }, 500);\r\n\r\n /** Remove all listeners and intervals */\r\n function cleanup() {\r\n window.removeEventListener('message', handleMessage);\r\n clearInterval(pollClosed);\r\n }\r\n\r\n window.addEventListener('message', handleMessage);\r\n });\r\n}\r\n","/**\r\n * AcceslyProvider.tsx - Main SDK provider component.\r\n *\r\n * Wraps the application and provides wallet state to all children.\r\n * Handles auth token management, wallet loading, and balance refresh.\r\n *\r\n * Usage:\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <App />\r\n * </AcceslyProvider>\r\n */\r\n\r\nimport {\r\n createContext,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\nimport { AcceslyClient, AcceslyApiError } from './AcceslyClient';\r\nimport { openAuthPopup } from './auth';\r\nimport type {\r\n AcceslyConfig,\r\n AcceslyContextType,\r\n WalletInfo,\r\n TransactionRecord,\r\n SendPaymentParams,\r\n} from './types';\r\n\r\n/** Internal context - use the useAccesly hook to access it */\r\nexport const AcceslyContext = createContext<AcceslyContextType | null>(null);\r\n\r\nconst DEFAULT_BASE_URL = 'https://accesly.vercel.app';\r\n\r\nexport function AcceslyProvider({\r\n children,\r\n ...config\r\n}: AcceslyConfig & { children: ReactNode }) {\r\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\r\n\r\n // Create a stable client instance\r\n const client = useMemo(\r\n () => new AcceslyClient(config.appId, baseUrl),\r\n [config.appId, baseUrl]\r\n );\r\n\r\n const [wallet, setWallet] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [creating, setCreating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // --- Check for existing session on mount ---\r\n useEffect(() => {\r\n if (client.hasSession()) {\r\n loadWallet();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, [client]);\r\n\r\n // --- Auto-refresh balance every 15s when connected ---\r\n useEffect(() => {\r\n if (!wallet) return;\r\n fetchBalance();\r\n const interval = setInterval(fetchBalance, 15000);\r\n return () => clearInterval(interval);\r\n }, [wallet]);\r\n\r\n /** Load wallet info from the backend. Creates wallet if first login. */\r\n async function loadWallet() {\r\n setError(null);\r\n try {\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n // If 404, user has no wallet yet — create one (first login)\r\n if (err instanceof AcceslyApiError && err.status === 404) {\r\n await createWallet();\r\n return;\r\n }\r\n // If session expired, clear tokens and let user reconnect\r\n if (err instanceof AcceslyApiError && err.status === 401) {\r\n client.clearTokens();\r\n setWallet(null);\r\n }\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Create a new wallet for the user */\r\n async function createWallet() {\r\n setCreating(true);\r\n setError(null);\r\n try {\r\n await client.createWallet();\r\n // Fetch the full wallet info after creation\r\n const data = await client.getWalletInfo();\r\n setWallet(data.wallet);\r\n config.onConnect?.(data.wallet);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setCreating(false);\r\n setLoading(false);\r\n }\r\n }\r\n\r\n /** Fetch current XLM balance */\r\n async function fetchBalance() {\r\n try {\r\n const data = await client.getBalance();\r\n const native = data.balances.find((b) => b.asset === 'native');\r\n setBalance(native?.balance || '0');\r\n } catch {\r\n // Silently fail, keep previous balance\r\n }\r\n }\r\n\r\n /** Open auth popup, get tokens, load wallet */\r\n const connect = useCallback(async () => {\r\n setError(null);\r\n try {\r\n const tokens = await openAuthPopup(baseUrl, config.appId);\r\n client.setTokens(tokens);\r\n setLoading(true);\r\n await loadWallet();\r\n } catch (err: any) {\r\n if (err.message !== 'Authentication cancelled') {\r\n setError(err.message);\r\n }\r\n }\r\n }, [baseUrl, config.appId, client]);\r\n\r\n /** Disconnect: clear tokens and state */\r\n const disconnect = useCallback(() => {\r\n client.clearTokens();\r\n setWallet(null);\r\n setBalance(null);\r\n setError(null);\r\n config.onDisconnect?.();\r\n }, [client, config.onDisconnect]);\r\n\r\n /** Send a payment */\r\n const sendPayment = useCallback(\r\n async (params: SendPaymentParams) => {\r\n return client.sendPayment(params);\r\n },\r\n [client]\r\n );\r\n\r\n /** Rotate wallet keys */\r\n const rotateKeys = useCallback(async () => {\r\n return client.rotateKeys();\r\n }, [client]);\r\n\r\n /** Get transaction history */\r\n const getTransactions = useCallback(\r\n async (limit = 20) => {\r\n const data = await client.getTransactions(limit);\r\n return data.transactions;\r\n },\r\n [client]\r\n );\r\n\r\n /** Refresh balance on demand */\r\n const refreshBalance = useCallback(async () => {\r\n await fetchBalance();\r\n }, [client]);\r\n\r\n /** Refresh wallet info on demand */\r\n const refreshWallet = useCallback(async () => {\r\n await loadWallet();\r\n }, [client]);\r\n\r\n const contextValue: AcceslyContextType = {\r\n loading,\r\n creating,\r\n wallet,\r\n balance,\r\n error,\r\n connect,\r\n disconnect,\r\n sendPayment,\r\n rotateKeys,\r\n getTransactions,\r\n refreshBalance,\r\n refreshWallet,\r\n };\r\n\r\n return (\r\n <AcceslyContext.Provider value={contextValue}>\r\n {children}\r\n </AcceslyContext.Provider>\r\n );\r\n}\r\n","/**\r\n * useAccesly.ts - Public hook for accessing wallet state and actions.\r\n *\r\n * Usage:\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n *\r\n * Must be used within an <AcceslyProvider>.\r\n */\r\n\r\nimport { useContext } from 'react';\r\nimport { AcceslyContext } from '../AcceslyProvider';\r\nimport type { AcceslyContextType } from '../types';\r\n\r\nexport function useAccesly(): AcceslyContextType {\r\n const context = useContext(AcceslyContext);\r\n if (!context) {\r\n throw new Error(\r\n 'useAccesly must be used within an <AcceslyProvider>. ' +\r\n 'Wrap your app with <AcceslyProvider appId=\"acc_xxxxx\">.'\r\n );\r\n }\r\n return context;\r\n}\r\n","/**\r\n * ConnectModal.tsx - SDK login modal.\r\n *\r\n * Shows a centered modal with the Google login option.\r\n * When the user clicks \"Continue with Google\", triggers the\r\n * popup-based OAuth flow.\r\n */\r\n\r\ninterface ConnectModalProps {\r\n onClose: () => void;\r\n onConnect: () => void;\r\n}\r\n\r\nexport function ConnectModal({ onClose, onConnect }: ConnectModalProps) {\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.modal} onClick={(e) => e.stopPropagation()}>\r\n {/* Close button */}\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Branding */}\r\n <div style={styles.iconWrapper}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667eea\" strokeWidth=\"1.5\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n </div>\r\n <h2 style={styles.title}>Connect to Accesly</h2>\r\n <p style={styles.subtitle}>Choose how you want to connect</p>\r\n\r\n {/* Google button */}\r\n <button onClick={onConnect} style={styles.googleBtn}>\r\n <svg style={styles.googleIcon} viewBox=\"0 0 24 24\">\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\r\n </svg>\r\n Continue with Google\r\n </button>\r\n\r\n <p style={styles.footer}>\r\n Powered by Accesly\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n modal: {\r\n position: 'relative' as const,\r\n backgroundColor: '#141428',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n padding: '2rem',\r\n width: '100%',\r\n maxWidth: '380px',\r\n textAlign: 'center' as const,\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n iconWrapper: {\r\n width: '56px',\r\n height: '56px',\r\n borderRadius: '16px',\r\n backgroundColor: 'rgba(102, 126, 234, 0.1)',\r\n border: '1px solid rgba(102, 126, 234, 0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto 1rem',\r\n },\r\n title: {\r\n fontSize: '1.3rem',\r\n fontWeight: 700,\r\n color: '#e2e8f0',\r\n margin: '0 0 0.25rem',\r\n },\r\n subtitle: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n margin: '0 0 1.5rem',\r\n },\r\n googleBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.75rem',\r\n padding: '0.85rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n color: '#e2e8f0',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '12px',\r\n fontSize: '0.95rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginBottom: '1.25rem',\r\n },\r\n googleIcon: {\r\n width: '20px',\r\n height: '20px',\r\n flexShrink: 0,\r\n },\r\n footer: {\r\n color: '#475569',\r\n fontSize: '0.7rem',\r\n margin: 0,\r\n },\r\n};\r\n","/**\r\n * WalletPanel.tsx - SDK wallet panel modal with tabs.\r\n *\r\n * Opened by clicking the connected pill. Mirrors the main app's UI:\r\n * - Wallet tab: Send and Receive buttons (open sub-views)\r\n * - Activity tab: Real transaction history via getTransactions\r\n * - Account tab: Wallet details with copy buttons\r\n * - Security tab: Recovery info, Rotate Keys, Disconnect\r\n */\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport type { TransactionRecord } from '../types';\r\n\r\ntype Tab = 'wallet' | 'activity' | 'account' | 'security';\r\ntype WalletView = 'main' | 'send' | 'receive';\r\n\r\ninterface WalletPanelProps {\r\n onClose: () => void;\r\n}\r\n\r\nexport function WalletPanel({ onClose }: WalletPanelProps) {\r\n const {\r\n wallet,\r\n balance,\r\n disconnect,\r\n sendPayment,\r\n rotateKeys,\r\n getTransactions,\r\n refreshBalance,\r\n refreshWallet,\r\n } = useAccesly();\r\n\r\n const [activeTab, setActiveTab] = useState<Tab>('wallet');\r\n const [walletView, setWalletView] = useState<WalletView>('main');\r\n\r\n // Send form state\r\n const [sendDest, setSendDest] = useState('');\r\n const [sendAmount, setSendAmount] = useState('');\r\n const [sendMemo, setSendMemo] = useState('');\r\n const [sending, setSending] = useState(false);\r\n const [sendResult, setSendResult] = useState<string | null>(null);\r\n const [sendError, setSendError] = useState<string | null>(null);\r\n\r\n // Activity state\r\n const [transactions, setTransactions] = useState<TransactionRecord[]>([]);\r\n const [txLoading, setTxLoading] = useState(false);\r\n\r\n // Security state\r\n const [rotating, setRotating] = useState(false);\r\n const [rotateError, setRotateError] = useState<string | null>(null);\r\n\r\n // Clipboard feedback\r\n const [copiedField, setCopiedField] = useState<string | null>(null);\r\n\r\n // Load transactions when Activity tab is selected\r\n useEffect(() => {\r\n if (activeTab === 'activity' && transactions.length === 0) {\r\n loadTransactions();\r\n }\r\n }, [activeTab]);\r\n\r\n if (!wallet) return null;\r\n\r\n async function loadTransactions() {\r\n setTxLoading(true);\r\n try {\r\n const txs = await getTransactions(20);\r\n setTransactions(txs);\r\n } catch {\r\n // Silently fail, keep empty list\r\n } finally {\r\n setTxLoading(false);\r\n }\r\n }\r\n\r\n async function handleSend() {\r\n if (!sendDest || !sendAmount) return;\r\n setSending(true);\r\n setSendError(null);\r\n try {\r\n const result = await sendPayment({\r\n destination: sendDest,\r\n amount: sendAmount,\r\n memo: sendMemo || undefined,\r\n });\r\n setSendResult(result.txHash);\r\n refreshBalance();\r\n } catch (err: any) {\r\n setSendError(err.message);\r\n } finally {\r\n setSending(false);\r\n }\r\n }\r\n\r\n function resetSendForm() {\r\n setSendResult(null);\r\n setSendDest('');\r\n setSendAmount('');\r\n setSendMemo('');\r\n setSendError(null);\r\n setWalletView('main');\r\n }\r\n\r\n async function handleRotateKeys() {\r\n if (!confirm('This will generate a new keypair and update your contract. Continue?')) return;\r\n setRotating(true);\r\n setRotateError(null);\r\n try {\r\n await rotateKeys();\r\n await refreshWallet();\r\n } catch (err: any) {\r\n setRotateError(err.message);\r\n } finally {\r\n setRotating(false);\r\n }\r\n }\r\n\r\n function handleDisconnect() {\r\n disconnect();\r\n onClose();\r\n }\r\n\r\n function truncate(addr: string, start = 6, end = 6): string {\r\n if (addr.length <= start + end + 3) return addr;\r\n return `${addr.slice(0, start)}...${addr.slice(-end)}`;\r\n }\r\n\r\n async function copyToClipboard(text: string, field: string) {\r\n await navigator.clipboard.writeText(text);\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 1500);\r\n }\r\n\r\n function relativeTime(isoDate: string): string {\r\n const diff = Math.floor((Date.now() - new Date(isoDate).getTime()) / 1000);\r\n if (diff < 60) return 'just now';\r\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\r\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\r\n if (diff < 172800) return 'yesterday';\r\n return `${Math.floor(diff / 86400)}d ago`;\r\n }\r\n\r\n const formattedBalance = balance\r\n ? parseFloat(balance).toLocaleString('en-US', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n })\r\n : '---';\r\n\r\n const idColor = identiconColor(wallet.stellarAddress);\r\n\r\n const tabs: { key: Tab; label: string }[] = [\r\n { key: 'wallet', label: 'Wallet' },\r\n { key: 'activity', label: 'Activity' },\r\n { key: 'account', label: 'Account' },\r\n { key: 'security', label: 'Security' },\r\n ];\r\n\r\n return (\r\n <div style={styles.overlay} onClick={onClose}>\r\n <div style={styles.panel} onClick={(e) => e.stopPropagation()}>\r\n {/* Header */}\r\n <div style={styles.header}>\r\n <button onClick={onClose} style={styles.closeBtn}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <div style={{ ...styles.identicon, backgroundColor: idColor }} />\r\n <p style={styles.headerAddr}>{truncate(wallet.stellarAddress, 8, 8)}</p>\r\n <p style={styles.headerBalance}>\r\n {formattedBalance} <span style={styles.headerCurrency}>XLM</span>\r\n </p>\r\n </div>\r\n\r\n {/* Tab bar */}\r\n <div style={styles.tabBar}>\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.key}\r\n onClick={() => { setActiveTab(tab.key); setWalletView('main'); }}\r\n style={{\r\n ...styles.tab,\r\n ...(activeTab === tab.key ? styles.tabActive : {}),\r\n }}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Tab content */}\r\n <div style={styles.content}>\r\n {activeTab === 'wallet' && renderWalletTab()}\r\n {activeTab === 'activity' && renderActivityTab()}\r\n {activeTab === 'account' && renderAccountTab()}\r\n {activeTab === 'security' && renderSecurityTab()}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Tab renderers\r\n // ---------------------------------------------------------------------------\r\n\r\n function renderWalletTab() {\r\n // Send success screen\r\n if (sendResult) {\r\n return (\r\n <div style={styles.centeredCol}>\r\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#34d399\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"8 12 11 15 16 9\" />\r\n </svg>\r\n <p style={{ color: '#34d399', fontWeight: 600, margin: '0.5rem 0' }}>Payment Sent</p>\r\n <p style={{ color: '#64748b', fontSize: '0.75rem', fontFamily: 'monospace' }}>\r\n {sendResult.slice(0, 12)}...{sendResult.slice(-12)}\r\n </p>\r\n <button onClick={resetSendForm} style={styles.primaryBtn}>Done</button>\r\n </div>\r\n );\r\n }\r\n\r\n // Send form sub-view\r\n if (walletView === 'send') {\r\n return (\r\n <div style={styles.subView}>\r\n <button onClick={() => setWalletView('main')} style={styles.backBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n Back\r\n </button>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Destination</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"G...\"\r\n value={sendDest}\r\n onChange={(e) => setSendDest(e.target.value)}\r\n maxLength={56}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Amount (XLM)</label>\r\n <input\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n value={sendAmount}\r\n onChange={(e) => setSendAmount(e.target.value)}\r\n min=\"0.0000001\"\r\n step=\"any\"\r\n style={styles.formInput}\r\n />\r\n </div>\r\n <div style={styles.formGroup}>\r\n <label style={styles.formLabel}>Memo (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"What is this for?\"\r\n value={sendMemo}\r\n onChange={(e) => setSendMemo(e.target.value)}\r\n maxLength={28}\r\n style={styles.formInput}\r\n />\r\n </div>\r\n {sendError && <p style={styles.error}>{sendError}</p>}\r\n <button\r\n onClick={handleSend}\r\n disabled={sending || !sendDest || !sendAmount}\r\n style={{\r\n ...styles.primaryBtn,\r\n opacity: sending || !sendDest || !sendAmount ? 0.5 : 1,\r\n }}\r\n >\r\n {sending ? 'Sending...' : 'Send Payment'}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n // Receive sub-view\r\n if (walletView === 'receive') {\r\n return (\r\n <div style={styles.subView}>\r\n <button onClick={() => setWalletView('main')} style={styles.backBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n Back\r\n </button>\r\n <div style={styles.centeredCol}>\r\n <div style={styles.receiveIconBig}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#34d399\" strokeWidth=\"2\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\r\n <polyline points=\"19 12 12 19 5 12\" />\r\n </svg>\r\n </div>\r\n <p style={{ color: '#e2e8f0', fontWeight: 600, fontSize: '1rem', margin: 0 }}>\r\n Receive XLM\r\n </p>\r\n <p style={{ color: '#64748b', fontSize: '0.8rem', margin: 0, textAlign: 'center' as const }}>\r\n Share your Stellar address to receive payments\r\n </p>\r\n <div style={styles.addressBox}>\r\n <span style={styles.addressText}>{wallet!.stellarAddress}</span>\r\n </div>\r\n <button\r\n onClick={() => copyToClipboard(wallet!.stellarAddress, 'receive')}\r\n style={styles.primaryBtn}\r\n >\r\n {copiedField === 'receive' ? 'Copied!' : 'Copy Address'}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Main wallet view — Send & Receive buttons\r\n return (\r\n <div style={styles.walletTab}>\r\n <div style={styles.actionRow}>\r\n <button onClick={() => setWalletView('send')} style={styles.actionBtn}>\r\n <div style={styles.actionIcon}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\r\n <polyline points=\"5 12 12 5 19 12\" />\r\n </svg>\r\n </div>\r\n <span style={styles.actionLabel}>Send</span>\r\n </button>\r\n <button onClick={() => setWalletView('receive')} style={styles.actionBtn}>\r\n <div style={{ ...styles.actionIcon, ...styles.actionIconReceive }}>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\r\n <polyline points=\"19 12 12 19 5 12\" />\r\n </svg>\r\n </div>\r\n <span style={styles.actionLabel}>Receive</span>\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n function renderActivityTab() {\r\n if (txLoading && transactions.length === 0) {\r\n return <p style={styles.emptyText}>Loading transactions...</p>;\r\n }\r\n\r\n if (transactions.length === 0) {\r\n return <p style={styles.emptyText}>No transactions yet</p>;\r\n }\r\n\r\n return (\r\n <div style={styles.txList}>\r\n {transactions.map((tx) => (\r\n <div key={tx.id} style={styles.txRow}>\r\n <div\r\n style={{\r\n ...styles.txIcon,\r\n backgroundColor:\r\n tx.type === 'received'\r\n ? 'rgba(52, 211, 153, 0.15)'\r\n : 'rgba(248, 113, 113, 0.15)',\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={tx.type === 'received' ? '#34d399' : '#f87171'}\r\n strokeWidth=\"2.5\"\r\n >\r\n {tx.type === 'received' ? (\r\n <>\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\r\n <polyline points=\"19 12 12 19 5 12\" />\r\n </>\r\n ) : (\r\n <>\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\r\n <polyline points=\"5 12 12 5 19 12\" />\r\n </>\r\n )}\r\n </svg>\r\n </div>\r\n\r\n <div style={styles.txDetails}>\r\n <span style={styles.txType}>\r\n {tx.type === 'received' ? 'Received' : 'Sent'}\r\n </span>\r\n <span style={styles.txCounterparty}>\r\n {tx.type === 'received' ? 'from ' : 'to '}\r\n {truncate(tx.counterparty)}\r\n </span>\r\n </div>\r\n\r\n <div style={styles.txAmountCol}>\r\n <span\r\n style={{\r\n ...styles.txAmount,\r\n color: tx.type === 'received' ? '#34d399' : '#f87171',\r\n }}\r\n >\r\n {tx.type === 'received' ? '+' : '-'}\r\n {parseFloat(tx.amount).toLocaleString('en-US', {\r\n maximumFractionDigits: 2,\r\n })}{' '}\r\n {tx.asset}\r\n </span>\r\n <span style={styles.txTime}>{relativeTime(tx.createdAt)}</span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n function renderAccountTab() {\r\n const fields = [\r\n { label: 'Email', value: wallet!.email, key: 'email' },\r\n { label: 'Contract ID', value: wallet!.contractId, key: 'contract', copy: true },\r\n { label: 'Stellar Address', value: wallet!.stellarAddress, key: 'stellar', copy: true },\r\n { label: 'Public Key', value: wallet!.publicKey, key: 'pubkey', copy: true },\r\n { label: 'Created', value: new Date(wallet!.createdAt).toLocaleDateString(), key: 'created' },\r\n ];\r\n\r\n return (\r\n <div style={styles.fieldList}>\r\n {fields.map((f) => (\r\n <div key={f.key} style={styles.field}>\r\n <span style={styles.fieldLabel}>{f.label}</span>\r\n {f.copy ? (\r\n <button\r\n onClick={() => copyToClipboard(f.value, f.key)}\r\n style={{\r\n ...styles.copyBtn,\r\n color: copiedField === f.key ? '#34d399' : '#a5b4fc',\r\n borderColor: copiedField === f.key ? '#34d399' : '#2a2a4a',\r\n }}\r\n >\r\n {copiedField === f.key ? 'Copied!' : truncate(f.value, 8, 8)}\r\n </button>\r\n ) : (\r\n <span style={styles.fieldValue}>{f.value}</span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n function renderSecurityTab() {\r\n return (\r\n <div style={styles.securityTab}>\r\n {/* Recovery status */}\r\n <div style={styles.fieldList}>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Recovery</span>\r\n <span style={{ ...styles.fieldValue, color: '#34d399' }}>Protected</span>\r\n </div>\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Method</span>\r\n <span style={styles.fieldValue}>Google ({wallet!.email})</span>\r\n </div>\r\n {wallet!.recoverySigners && wallet!.recoverySigners.length > 0 && (\r\n <div style={styles.field}>\r\n <span style={styles.fieldLabel}>Signer</span>\r\n <span style={styles.fieldValue}>\r\n {truncate(wallet!.recoverySigners[0].publicKey)}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Rotate Keys */}\r\n {rotateError && <p style={styles.error}>{rotateError}</p>}\r\n <button\r\n onClick={handleRotateKeys}\r\n disabled={rotating}\r\n style={{\r\n ...styles.rotateBtn,\r\n opacity: rotating ? 0.5 : 1,\r\n }}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M21 2v6h-6\" />\r\n <path d=\"M3 12a9 9 0 0 1 15-6.7L21 8\" />\r\n <path d=\"M3 22v-6h6\" />\r\n <path d=\"M21 12a9 9 0 0 1-15 6.7L3 16\" />\r\n </svg>\r\n {rotating ? 'Rotating...' : 'Rotate Keys'}\r\n </button>\r\n\r\n {/* Disconnect */}\r\n <button onClick={handleDisconnect} style={styles.disconnectBtn}>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n Disconnect\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\n/** Generate a deterministic HSL color from a Stellar address */\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Styles\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\r\n backdropFilter: 'blur(4px)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 99999,\r\n padding: '1rem',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n panel: {\r\n backgroundColor: '#0f0f1e',\r\n borderRadius: '20px',\r\n border: '1px solid #2a2a4a',\r\n width: '100%',\r\n maxWidth: '420px',\r\n maxHeight: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n position: 'relative' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n padding: '1.5rem 1.5rem 1rem',\r\n background: 'linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)',\r\n },\r\n closeBtn: {\r\n position: 'absolute' as const,\r\n top: '1rem',\r\n right: '1rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#64748b',\r\n cursor: 'pointer',\r\n padding: '4px',\r\n },\r\n identicon: {\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n marginBottom: '0.5rem',\r\n },\r\n headerAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n margin: '0 0 0.25rem',\r\n },\r\n headerBalance: {\r\n fontSize: '1.75rem',\r\n fontWeight: 700,\r\n color: '#ffffff',\r\n margin: 0,\r\n },\r\n headerCurrency: {\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n color: '#8b8ba7',\r\n },\r\n tabBar: {\r\n display: 'flex',\r\n borderBottom: '1px solid #2a2a4a',\r\n padding: '0 0.5rem',\r\n },\r\n tab: {\r\n flex: 1,\r\n padding: '0.75rem 0.5rem',\r\n background: 'none',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: '#64748b',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n borderRadius: 0,\r\n },\r\n tabActive: {\r\n color: '#e2e8f0',\r\n borderBottomColor: '#667eea',\r\n },\r\n content: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n padding: '1rem 1.25rem 1.25rem',\r\n },\r\n\r\n // Wallet tab — action buttons\r\n walletTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '1rem',\r\n },\r\n actionRow: {\r\n display: 'flex',\r\n gap: '1rem',\r\n justifyContent: 'center',\r\n },\r\n actionBtn: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '1.25rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '16px',\r\n cursor: 'pointer',\r\n transition: 'border-color 0.2s',\r\n flex: 1,\r\n },\r\n actionIcon: {\r\n width: '44px',\r\n height: '44px',\r\n borderRadius: '50%',\r\n backgroundColor: 'rgba(102, 126, 234, 0.15)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: '#667eea',\r\n },\r\n actionIconReceive: {\r\n backgroundColor: 'rgba(52, 211, 153, 0.15)',\r\n color: '#34d399',\r\n },\r\n actionLabel: {\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n color: '#e2e8f0',\r\n },\r\n\r\n // Sub-views (send/receive forms)\r\n subView: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.75rem',\r\n },\r\n backBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.25rem',\r\n background: 'none',\r\n border: 'none',\r\n color: '#8b8ba7',\r\n fontSize: '0.8rem',\r\n cursor: 'pointer',\r\n padding: '0 0 0.25rem',\r\n width: 'fit-content',\r\n },\r\n formGroup: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '0.3rem',\r\n },\r\n formLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.75rem',\r\n fontWeight: 500,\r\n },\r\n formInput: {\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '8px',\r\n padding: '0.65rem 0.75rem',\r\n color: '#e2e8f0',\r\n fontSize: '0.9rem',\r\n outline: 'none',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n fontFamily: 'inherit',\r\n },\r\n primaryBtn: {\r\n backgroundColor: '#667eea',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '10px',\r\n padding: '0.75rem',\r\n fontSize: '0.95rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n width: '100%',\r\n marginTop: '0.25rem',\r\n },\r\n error: {\r\n color: '#f87171',\r\n fontSize: '0.8rem',\r\n margin: 0,\r\n padding: '0.4rem 0.6rem',\r\n backgroundColor: 'rgba(248, 113, 113, 0.1)',\r\n borderRadius: '6px',\r\n },\r\n centeredCol: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '1rem 0',\r\n },\r\n\r\n // Receive view\r\n receiveIconBig: {\r\n width: '64px',\r\n height: '64px',\r\n borderRadius: '50%',\r\n backgroundColor: 'rgba(52, 211, 153, 0.15)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n marginBottom: '0.25rem',\r\n },\r\n addressBox: {\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '8px',\r\n padding: '0.75rem',\r\n width: '100%',\r\n marginTop: '0.5rem',\r\n },\r\n addressText: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.7rem',\r\n color: '#a5b4fc',\r\n wordBreak: 'break-all' as const,\r\n lineHeight: 1.5,\r\n },\r\n\r\n // Activity tab\r\n txList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n },\r\n txRow: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.75rem',\r\n padding: '0.65rem 0',\r\n borderBottom: '1px solid #1a1a2e',\r\n },\r\n txIcon: {\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexShrink: 0,\r\n },\r\n txDetails: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n flex: 1,\r\n minWidth: 0,\r\n },\r\n txType: {\r\n color: '#e2e8f0',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n },\r\n txCounterparty: {\r\n color: '#64748b',\r\n fontSize: '0.7rem',\r\n fontFamily: 'monospace',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap' as const,\r\n },\r\n txAmountCol: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'flex-end',\r\n flexShrink: 0,\r\n },\r\n txAmount: {\r\n fontSize: '0.85rem',\r\n fontWeight: 600,\r\n },\r\n txTime: {\r\n color: '#64748b',\r\n fontSize: '0.65rem',\r\n },\r\n emptyText: {\r\n color: '#64748b',\r\n fontSize: '0.85rem',\r\n textAlign: 'center' as const,\r\n padding: '2rem 0',\r\n },\r\n\r\n // Account tab\r\n fieldList: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n },\r\n field: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: '0.6rem 0',\r\n borderBottom: '1px solid #1a1a2e',\r\n },\r\n fieldLabel: {\r\n color: '#8b8ba7',\r\n fontSize: '0.8rem',\r\n },\r\n fieldValue: {\r\n color: '#e2e8f0',\r\n fontSize: '0.8rem',\r\n fontWeight: 500,\r\n },\r\n copyBtn: {\r\n background: 'none',\r\n border: '1px solid #2a2a4a',\r\n color: '#a5b4fc',\r\n padding: '0.2rem 0.5rem',\r\n borderRadius: '4px',\r\n fontSize: '0.72rem',\r\n fontFamily: 'monospace',\r\n cursor: 'pointer',\r\n transition: 'color 0.2s, border-color 0.2s',\r\n },\r\n\r\n // Security tab\r\n securityTab: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '1rem',\r\n },\r\n rotateBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.65rem',\r\n backgroundColor: 'transparent',\r\n color: '#f59e0b',\r\n border: '1px solid rgba(245, 158, 11, 0.3)',\r\n borderRadius: '10px',\r\n fontSize: '0.85rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n },\r\n disconnectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '0.5rem',\r\n width: '100%',\r\n padding: '0.65rem',\r\n backgroundColor: 'transparent',\r\n color: '#f87171',\r\n border: '1px solid rgba(248, 113, 113, 0.2)',\r\n borderRadius: '10px',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n },\r\n};\r\n","/**\r\n * ConnectButton.tsx - SDK drop-in wallet button.\r\n *\r\n * Renders a dynamic button that:\r\n * - Shows \"Connect Wallet\" when disconnected → opens ConnectModal\r\n * - Shows a pill with address + balance when connected → opens WalletPanel\r\n * - Handles loading/creating states with spinners\r\n *\r\n * Usage:\r\n * <ConnectButton />\r\n */\r\n\r\nimport { useState } from 'react';\r\nimport { useAccesly } from '../hooks/useAccesly';\r\nimport { ConnectModal } from './ConnectModal';\r\nimport { WalletPanel } from './WalletPanel';\r\n\r\nexport function ConnectButton() {\r\n const { wallet, balance, loading, creating, connect } = useAccesly();\r\n const [showModal, setShowModal] = useState(false);\r\n const [showPanel, setShowPanel] = useState(false);\r\n\r\n // Initial auth check\r\n if (loading) {\r\n return (\r\n <div style={styles.pillLoading}>\r\n <div style={styles.spinner} />\r\n </div>\r\n );\r\n }\r\n\r\n // Not connected\r\n if (!wallet) {\r\n return (\r\n <>\r\n <button\r\n onClick={() => setShowModal(true)}\r\n style={creating ? styles.pill : styles.connectBtn}\r\n disabled={creating}\r\n >\r\n {creating ? (\r\n <>\r\n <div style={styles.spinnerSmall} />\r\n <span style={styles.pillText}>Creating wallet...</span>\r\n </>\r\n ) : (\r\n <>\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\r\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\r\n </svg>\r\n Connect Wallet\r\n </>\r\n )}\r\n </button>\r\n\r\n {showModal && (\r\n <ConnectModal\r\n onClose={() => setShowModal(false)}\r\n onConnect={async () => {\r\n setShowModal(false);\r\n await connect();\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n // Connected - show pill\r\n const addr = wallet.stellarAddress;\r\n const truncated = `${addr.slice(0, 4)}...${addr.slice(-4)}`;\r\n const balanceText = balance\r\n ? `${parseFloat(balance).toFixed(2)} XLM`\r\n : '--- XLM';\r\n const color = identiconColor(addr);\r\n\r\n return (\r\n <>\r\n <button onClick={() => setShowPanel(true)} style={styles.pill}>\r\n <div style={{ ...styles.identicon, backgroundColor: color }} />\r\n <span style={styles.pillAddr}>{truncated}</span>\r\n <span style={styles.divider} />\r\n <span style={styles.pillBalance}>{balanceText}</span>\r\n </button>\r\n\r\n {showPanel && <WalletPanel onClose={() => setShowPanel(false)} />}\r\n </>\r\n );\r\n}\r\n\r\n/** Generate a deterministic HSL color from a Stellar address */\r\nfunction identiconColor(address: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < address.length; i++) {\r\n hash = address.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n return `hsl(${Math.abs(hash) % 360}, 65%, 55%)`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Inline styles (zero CSS dependencies)\r\n// ---------------------------------------------------------------------------\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n connectBtn: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.6rem',\r\n padding: '0.85rem 1.75rem',\r\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\r\n color: '#fff',\r\n border: 'none',\r\n borderRadius: '12px',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'transform 0.15s, box-shadow 0.15s',\r\n boxShadow: '0 4px 15px rgba(102, 126, 234, 0.4)',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pill: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '0.5rem 0.85rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n cursor: 'pointer',\r\n transition: 'border-color 0.2s, box-shadow 0.2s',\r\n color: '#e2e8f0',\r\n fontSize: '0.85rem',\r\n fontWeight: 500,\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n pillLoading: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0.5rem 1.5rem',\r\n backgroundColor: '#1a1a2e',\r\n border: '1px solid #2a2a4a',\r\n borderRadius: '50px',\r\n height: '42px',\r\n },\r\n identicon: {\r\n width: '24px',\r\n height: '24px',\r\n borderRadius: '50%',\r\n flexShrink: 0,\r\n },\r\n pillAddr: {\r\n fontFamily: 'monospace',\r\n fontSize: '0.8rem',\r\n color: '#e2e8f0',\r\n },\r\n divider: {\r\n width: '1px',\r\n height: '16px',\r\n backgroundColor: '#3a3a5a',\r\n },\r\n pillBalance: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n fontWeight: 500,\r\n },\r\n pillText: {\r\n fontSize: '0.8rem',\r\n color: '#8b8ba7',\r\n },\r\n spinner: {\r\n width: '20px',\r\n height: '20px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n },\r\n spinnerSmall: {\r\n width: '16px',\r\n height: '16px',\r\n border: '2px solid #2a2a4a',\r\n borderTop: '2px solid #667eea',\r\n borderRadius: '50%',\r\n animation: 'accesly-spin 1s linear infinite',\r\n flexShrink: 0,\r\n },\r\n};\r\n","/**\r\n * Accesly SDK - Account abstraction wallet for Stellar.\r\n *\r\n * Quick start:\r\n *\r\n * import { AcceslyProvider, ConnectButton } from 'accesly';\r\n *\r\n * function App() {\r\n * return (\r\n * <AcceslyProvider appId=\"acc_xxxxx\">\r\n * <ConnectButton />\r\n * </AcceslyProvider>\r\n * );\r\n * }\r\n *\r\n * For custom UI, use the useAccesly hook:\r\n *\r\n * import { useAccesly } from 'accesly';\r\n *\r\n * function MyWallet() {\r\n * const { wallet, balance, connect, disconnect, sendPayment } = useAccesly();\r\n * // Build your own UI\r\n * }\r\n */\r\n\r\n// --- CSS keyframes injection ---\r\n// Since the SDK uses inline styles, we inject required keyframes once\r\nif (typeof document !== 'undefined') {\r\n const STYLE_ID = 'accesly-keyframes';\r\n if (!document.getElementById(STYLE_ID)) {\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes accesly-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n\r\n// --- Components ---\r\nexport { AcceslyProvider } from './AcceslyProvider';\r\nexport { ConnectButton } from './components/ConnectButton';\r\n\r\n// --- Hooks ---\r\nexport { useAccesly } from './hooks/useAccesly';\r\n\r\n// --- Types ---\r\nexport type {\r\n AcceslyConfig,\r\n WalletInfo,\r\n TransactionRecord,\r\n SendPaymentParams,\r\n AcceslyContextType,\r\n} from './types';\r\n"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import {createContext,useMemo,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var O="accesly_auth",ce="https://accesly.vercel.app",U=class{constructor(e,r){this.appId=e,this.baseUrl=r||ce;}setTokens(e){localStorage.setItem(O,JSON.stringify(e));}getTokens(){let e=localStorage.getItem(O);if(!e)return null;try{return JSON.parse(e)}catch{return null}}clearTokens(){localStorage.removeItem(O);}hasSession(){return this.getTokens()!==null}async request(e,r={},o=true){let d=this.getTokens(),h={"Content-Type":"application/json","x-accesly-key":this.appId,...d?{Authorization:`Bearer ${d.accessToken}`}:{}},i=await fetch(`${this.baseUrl}${e}`,{...r,headers:{...h,...r.headers}});if(i.status===401&&o&&d?.refreshToken){if(await this.refreshToken(d.refreshToken))return this.request(e,r,false);throw this.clearTokens(),new Error("Session expired. Please reconnect.")}if(!i.ok){let m=await i.json().catch(()=>({}));throw new Error(m.error||m.details||`Request failed: ${i.status}`)}return i.json()}async refreshToken(e){try{let r=await fetch(`${this.baseUrl}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(!r.ok)return !1;let o=await r.json(),d=this.getTokens();return d&&this.setTokens({...d,accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt}),!0}catch{return false}}async getWalletInfo(){return this.request("/api/wallet/info")}async createWallet(){return this.request("/api/wallet/create",{method:"POST"})}async getBalance(){return this.request("/api/wallet/balance")}async sendPayment(e){return this.request("/api/wallet/send",{method:"POST",body:JSON.stringify(e)})}async getTransactions(e=20){return this.request(`/api/wallet/transactions?limit=${e}`)}async rotateKeys(){return this.request("/api/wallet/rotate",{method:"POST"})}};function X(a,e){return new Promise((r,o)=>{let d=window.screenX+(window.innerWidth-450)/2,h=window.screenY+(window.innerHeight-600)/2,i=window.open(`${a}/auth/popup?appId=${e}`,"accesly-auth",`width=450,height=600,left=${d},top=${h},toolbar=no,menubar=no`);if(!i){o(new Error("Failed to open popup. Please allow popups for this site."));return}function m(u){u.origin.includes(new URL(a).host)&&(u.data?.type==="accesly-auth-success"&&(p(),r(u.data.payload)),u.data?.type==="accesly-auth-error"&&(p(),o(new Error(u.data.error||"Authentication failed"))));}let b=setInterval(()=>{i.closed&&(p(),o(new Error("Authentication cancelled")));},500);function p(){window.removeEventListener("message",m),clearInterval(b);}window.addEventListener("message",m);})}var _=createContext(null),ue="https://accesly.vercel.app";function ye({children:a,...e}){let r=e.baseUrl||ue,o=useMemo(()=>new U(e.appId,r),[e.appId,r]),[d,h]=useState(null),[i,m]=useState(null),[b,p]=useState(true),[u,C]=useState(false),[P,v]=useState(null);useEffect(()=>{o.hasSession()?S():p(false);},[o]),useEffect(()=>{if(!d)return;T();let l=setInterval(T,15e3);return ()=>clearInterval(l)},[d]);async function S(){v(null);try{let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){if(l.message?.includes("404")||l.message?.includes("not found")){await L();return}l.message?.includes("Session expired")&&(o.clearTokens(),h(null)),v(l.message);}finally{p(false);}}async function L(){C(true),v(null);try{await o.createWallet();let l=await o.getWalletInfo();h(l.wallet),e.onConnect?.(l.wallet);}catch(l){v(l.message);}finally{C(false),p(false);}}async function T(){try{let A=(await o.getBalance()).balances.find(D=>D.asset==="native");m(A?.balance||"0");}catch{}}let M=useCallback(async()=>{v(null);try{let l=await X(r,e.appId);o.setTokens(l),p(!0),await S();}catch(l){l.message!=="Authentication cancelled"&&v(l.message);}},[r,e.appId,o]),E=useCallback(()=>{o.clearTokens(),h(null),m(null),v(null),e.onDisconnect?.();},[o,e.onDisconnect]),F=useCallback(async l=>o.sendPayment(l),[o]),$=useCallback(async()=>{await T();},[o]),G=useCallback(async()=>{await S();},[o]),q={loading:b,creating:u,wallet:d,balance:i,error:P,connect:M,disconnect:E,sendPayment:F,refreshBalance:$,refreshWallet:G};return jsx(_.Provider,{value:q,children:a})}function R(){let a=useContext(_);if(!a)throw new Error('useAccesly must be used within an <AcceslyProvider>. Wrap your app with <AcceslyProvider appId="acc_xxxxx">.');return a}function K({onClose:a,onConnect:e}){return jsx("div",{style:w.overlay,onClick:a,children:jsxs("div",{style:w.modal,onClick:r=>r.stopPropagation(),children:[jsx("button",{onClick:a,style:w.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:w.iconWrapper,children:jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"#667eea",strokeWidth:"1.5",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]})}),jsx("h2",{style:w.title,children:"Connect to Accesly"}),jsx("p",{style:w.subtitle,children:"Choose how you want to connect"}),jsxs("button",{onClick:e,style:w.googleBtn,children:[jsxs("svg",{style:w.googleIcon,viewBox:"0 0 24 24",children:[jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]}),"Continue with Google"]}),jsx("p",{style:w.footer,children:"Powered by Accesly"})]})})}var w={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},modal:{position:"relative",backgroundColor:"#141428",borderRadius:"20px",border:"1px solid #2a2a4a",padding:"2rem",width:"100%",maxWidth:"380px",textAlign:"center"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},iconWrapper:{width:"56px",height:"56px",borderRadius:"16px",backgroundColor:"rgba(102, 126, 234, 0.1)",border:"1px solid rgba(102, 126, 234, 0.2)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 1rem"},title:{fontSize:"1.3rem",fontWeight:700,color:"#e2e8f0",margin:"0 0 0.25rem"},subtitle:{color:"#64748b",fontSize:"0.85rem",margin:"0 0 1.5rem"},googleBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.75rem",padding:"0.85rem 1.5rem",backgroundColor:"#1a1a2e",color:"#e2e8f0",border:"1px solid #2a2a4a",borderRadius:"12px",fontSize:"0.95rem",fontWeight:500,cursor:"pointer",width:"100%",marginBottom:"1.25rem"},googleIcon:{width:"20px",height:"20px",flexShrink:0},footer:{color:"#475569",fontSize:"0.7rem",margin:0}};function Y({onClose:a}){let{wallet:e,balance:r,disconnect:o,sendPayment:d,refreshBalance:h}=R(),[i,m]=useState("wallet"),[b,p]=useState(""),[u,C]=useState(""),[P,v]=useState(""),[S,L]=useState(false),[T,M]=useState(null),[E,F]=useState(null),[$,G]=useState([]),[q,l]=useState(false),[A,D]=useState(null);if(useEffect(()=>{i==="activity"&&$.length===0&&Z();},[i]),!e)return null;async function Z(){l(true);try{let s=await fetch("/api/wallet/transactions?limit=20");}catch{}finally{l(false);}}async function ee(){if(!(!b||!u)){L(true),F(null);try{let s=await d({destination:b,amount:u,memo:P||void 0});M(s.txHash),h();}catch(s){F(s.message);}finally{L(false);}}}function V(s,y=6,N=6){return s.length<=y+N+3?s:`${s.slice(0,y)}...${s.slice(-N)}`}async function j(s,y){await navigator.clipboard.writeText(s),D(y),setTimeout(()=>D(null),1500);}function te(){o(),a();}let ne=r?parseFloat(r).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"---",oe=he(e.stellarAddress),re=[{key:"wallet",label:"Wallet"},{key:"activity",label:"Activity"},{key:"account",label:"Account"},{key:"security",label:"Security"}];return jsx("div",{style:t.overlay,onClick:a,children:jsxs("div",{style:t.panel,onClick:s=>s.stopPropagation(),children:[jsxs("div",{style:t.header,children:[jsx("button",{onClick:a,style:t.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:{...t.identicon,backgroundColor:oe}}),jsx("p",{style:t.headerAddr,children:V(e.stellarAddress,8,8)}),jsxs("p",{style:t.headerBalance,children:[ne," ",jsx("span",{style:t.headerCurrency,children:"XLM"})]})]}),jsx("div",{style:t.tabBar,children:re.map(s=>jsx("button",{onClick:()=>m(s.key),style:{...t.tab,...i===s.key?t.tabActive:{}},children:s.label},s.key))}),jsxs("div",{style:t.content,children:[i==="wallet"&&ae(),i==="activity"&&se(),i==="account"&&le(),i==="security"&&ie()]})]})});function ae(){return T?jsxs("div",{style:t.centeredCol,children:[jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:[jsx("circle",{cx:"12",cy:"12",r:"10"}),jsx("polyline",{points:"8 12 11 15 16 9"})]}),jsx("p",{style:{color:"#34d399",fontWeight:600,margin:"0.5rem 0"},children:"Payment Sent"}),jsxs("p",{style:{color:"#64748b",fontSize:"0.75rem",fontFamily:"monospace"},children:[T.slice(0,12),"...",T.slice(-12)]}),jsx("button",{onClick:()=>{M(null),p(""),C(""),v("");},style:t.primaryBtn,children:"Done"})]}):jsxs("div",{style:t.walletTab,children:[jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Destination"}),jsx("input",{type:"text",placeholder:"G...",value:b,onChange:s=>p(s.target.value),maxLength:56,style:t.formInput})]}),jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Amount (XLM)"}),jsx("input",{type:"number",placeholder:"0.00",value:u,onChange:s=>C(s.target.value),min:"0.0000001",step:"any",style:t.formInput})]}),jsxs("div",{style:t.formGroup,children:[jsx("label",{style:t.formLabel,children:"Memo (optional)"}),jsx("input",{type:"text",placeholder:"What is this for?",value:P,onChange:s=>v(s.target.value),maxLength:28,style:t.formInput})]}),E&&jsx("p",{style:t.error,children:E}),jsx("button",{onClick:ee,disabled:S||!b||!u,style:{...t.primaryBtn,opacity:S||!b||!u?.5:1},children:S?"Sending...":"Send Payment"}),jsx("button",{onClick:()=>j(e.stellarAddress,"receive"),style:t.receiveBtn,children:A==="receive"?"Address Copied!":"Copy Address to Receive"})]})}function se(){return jsx("p",{style:t.emptyText,children:"Transaction history coming soon."})}function le(){let s=[{label:"Email",value:e.email,key:"email"},{label:"Contract ID",value:e.contractId,key:"contract",copy:true},{label:"Stellar Address",value:e.stellarAddress,key:"stellar",copy:true},{label:"Public Key",value:e.publicKey,key:"pubkey",copy:true},{label:"Created",value:new Date(e.createdAt).toLocaleDateString(),key:"created"}];return jsx("div",{style:t.fieldList,children:s.map(y=>jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:y.label}),y.copy?jsx("button",{onClick:()=>j(y.value,y.key),style:{...t.copyBtn,color:A===y.key?"#34d399":"#a5b4fc",borderColor:A===y.key?"#34d399":"#2a2a4a"},children:A===y.key?"Copied!":V(y.value,8,8)}):jsx("span",{style:t.fieldValue,children:y.value})]},y.key))})}function ie(){return jsxs("div",{style:t.securityTab,children:[jsxs("div",{style:t.fieldList,children:[jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:"Recovery"}),jsx("span",{style:{...t.fieldValue,color:"#34d399"},children:"Protected"})]}),jsxs("div",{style:t.field,children:[jsx("span",{style:t.fieldLabel,children:"Method"}),jsxs("span",{style:t.fieldValue,children:["Google (",e.email,")"]})]})]}),jsxs("button",{onClick:te,style:t.disconnectBtn,children:[jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),jsx("polyline",{points:"16 17 21 12 16 7"}),jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}),"Disconnect"]})]})}}function he(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var t={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},panel:{backgroundColor:"#0f0f1e",borderRadius:"20px",border:"1px solid #2a2a4a",width:"100%",maxWidth:"420px",maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden"},header:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",padding:"1.5rem 1.5rem 1rem",background:"linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},identicon:{width:"48px",height:"48px",borderRadius:"50%",marginBottom:"0.5rem"},headerAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#8b8ba7",margin:"0 0 0.25rem"},headerBalance:{fontSize:"1.75rem",fontWeight:700,color:"#ffffff",margin:0},headerCurrency:{fontSize:"0.85rem",fontWeight:500,color:"#8b8ba7"},tabBar:{display:"flex",borderBottom:"1px solid #2a2a4a",padding:"0 0.5rem"},tab:{flex:1,padding:"0.75rem 0.5rem",background:"none",border:"none",borderBottom:"2px solid transparent",color:"#64748b",fontSize:"0.8rem",fontWeight:500,cursor:"pointer",transition:"color 0.2s, border-color 0.2s",borderRadius:0},tabActive:{color:"#e2e8f0",borderBottomColor:"#667eea"},content:{flex:1,overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},walletTab:{display:"flex",flexDirection:"column",gap:"0.75rem"},formGroup:{display:"flex",flexDirection:"column",gap:"0.3rem"},formLabel:{color:"#8b8ba7",fontSize:"0.75rem",fontWeight:500},formInput:{backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"8px",padding:"0.65rem 0.75rem",color:"#e2e8f0",fontSize:"0.9rem",outline:"none",width:"100%",boxSizing:"border-box",fontFamily:"inherit"},primaryBtn:{backgroundColor:"#667eea",color:"#fff",border:"none",borderRadius:"10px",padding:"0.75rem",fontSize:"0.95rem",fontWeight:600,cursor:"pointer",width:"100%",marginTop:"0.25rem"},receiveBtn:{backgroundColor:"transparent",color:"#a5b4fc",border:"1.5px solid #4a4a7a",borderRadius:"10px",padding:"0.65rem",fontSize:"0.85rem",fontWeight:600,cursor:"pointer",width:"100%"},error:{color:"#f87171",fontSize:"0.8rem",margin:0,padding:"0.4rem 0.6rem",backgroundColor:"rgba(248, 113, 113, 0.1)",borderRadius:"6px"},centeredCol:{display:"flex",flexDirection:"column",alignItems:"center",gap:"0.5rem",padding:"1rem 0"},fieldList:{display:"flex",flexDirection:"column"},field:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"0.6rem 0",borderBottom:"1px solid #1a1a2e"},fieldLabel:{color:"#8b8ba7",fontSize:"0.8rem"},fieldValue:{color:"#e2e8f0",fontSize:"0.8rem",fontWeight:500},copyBtn:{background:"none",border:"1px solid #2a2a4a",color:"#a5b4fc",padding:"0.2rem 0.5rem",borderRadius:"4px",fontSize:"0.72rem",fontFamily:"monospace",cursor:"pointer",transition:"color 0.2s, border-color 0.2s"},securityTab:{display:"flex",flexDirection:"column",gap:"1rem"},disconnectBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",width:"100%",padding:"0.65rem",backgroundColor:"transparent",color:"#f87171",border:"1px solid rgba(248, 113, 113, 0.2)",borderRadius:"10px",fontSize:"0.85rem",fontWeight:500,cursor:"pointer"},emptyText:{color:"#64748b",fontSize:"0.85rem",textAlign:"center",padding:"2rem 0"}};function be(){let{wallet:a,balance:e,loading:r,creating:o,connect:d}=R(),[h,i]=useState(false),[m,b]=useState(false);if(r)return jsx("div",{style:x.pillLoading,children:jsx("div",{style:x.spinner})});if(!a)return jsxs(Fragment,{children:[jsx("button",{onClick:()=>i(true),style:o?x.pill:x.connectBtn,disabled:o,children:o?jsxs(Fragment,{children:[jsx("div",{style:x.spinnerSmall}),jsx("span",{style:x.pillText,children:"Creating wallet..."})]}):jsxs(Fragment,{children:[jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]}),"Connect Wallet"]})}),h&&jsx(K,{onClose:()=>i(false),onConnect:async()=>{i(false),await d();}})]});let p=a.stellarAddress,u=`${p.slice(0,4)}...${p.slice(-4)}`,C=e?`${parseFloat(e).toFixed(2)} XLM`:"--- XLM",P=xe(p);return jsxs(Fragment,{children:[jsxs("button",{onClick:()=>b(true),style:x.pill,children:[jsx("div",{style:{...x.identicon,backgroundColor:P}}),jsx("span",{style:x.pillAddr,children:u}),jsx("span",{style:x.divider}),jsx("span",{style:x.pillBalance,children:C})]}),m&&jsx(Y,{onClose:()=>b(false)})]})}function xe(a){let e=0;for(let r=0;r<a.length;r++)e=a.charCodeAt(r)+((e<<5)-e);return `hsl(${Math.abs(e)%360}, 65%, 55%)`}var x={connectBtn:{display:"flex",alignItems:"center",gap:"0.6rem",padding:"0.85rem 1.75rem",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"#fff",border:"none",borderRadius:"12px",fontSize:"1rem",fontWeight:600,cursor:"pointer",transition:"transform 0.15s, box-shadow 0.15s",boxShadow:"0 4px 15px rgba(102, 126, 234, 0.4)",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pill:{display:"flex",alignItems:"center",gap:"0.5rem",padding:"0.5rem 0.85rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",cursor:"pointer",transition:"border-color 0.2s, box-shadow 0.2s",color:"#e2e8f0",fontSize:"0.85rem",fontWeight:500,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pillLoading:{display:"flex",alignItems:"center",justifyContent:"center",padding:"0.5rem 1.5rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",height:"42px"},identicon:{width:"24px",height:"24px",borderRadius:"50%",flexShrink:0},pillAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#e2e8f0"},divider:{width:"1px",height:"16px",backgroundColor:"#3a3a5a"},pillBalance:{fontSize:"0.8rem",color:"#8b8ba7",fontWeight:500},pillText:{fontSize:"0.8rem",color:"#8b8ba7"},spinner:{width:"20px",height:"20px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite"},spinnerSmall:{width:"16px",height:"16px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite",flexShrink:0}};if(typeof document<"u"){let a="accesly-keyframes";if(!document.getElementById(a)){let e=document.createElement("style");e.id=a,e.textContent=`
1
+ import {createContext,useMemo,useState,useEffect,useCallback,useContext}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var X="accesly_auth",Ce="https://accesly.vercel.app",I=class extends Error{constructor(n,i){super(n),this.name="AcceslyApiError",this.status=i;}},G=class{constructor(n,i){this.appId=n,this.baseUrl=i||Ce;}setTokens(n){localStorage.setItem(X,JSON.stringify(n));}getTokens(){let n=localStorage.getItem(X);if(!n)return null;try{return JSON.parse(n)}catch{return null}}clearTokens(){localStorage.removeItem(X);}hasSession(){return this.getTokens()!==null}async request(n,i={},a=true){let p=this.getTokens(),b={"Content-Type":"application/json","x-accesly-key":this.appId,...p?{Authorization:`Bearer ${p.accessToken}`}:{}},u=await fetch(`${this.baseUrl}${n}`,{...i,headers:{...b,...i.headers}});if(u.status===401&&a&&p?.refreshToken){if(await this.refreshToken(p.refreshToken))return this.request(n,i,false);throw this.clearTokens(),new Error("Session expired. Please reconnect.")}if(!u.ok){let f=await u.json().catch(()=>({}));throw new I(f.error||f.details||`Request failed: ${u.status}`,u.status)}return u.json()}async refreshToken(n){try{let i=await fetch(`${this.baseUrl}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:n})});if(!i.ok)return !1;let a=await i.json(),p=this.getTokens();return p&&this.setTokens({...p,accessToken:a.accessToken,refreshToken:a.refreshToken,expiresAt:a.expiresAt}),!0}catch{return false}}async getWalletInfo(){return this.request("/api/wallet/info")}async createWallet(){return this.request("/api/wallet/create",{method:"POST"})}async getBalance(){return this.request("/api/wallet/balance")}async sendPayment(n){return this.request("/api/wallet/send",{method:"POST",body:JSON.stringify(n)})}async getTransactions(n=20){return this.request(`/api/wallet/transactions?limit=${n}`)}async rotateKeys(){return this.request("/api/wallet/rotate",{method:"POST"})}};function re(l,n){return new Promise((i,a)=>{let p=window.screenX+(window.innerWidth-450)/2,b=window.screenY+(window.innerHeight-600)/2,u=window.open(`${l}/auth/popup?appId=${n}`,"accesly-auth",`width=450,height=600,left=${p},top=${b},toolbar=no,menubar=no`);if(!u){a(new Error("Failed to open popup. Please allow popups for this site."));return}function f(x){x.origin.includes(new URL(l).host)&&(x.data?.type==="accesly-auth-success"&&(d(),i(x.data.payload)),x.data?.type==="accesly-auth-error"&&(d(),a(new Error(x.data.error||"Authentication failed"))));}let C=setInterval(()=>{u.closed&&(d(),a(new Error("Authentication cancelled")));},500);function d(){window.removeEventListener("message",f),clearInterval(C);}window.addEventListener("message",f);})}var J=createContext(null),Ae="https://accesly.vercel.app";function Be({children:l,...n}){let i=n.baseUrl||Ae,a=useMemo(()=>new G(n.appId,i),[n.appId,i]),[p,b]=useState(null),[u,f]=useState(null),[C,d]=useState(true),[x,S]=useState(false),[w,m]=useState(null);useEffect(()=>{a.hasSession()?B():d(false);},[a]),useEffect(()=>{if(!p)return;P();let s=setInterval(P,15e3);return ()=>clearInterval(s)},[p]);async function B(){m(null);try{let s=await a.getWalletInfo();b(s.wallet),n.onConnect?.(s.wallet);}catch(s){if(s instanceof I&&s.status===404){await T();return}s instanceof I&&s.status===401&&(a.clearTokens(),b(null)),m(s.message);}finally{d(false);}}async function T(){S(true),m(null);try{await a.createWallet();let s=await a.getWalletInfo();b(s.wallet),n.onConnect?.(s.wallet);}catch(s){m(s.message);}finally{S(false),d(false);}}async function P(){try{let O=(await a.getBalance()).balances.find(K=>K.asset==="native");f(O?.balance||"0");}catch{}}let E=useCallback(async()=>{m(null);try{let s=await re(i,n.appId);a.setTokens(s),d(!0),await B();}catch(s){s.message!=="Authentication cancelled"&&m(s.message);}},[i,n.appId,a]),U=useCallback(()=>{a.clearTokens(),b(null),f(null),m(null),n.onDisconnect?.();},[a,n.onDisconnect]),R=useCallback(async s=>a.sendPayment(s),[a]),$=useCallback(async()=>a.rotateKeys(),[a]),L=useCallback(async(s=20)=>(await a.getTransactions(s)).transactions,[a]),H=useCallback(async()=>{await P();},[a]),V=useCallback(async()=>{await B();},[a]),z={loading:C,creating:x,wallet:p,balance:u,error:w,connect:E,disconnect:U,sendPayment:R,rotateKeys:$,getTransactions:L,refreshBalance:H,refreshWallet:V};return jsx(J.Provider,{value:z,children:l})}function D(){let l=useContext(J);if(!l)throw new Error('useAccesly must be used within an <AcceslyProvider>. Wrap your app with <AcceslyProvider appId="acc_xxxxx">.');return l}function ie({onClose:l,onConnect:n}){return jsx("div",{style:k.overlay,onClick:l,children:jsxs("div",{style:k.modal,onClick:i=>i.stopPropagation(),children:[jsx("button",{onClick:l,style:k.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:k.iconWrapper,children:jsxs("svg",{width:"28",height:"28",viewBox:"0 0 24 24",fill:"none",stroke:"#667eea",strokeWidth:"1.5",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]})}),jsx("h2",{style:k.title,children:"Connect to Accesly"}),jsx("p",{style:k.subtitle,children:"Choose how you want to connect"}),jsxs("button",{onClick:n,style:k.googleBtn,children:[jsxs("svg",{style:k.googleIcon,viewBox:"0 0 24 24",children:[jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]}),"Continue with Google"]}),jsx("p",{style:k.footer,children:"Powered by Accesly"})]})})}var k={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},modal:{position:"relative",backgroundColor:"#141428",borderRadius:"20px",border:"1px solid #2a2a4a",padding:"2rem",width:"100%",maxWidth:"380px",textAlign:"center"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},iconWrapper:{width:"56px",height:"56px",borderRadius:"16px",backgroundColor:"rgba(102, 126, 234, 0.1)",border:"1px solid rgba(102, 126, 234, 0.2)",display:"flex",alignItems:"center",justifyContent:"center",margin:"0 auto 1rem"},title:{fontSize:"1.3rem",fontWeight:700,color:"#e2e8f0",margin:"0 0 0.25rem"},subtitle:{color:"#64748b",fontSize:"0.85rem",margin:"0 0 1.5rem"},googleBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.75rem",padding:"0.85rem 1.5rem",backgroundColor:"#1a1a2e",color:"#e2e8f0",border:"1px solid #2a2a4a",borderRadius:"12px",fontSize:"0.95rem",fontWeight:500,cursor:"pointer",width:"100%",marginBottom:"1.25rem"},googleIcon:{width:"20px",height:"20px",flexShrink:0},footer:{color:"#475569",fontSize:"0.7rem",margin:0}};function le({onClose:l}){let{wallet:n,balance:i,disconnect:a,sendPayment:p,rotateKeys:b,getTransactions:u,refreshBalance:f,refreshWallet:C}=D(),[d,x]=useState("wallet"),[S,w]=useState("main"),[m,B]=useState(""),[T,P]=useState(""),[E,U]=useState(""),[R,$]=useState(false),[L,H]=useState(null),[V,z]=useState(null),[s,O]=useState([]),[K,Y]=useState(false),[N,Q]=useState(false),[Z,ee]=useState(null),[_,te]=useState(null);if(useEffect(()=>{d==="activity"&&s.length===0&&de();},[d]),!n)return null;async function de(){Y(true);try{let o=await u(20);O(o);}catch{}finally{Y(false);}}async function pe(){if(!(!m||!T)){$(true),z(null);try{let o=await p({destination:m,amount:T,memo:E||void 0});H(o.txHash),f();}catch(o){z(o.message);}finally{$(false);}}}function ue(){H(null),B(""),P(""),U(""),z(null),w("main");}async function ye(){if(confirm("This will generate a new keypair and update your contract. Continue?")){Q(true),ee(null);try{await b(),await C();}catch(o){ee(o.message);}finally{Q(false);}}}function fe(){a(),l();}function j(o,c=6,oe=6){return o.length<=c+oe+3?o:`${o.slice(0,c)}...${o.slice(-oe)}`}async function ne(o,c){await navigator.clipboard.writeText(o),te(c),setTimeout(()=>te(null),1500);}function me(o){let c=Math.floor((Date.now()-new Date(o).getTime())/1e3);return c<60?"just now":c<3600?`${Math.floor(c/60)}m ago`:c<86400?`${Math.floor(c/3600)}h ago`:c<172800?"yesterday":`${Math.floor(c/86400)}d ago`}let ge=i?parseFloat(i).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}):"---",he=Re(n.stellarAddress),be=[{key:"wallet",label:"Wallet"},{key:"activity",label:"Activity"},{key:"account",label:"Account"},{key:"security",label:"Security"}];return jsx("div",{style:e.overlay,onClick:l,children:jsxs("div",{style:e.panel,onClick:o=>o.stopPropagation(),children:[jsxs("div",{style:e.header,children:[jsx("button",{onClick:l,style:e.closeBtn,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}),jsx("div",{style:{...e.identicon,backgroundColor:he}}),jsx("p",{style:e.headerAddr,children:j(n.stellarAddress,8,8)}),jsxs("p",{style:e.headerBalance,children:[ge," ",jsx("span",{style:e.headerCurrency,children:"XLM"})]})]}),jsx("div",{style:e.tabBar,children:be.map(o=>jsx("button",{onClick:()=>{x(o.key),w("main");},style:{...e.tab,...d===o.key?e.tabActive:{}},children:o.label},o.key))}),jsxs("div",{style:e.content,children:[d==="wallet"&&xe(),d==="activity"&&ve(),d==="account"&&we(),d==="security"&&ke()]})]})});function xe(){return L?jsxs("div",{style:e.centeredCol,children:[jsxs("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:[jsx("circle",{cx:"12",cy:"12",r:"10"}),jsx("polyline",{points:"8 12 11 15 16 9"})]}),jsx("p",{style:{color:"#34d399",fontWeight:600,margin:"0.5rem 0"},children:"Payment Sent"}),jsxs("p",{style:{color:"#64748b",fontSize:"0.75rem",fontFamily:"monospace"},children:[L.slice(0,12),"...",L.slice(-12)]}),jsx("button",{onClick:ue,style:e.primaryBtn,children:"Done"})]}):S==="send"?jsxs("div",{style:e.subView,children:[jsxs("button",{onClick:()=>w("main"),style:e.backBtn,children:[jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsx("polyline",{points:"15 18 9 12 15 6"})}),"Back"]}),jsxs("div",{style:e.formGroup,children:[jsx("label",{style:e.formLabel,children:"Destination"}),jsx("input",{type:"text",placeholder:"G...",value:m,onChange:o=>B(o.target.value),maxLength:56,style:e.formInput})]}),jsxs("div",{style:e.formGroup,children:[jsx("label",{style:e.formLabel,children:"Amount (XLM)"}),jsx("input",{type:"number",placeholder:"0.00",value:T,onChange:o=>P(o.target.value),min:"0.0000001",step:"any",style:e.formInput})]}),jsxs("div",{style:e.formGroup,children:[jsx("label",{style:e.formLabel,children:"Memo (optional)"}),jsx("input",{type:"text",placeholder:"What is this for?",value:E,onChange:o=>U(o.target.value),maxLength:28,style:e.formInput})]}),V&&jsx("p",{style:e.error,children:V}),jsx("button",{onClick:pe,disabled:R||!m||!T,style:{...e.primaryBtn,opacity:R||!m||!T?.5:1},children:R?"Sending...":"Send Payment"})]}):S==="receive"?jsxs("div",{style:e.subView,children:[jsxs("button",{onClick:()=>w("main"),style:e.backBtn,children:[jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:jsx("polyline",{points:"15 18 9 12 15 6"})}),"Back"]}),jsxs("div",{style:e.centeredCol,children:[jsx("div",{style:e.receiveIconBig,children:jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"#34d399",strokeWidth:"2",children:[jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),jsx("polyline",{points:"19 12 12 19 5 12"})]})}),jsx("p",{style:{color:"#e2e8f0",fontWeight:600,fontSize:"1rem",margin:0},children:"Receive XLM"}),jsx("p",{style:{color:"#64748b",fontSize:"0.8rem",margin:0,textAlign:"center"},children:"Share your Stellar address to receive payments"}),jsx("div",{style:e.addressBox,children:jsx("span",{style:e.addressText,children:n.stellarAddress})}),jsx("button",{onClick:()=>ne(n.stellarAddress,"receive"),style:e.primaryBtn,children:_==="receive"?"Copied!":"Copy Address"})]})]}):jsx("div",{style:e.walletTab,children:jsxs("div",{style:e.actionRow,children:[jsxs("button",{onClick:()=>w("send"),style:e.actionBtn,children:[jsx("div",{style:e.actionIcon,children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[jsx("line",{x1:"12",y1:"19",x2:"12",y2:"5"}),jsx("polyline",{points:"5 12 12 5 19 12"})]})}),jsx("span",{style:e.actionLabel,children:"Send"})]}),jsxs("button",{onClick:()=>w("receive"),style:e.actionBtn,children:[jsx("div",{style:{...e.actionIcon,...e.actionIconReceive},children:jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),jsx("polyline",{points:"19 12 12 19 5 12"})]})}),jsx("span",{style:e.actionLabel,children:"Receive"})]})]})})}function ve(){return K&&s.length===0?jsx("p",{style:e.emptyText,children:"Loading transactions..."}):s.length===0?jsx("p",{style:e.emptyText,children:"No transactions yet"}):jsx("div",{style:e.txList,children:s.map(o=>jsxs("div",{style:e.txRow,children:[jsx("div",{style:{...e.txIcon,backgroundColor:o.type==="received"?"rgba(52, 211, 153, 0.15)":"rgba(248, 113, 113, 0.15)"},children:jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:o.type==="received"?"#34d399":"#f87171",strokeWidth:"2.5",children:o.type==="received"?jsxs(Fragment,{children:[jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),jsx("polyline",{points:"19 12 12 19 5 12"})]}):jsxs(Fragment,{children:[jsx("line",{x1:"12",y1:"19",x2:"12",y2:"5"}),jsx("polyline",{points:"5 12 12 5 19 12"})]})})}),jsxs("div",{style:e.txDetails,children:[jsx("span",{style:e.txType,children:o.type==="received"?"Received":"Sent"}),jsxs("span",{style:e.txCounterparty,children:[o.type==="received"?"from ":"to ",j(o.counterparty)]})]}),jsxs("div",{style:e.txAmountCol,children:[jsxs("span",{style:{...e.txAmount,color:o.type==="received"?"#34d399":"#f87171"},children:[o.type==="received"?"+":"-",parseFloat(o.amount).toLocaleString("en-US",{maximumFractionDigits:2})," ",o.asset]}),jsx("span",{style:e.txTime,children:me(o.createdAt)})]})]},o.id))})}function we(){let o=[{label:"Email",value:n.email,key:"email"},{label:"Contract ID",value:n.contractId,key:"contract",copy:true},{label:"Stellar Address",value:n.stellarAddress,key:"stellar",copy:true},{label:"Public Key",value:n.publicKey,key:"pubkey",copy:true},{label:"Created",value:new Date(n.createdAt).toLocaleDateString(),key:"created"}];return jsx("div",{style:e.fieldList,children:o.map(c=>jsxs("div",{style:e.field,children:[jsx("span",{style:e.fieldLabel,children:c.label}),c.copy?jsx("button",{onClick:()=>ne(c.value,c.key),style:{...e.copyBtn,color:_===c.key?"#34d399":"#a5b4fc",borderColor:_===c.key?"#34d399":"#2a2a4a"},children:_===c.key?"Copied!":j(c.value,8,8)}):jsx("span",{style:e.fieldValue,children:c.value})]},c.key))})}function ke(){return jsxs("div",{style:e.securityTab,children:[jsxs("div",{style:e.fieldList,children:[jsxs("div",{style:e.field,children:[jsx("span",{style:e.fieldLabel,children:"Recovery"}),jsx("span",{style:{...e.fieldValue,color:"#34d399"},children:"Protected"})]}),jsxs("div",{style:e.field,children:[jsx("span",{style:e.fieldLabel,children:"Method"}),jsxs("span",{style:e.fieldValue,children:["Google (",n.email,")"]})]}),n.recoverySigners&&n.recoverySigners.length>0&&jsxs("div",{style:e.field,children:[jsx("span",{style:e.fieldLabel,children:"Signer"}),jsx("span",{style:e.fieldValue,children:j(n.recoverySigners[0].publicKey)})]})]}),Z&&jsx("p",{style:e.error,children:Z}),jsxs("button",{onClick:ye,disabled:N,style:{...e.rotateBtn,opacity:N?.5:1},children:[jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M21 2v6h-6"}),jsx("path",{d:"M3 12a9 9 0 0 1 15-6.7L21 8"}),jsx("path",{d:"M3 22v-6h6"}),jsx("path",{d:"M21 12a9 9 0 0 1-15 6.7L3 16"})]}),N?"Rotating...":"Rotate Keys"]}),jsxs("button",{onClick:fe,style:e.disconnectBtn,children:[jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),jsx("polyline",{points:"16 17 21 12 16 7"}),jsx("line",{x1:"21",y1:"12",x2:"9",y2:"12"})]}),"Disconnect"]})]})}}function Re(l){let n=0;for(let i=0;i<l.length;i++)n=l.charCodeAt(i)+((n<<5)-n);return `hsl(${Math.abs(n)%360}, 65%, 55%)`}var e={overlay:{position:"fixed",inset:0,backgroundColor:"rgba(0, 0, 0, 0.6)",backdropFilter:"blur(4px)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:99999,padding:"1rem",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},panel:{backgroundColor:"#0f0f1e",borderRadius:"20px",border:"1px solid #2a2a4a",width:"100%",maxWidth:"420px",maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden"},header:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",padding:"1.5rem 1.5rem 1rem",background:"linear-gradient(180deg, #1a1a3a 0%, #0f0f1e 100%)"},closeBtn:{position:"absolute",top:"1rem",right:"1rem",background:"none",border:"none",color:"#64748b",cursor:"pointer",padding:"4px"},identicon:{width:"48px",height:"48px",borderRadius:"50%",marginBottom:"0.5rem"},headerAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#8b8ba7",margin:"0 0 0.25rem"},headerBalance:{fontSize:"1.75rem",fontWeight:700,color:"#ffffff",margin:0},headerCurrency:{fontSize:"0.85rem",fontWeight:500,color:"#8b8ba7"},tabBar:{display:"flex",borderBottom:"1px solid #2a2a4a",padding:"0 0.5rem"},tab:{flex:1,padding:"0.75rem 0.5rem",background:"none",border:"none",borderBottom:"2px solid transparent",color:"#64748b",fontSize:"0.8rem",fontWeight:500,cursor:"pointer",transition:"color 0.2s, border-color 0.2s",borderRadius:0},tabActive:{color:"#e2e8f0",borderBottomColor:"#667eea"},content:{flex:1,overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},walletTab:{display:"flex",flexDirection:"column",gap:"1rem"},actionRow:{display:"flex",gap:"1rem",justifyContent:"center"},actionBtn:{display:"flex",flexDirection:"column",alignItems:"center",gap:"0.5rem",padding:"1.25rem 1.5rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"16px",cursor:"pointer",transition:"border-color 0.2s",flex:1},actionIcon:{width:"44px",height:"44px",borderRadius:"50%",backgroundColor:"rgba(102, 126, 234, 0.15)",display:"flex",alignItems:"center",justifyContent:"center",color:"#667eea"},actionIconReceive:{backgroundColor:"rgba(52, 211, 153, 0.15)",color:"#34d399"},actionLabel:{fontSize:"0.85rem",fontWeight:500,color:"#e2e8f0"},subView:{display:"flex",flexDirection:"column",gap:"0.75rem"},backBtn:{display:"flex",alignItems:"center",gap:"0.25rem",background:"none",border:"none",color:"#8b8ba7",fontSize:"0.8rem",cursor:"pointer",padding:"0 0 0.25rem",width:"fit-content"},formGroup:{display:"flex",flexDirection:"column",gap:"0.3rem"},formLabel:{color:"#8b8ba7",fontSize:"0.75rem",fontWeight:500},formInput:{backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"8px",padding:"0.65rem 0.75rem",color:"#e2e8f0",fontSize:"0.9rem",outline:"none",width:"100%",boxSizing:"border-box",fontFamily:"inherit"},primaryBtn:{backgroundColor:"#667eea",color:"#fff",border:"none",borderRadius:"10px",padding:"0.75rem",fontSize:"0.95rem",fontWeight:600,cursor:"pointer",width:"100%",marginTop:"0.25rem"},error:{color:"#f87171",fontSize:"0.8rem",margin:0,padding:"0.4rem 0.6rem",backgroundColor:"rgba(248, 113, 113, 0.1)",borderRadius:"6px"},centeredCol:{display:"flex",flexDirection:"column",alignItems:"center",gap:"0.5rem",padding:"1rem 0"},receiveIconBig:{width:"64px",height:"64px",borderRadius:"50%",backgroundColor:"rgba(52, 211, 153, 0.15)",display:"flex",alignItems:"center",justifyContent:"center",marginBottom:"0.25rem"},addressBox:{backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"8px",padding:"0.75rem",width:"100%",marginTop:"0.5rem"},addressText:{fontFamily:"monospace",fontSize:"0.7rem",color:"#a5b4fc",wordBreak:"break-all",lineHeight:1.5},txList:{display:"flex",flexDirection:"column"},txRow:{display:"flex",alignItems:"center",gap:"0.75rem",padding:"0.65rem 0",borderBottom:"1px solid #1a1a2e"},txIcon:{width:"36px",height:"36px",borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},txDetails:{display:"flex",flexDirection:"column",flex:1,minWidth:0},txType:{color:"#e2e8f0",fontSize:"0.85rem",fontWeight:500},txCounterparty:{color:"#64748b",fontSize:"0.7rem",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},txAmountCol:{display:"flex",flexDirection:"column",alignItems:"flex-end",flexShrink:0},txAmount:{fontSize:"0.85rem",fontWeight:600},txTime:{color:"#64748b",fontSize:"0.65rem"},emptyText:{color:"#64748b",fontSize:"0.85rem",textAlign:"center",padding:"2rem 0"},fieldList:{display:"flex",flexDirection:"column"},field:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"0.6rem 0",borderBottom:"1px solid #1a1a2e"},fieldLabel:{color:"#8b8ba7",fontSize:"0.8rem"},fieldValue:{color:"#e2e8f0",fontSize:"0.8rem",fontWeight:500},copyBtn:{background:"none",border:"1px solid #2a2a4a",color:"#a5b4fc",padding:"0.2rem 0.5rem",borderRadius:"4px",fontSize:"0.72rem",fontFamily:"monospace",cursor:"pointer",transition:"color 0.2s, border-color 0.2s"},securityTab:{display:"flex",flexDirection:"column",gap:"1rem"},rotateBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",width:"100%",padding:"0.65rem",backgroundColor:"transparent",color:"#f59e0b",border:"1px solid rgba(245, 158, 11, 0.3)",borderRadius:"10px",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},disconnectBtn:{display:"flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",width:"100%",padding:"0.65rem",backgroundColor:"transparent",color:"#f87171",border:"1px solid rgba(248, 113, 113, 0.2)",borderRadius:"10px",fontSize:"0.85rem",fontWeight:500,cursor:"pointer"}};function Le(){let{wallet:l,balance:n,loading:i,creating:a,connect:p}=D(),[b,u]=useState(false),[f,C]=useState(false);if(i)return jsx("div",{style:v.pillLoading,children:jsx("div",{style:v.spinner})});if(!l)return jsxs(Fragment,{children:[jsx("button",{onClick:()=>u(true),style:a?v.pill:v.connectBtn,disabled:a,children:a?jsxs(Fragment,{children:[jsx("div",{style:v.spinnerSmall}),jsx("span",{style:v.pillText,children:"Creating wallet..."})]}):jsxs(Fragment,{children:[jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[jsx("path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5"}),jsx("path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"})]}),"Connect Wallet"]})}),b&&jsx(ie,{onClose:()=>u(false),onConnect:async()=>{u(false),await p();}})]});let d=l.stellarAddress,x=`${d.slice(0,4)}...${d.slice(-4)}`,S=n?`${parseFloat(n).toFixed(2)} XLM`:"--- XLM",w=ze(d);return jsxs(Fragment,{children:[jsxs("button",{onClick:()=>C(true),style:v.pill,children:[jsx("div",{style:{...v.identicon,backgroundColor:w}}),jsx("span",{style:v.pillAddr,children:x}),jsx("span",{style:v.divider}),jsx("span",{style:v.pillBalance,children:S})]}),f&&jsx(le,{onClose:()=>C(false)})]})}function ze(l){let n=0;for(let i=0;i<l.length;i++)n=l.charCodeAt(i)+((n<<5)-n);return `hsl(${Math.abs(n)%360}, 65%, 55%)`}var v={connectBtn:{display:"flex",alignItems:"center",gap:"0.6rem",padding:"0.85rem 1.75rem",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"#fff",border:"none",borderRadius:"12px",fontSize:"1rem",fontWeight:600,cursor:"pointer",transition:"transform 0.15s, box-shadow 0.15s",boxShadow:"0 4px 15px rgba(102, 126, 234, 0.4)",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pill:{display:"flex",alignItems:"center",gap:"0.5rem",padding:"0.5rem 0.85rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",cursor:"pointer",transition:"border-color 0.2s, box-shadow 0.2s",color:"#e2e8f0",fontSize:"0.85rem",fontWeight:500,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},pillLoading:{display:"flex",alignItems:"center",justifyContent:"center",padding:"0.5rem 1.5rem",backgroundColor:"#1a1a2e",border:"1px solid #2a2a4a",borderRadius:"50px",height:"42px"},identicon:{width:"24px",height:"24px",borderRadius:"50%",flexShrink:0},pillAddr:{fontFamily:"monospace",fontSize:"0.8rem",color:"#e2e8f0"},divider:{width:"1px",height:"16px",backgroundColor:"#3a3a5a"},pillBalance:{fontSize:"0.8rem",color:"#8b8ba7",fontWeight:500},pillText:{fontSize:"0.8rem",color:"#8b8ba7"},spinner:{width:"20px",height:"20px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite"},spinnerSmall:{width:"16px",height:"16px",border:"2px solid #2a2a4a",borderTop:"2px solid #667eea",borderRadius:"50%",animation:"accesly-spin 1s linear infinite",flexShrink:0}};if(typeof document<"u"){let l="accesly-keyframes";if(!document.getElementById(l)){let n=document.createElement("style");n.id=l,n.textContent=`
2
2
  @keyframes accesly-spin {
3
3
  to { transform: rotate(360deg); }
4
4
  }
5
- `,document.head.appendChild(e);}}export{ye as AcceslyProvider,be as ConnectButton,R as useAccesly};//# sourceMappingURL=index.mjs.map
5
+ `,document.head.appendChild(n);}}export{Be as AcceslyProvider,Le as ConnectButton,D as useAccesly};//# sourceMappingURL=index.mjs.map
6
6
  //# sourceMappingURL=index.mjs.map